第三方企业免登流程
根据官方文档,实现第三方企业应用免登需要:
在开发者后台完成 Stream 接口(具体参考开发者工具文档)的配置。官方为各种语言提供了 SDK,也可以参照协议自行实现。注意,如果自行实现,记得在建立连接后响应 ping 事件,不然无法在管理后台完成 Stream 模式通道验证。
ws.send(JSON.stringify({ code: 200, headers: message.headers, message: "OK", data: message.data, }))
与钉钉建立连接后需要监听事件推送(*
topic),并保存 suite_ticket
事件的数据,后续需要使用其中的 suiteTicket
字段的值。完成 Stream 接口配置后后,实现一个用于获取用户信息的后端接口,这个接口需要使用两个参数:
authCode
:在小程序端通过dd.getAuthCode
(或者使用Taro.login
也能获取)方法获取;coprId
:在小程序端使用dd.corpId
获取。
在这个接口中要实现::
- 使用
coprId
和suitTicket
调用 获取第三方应用授权企业的 accessToken 接口获取第三方企业的accessToken
; - 使用
accessToken
和authCode
调用 通过免登码获取用户信息 接口,获取用户信息。
注意,如果在开发者工具中使用 dd.getAuthCode
接口获取免登授权码 authCode
时如果出现 400-unknown 错误,可以尝试使用旧版小程序开发工具(下载后不要升级,不然无法开发钉钉小程序)。
Taro Production Build 无法在开发者工具中编译
使用 Taro(我用的是 4.0.4,3.x 版本未测试)的 Production build 编译后的代码无法在小程序开发者工具完成编译,推断的原因是 babel 编译后的 JavaScript 问题。尝试在 babel.config.js
中修改 targets
,但依旧无法修复,最后只能使用 dev build 进行发版。
使用 WebSocket 实现 Stream 请求
钉钉小程序中不支持 SSE,也不支持 Taro 中的 RequestTask
,因此如果要实现 Stream 请求,则只能通过 WebSocket
变相实现。由于 Taro 中的 WebSocket
接口并未支持钉钉小程序,因此需要直接使用钉钉小程序 SDK 中提供的 WebSocket
相关接口。要注意的是,在使用 WebSocket
时一定要注意维护 socket 连接的状态:
- 保证只有全局只有一个
WebSocket
连接,在发起新的连接前要主动断开原有的连接。官方文档说全局只会有一个并且会主动断开,但实际使用时发现会有问题); - 在连接断开后使用
dd.offSocket*
相关接口移除相关事件监听。
可能会遇到的一个问题是:新建立一个连接然后使用 dd.sendSocketMessage
发送消息,在 dd.onSocketMessage
中收到了之前的连接的消息。如果出现这种情况,可以尝试在调用 dd.connectSocket
前先调用 dd.closeSocket
和 dd.offSocket*
接口,断开连接并移除所有的事件监听器后再连接。
其他问题
- 钉钉小程序 SDK 在模拟器和真机上存在版本差异(真机上的更新,模拟器上的较旧,并且无法指定版本):比如在开发者工具中(本地、真机调试)中调用
dd.openDocument
这个接口会提示没有这个方法,但是使用在“预览”时是能够使用的。 - 使用“体验版小程序”:首先在管理后台的“版本管理与发布”处单击创建体验组织;然后前往“开发体验账号管理”页面,单击“设置体验组织”,填写名称和密码,点击确认后会新建一个企业);返回“版本管理与发布”页面,授权刚才新建的体验组织,然后在小程序中切换到该组织即可使用体验版小程序。
- 由于数据(通讯录)安全的问题,在部署第三方企业小程序时需要满足额外的要求才能上架,简单说就是:有可能需要额外的接口适配、一定需要准备独立的云服务资源(安全巢 - 在阿里云上为钉钉小程序配置一套隔离的云服务资源)。