最近在做一个钉钉第三方项目的时候,需要获取用户手机号,可能是自己经验不够,踩了很多坑,在此把钉钉第三方获取手机号的流程梳理一下,希望可以提供一下参考,以后少走弯路
1.钉钉应用类型
钉钉应用类型相比大家都知道,分为企业内部应用,企业第三方应用,个人第三方应用。其中只有第三方应用是可以通过应用分发或者上架广场来给其他组织使用的。
2. 获取用户手机号
钉钉获取手机号,分为两种情况,一种是获取企业内部员工的手机号,一种是获取第三方组织用户的手机号。
- 内部企业应用获取用户手机号
内部企业比较简单,只要有应用信息按照流程就可以拿到用户的手机号
- 第三方应用获取用户手机号
这里其实我认为也是有分内部企业和第三方企业
前端获取code
后端根据应用的key,secret,suiteTicket(内部企业时的suiteTicket是自己定制填写的)请求换取accessToken
https://oapi.dingtalk.com/service/get_corp_token
后端根据code换取用用户信息,这里的用户信息只是简略的一下用户标识之类的
https://oapi.dingtalk.com/topapi/v2/user/getuserinfo
后端根据accessToken和userid换取用户详细信息
https://oapi.dingtalk.com/topapi/v2/user/get
如果是内部企业的话,这里其实就结束了,拿到的信息就已经有用户的手机号。但如果应用分发的组织,或者广场上下载的第三方企业,其实用户详情是没有手机号的,这时候就得走个人流程来换取用户信息
前端调用钉钉统一授权套件,拿到authCode,这个authCode和之前code是不同的,我刚开始的时候没理解,直接拿的原来的code,就一直报无效的临时授权码
后端通过authcode,key,secret 指定 grantType为authorization_code,拿到个人的token
https://api.dingtalk.com/v1.0/oauth2/userAccessToken
在通过个人的token换取用户信息,此时才拿到用户的手机号
https://api.dingtalk.com/v1.0/contact/users/{unionId}
总结来说就是,内部企业时是可以通过走企业流程来换取用户的手机号,但是第三方时要通过个人获取信息的流程来拿到手机号,这是两个不同的流程,需要区分一下。还有就是不知道为什么我用官方sdk,部署到线上时创建client总是会挂起,就一直卡住,后来就自己构造了请求没用官方的sdk,这可能也是一个小坑吧
以上的所有都要基于你的应用已经有个人手机号信息权限以及个人通讯录权限,不然请求时会报没有该接口权限的错误