说明:需要获得点击该链接的用户信息,因此需要使用钉钉跳转协议在钉钉当前页面打开,通过免登码的方式来获取用户信息,直接使用http协议跳转浏览器的方式无法拿到免登码,因此需要对http://standard-action-robot-dt-daily.ingress.dayu.work/call?method=POST&api=/robot/stopIteration¶ms={“projectId”:“69”,“iterationId”:“128”,“conversationId”:“cidhipuXrhPi1Ud8CHlt05V4Q==”,“actionItemIds”:"",“flag”:“Y”}
进行包装 -->
“免登”是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。
地址一:dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=http://standard-action-robot-dt-daily.ingress.dayu.work/call?method=POST&api=/robot/stopIteration¶ms={“projectId”:“69”,“iterationId”:“128”,“conversationId”:“cidhipuXrhPi1Ud8CHlt05V4Q==”,“actionItemIds”:"",“flag”:“Y”}
这里对dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=做一下参数说明:
跳转到H5页面
link(侧边栏/容器划出)
参数 | 说明 |
---|---|
url | 页面URL,必须做urlencode。(对url进行转义) |
dd_mode | iOS端使用。 push:iOS从左向右推入一个容器 present:iOS从下向上弹出一个容器 |
pc_slide | pc_slide=true 时,PC 端会在应用内打开这个 URL。 |
钉钉发送的消息链接地址如果直接发送_地址一,是无法正常工作的.当你使用了钉钉统一跳转协议,http://standard-action-robot-dt-daily.ingress.dayu.work/call?method=POST&api=/robot/stopIteration¶ms={“projectId”:“69”,“iterationId”:“128”,“conversationId”:“cidhipuXrhPi1Ud8CHlt05V4Q==”,“actionItemIds”:"",“flag”:“Y”}这一部分将作为“钉钉统一跳转协议”地址的入参,所以需要经过urlEncode
于是我们对http地址进行转义后得到:
http%3A%2F%2Fstandard-action-robot-dt-daily.ingress.dayu.work%2Fcall%3Fmethod%3DPOST%26api%3D%2Frobot%2FstopIteration%26params%3D%7B%22projectId%22%3A%2269%22%2C%22iterationId%22%3A%22128%22%2C%22conversationId%22%3A%22cidhipuXrhPi1Ud8CHlt05V4Q%3D%3D%22%2C%22actionItemIds%22%3A%22%22%2C%22flag%22%3A%22Y%22%7D
这个时候完整的地址链接是:dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=http%3A%2F%2Fstandard-action-robot-dt-daily.ingress.dayu.work%2Fcall%3Fmethod%3DPOST%26api%3D%2Frobot%2FstopIteration%26params%3D%7B%22projectId%22%3A%2269%22%2C%22iterationId%22%3A%22128%22%2C%22conversationId%22%3A%22cidhipuXrhPi1Ud8CHlt05V4Q%3D%3D%22%2C%22actionItemIds%22%3A%22%22%2C%22flag%22%3A%22Y%22%7D(地址二)
这个时候我们惊奇地发现PC端点击链接一切正常,移动端安卓系统也正常,但是移动端苹果系统报错了,排查发现,params={“projectId”:“69”,“iterationId”:“128”,“conversationId”:“cidhipuXrhPi1Ud8CHlt05V4Q==”,“actionItemIds”:"",“flag”:“Y”}
的参数是空的,也就是说params的参数丢失了,后端接口肯定就报错了.
解决方案:由于不同系统自带的浏览器内核不同,因此需要先对{“projectId”:“69”,“iterationId”:“128”,“conversationId”:“cidhipuXrhPi1Ud8CHlt05V4Q==”,“actionItemIds”:"",“flag”:“Y”}进行转义,然后再对整个http链接进行转义.
最终地址为_:dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=http%3A%2F%2Fstandard-action-robot-dt-daily.ingress.dayu.work%2Fcall%3Fmethod%3DPOST%26api%3D%2Frobot%2FstopIteration%26params%3D%257B%2522projectId%2522%253A%252269%2522%252C%2522iterationId%2522%253A%2522128%2522%252C%2522conversationId%2522%253A%2522cidhipuXrhPi1Ud8CHlt05V4Q%253D%253D%2522%252C%2522actionItemIds%2522%253A%2522%2522%252C%2522flag%2522%253A%2522Y%2522%257D
对于一些钉钉业务、安全相关的JSAPI的调用,需要先鉴权,然后再调用.
比如在获取免登码时需要进行JSAPI鉴权,这个时候需要后端生成签名发给钉钉,然后前端根据签名生成规则去生成签名并和后端发给钉钉的签名进行比对.
项目上遇到了前后端生成的签名值不一致的问题.
**签名值生成参数: public static **String sign(String jsticket, String nonceStr, **long **timeStamp, String url);
jsticket -->根据钉钉开放平台开发者后台微应用的应用凭证AppKey和AppSecret去生成.
noceStr -->随机字符串
timeStamp -->时间戳
url --> 调用的链接地址
排查发现签名值不一致的原因是服务器的jsticket为null.
报错如下:
ERROR topsdk - 2021-02-25 15:56:42.113^_^_dingtalk_^_^dingtalk.oapi.get_jsapi_ticket^_^192.168.56.1^_^Windows 10^_^304^_^https://oapi.dingtalk.com/get_jsapi_ticket^_^access_token=5ce212b978ac305aa5478fc608b80369^_^{"errcode":60020,"errmsg":"请参考FAQ:https://open-doc.dingtalk.com/microapp/faquestions/cvbtph。错误原因:访问ip不在白名单之中,request ip=120.198.22.22 appKey\u0028dinggzw3c804duwtgvot\u0029"}
解决方案:把120.198.22.22添加到服务器出口IP中即可.如果本地开发测试时ip会变则要特别留意这个错误
这里很坑,用户主动@机器人时是在机器人这里接收消息的.
也就是说机器人是被动地接收消息.H5微应用才可以配置权限主动地发消息.
解决方案:用户艾特机器人发送的消息在机器人中配置接收地址,需要群里定时发消息时使用H5微应用并配置权限.
报错如下:
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.4.RELEASE:repackage (repackage) on project standard-action-robot-infrastructure: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.4.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.iwhalecloud.commons.util.TaskUtils, com.iwhalecloud.robot.utils.HttpClientUtil] -> [Help 1]
解决方案:maven打包的插件代码应该放在启动类的pom.xml文件下,不能放在其他地方
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
//这段代码应该放在启动类下
数据库里保存的markdown的title字符串为:
@atInfo@按照标准动作要求,请完成模型的设计工作,并点击更新下面的状态 [1.已完成](dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=#trueUrl#) [2.未完成](dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=#falseUrl#)
效果如下:
@atInfo@按照标准动作要求,请完成模型的设计工作,并点击更新下面的状态 1.已完成 2.未完成
这个格式太丑了,需要对该消息进行换行,并对字体进行加粗.
但是直接在字符串中加上\n,\n,甚至是百度网上说的亲测可用的\n\n也还是不行,换行符直接被转义了没有起到效果.
解决方案1:在\n前面加上两个空格在postman调用发送消息可以换行成功.
解决方案2:字符串消息手动换行好
<font color=#ffffff style="font-weight: bold;background-color:#0099ff" >@atInfo@</font>
<font color=#000000 style="font-weight: bold;" >按照标准动作要求,请完成接口API的设计工作,并点击更新下面的状态</font>
[<font color=#0099ff style="font-weight: bold;" >1.已完成</font>](dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=#trueUrl#)
[<font color=#0099ff style="font-weight: bold;" >2.未完成</font>](dingtalk://dingtalkclient/page/link?dd_mode=push&pc_slide=true&url=#falseUrl#)