钉钉小程序获取用户信息
1、钉钉小程序只允许开发办公类的程序,不能开发娱乐型的程序。
2、钉钉小程序审核需要产品说明书,最大大小不能超过30M(文档)。
3、貌似可以用IP,暂时没有看到有关https的限制。
(业务提供商(SP),独立软件供应商(ISV)、系统集成商(SI)、互联网服务提供商(ISP) )
4、分为三类开发:应用服务商(isp)、行业服务商、定制服务商
应用服务商:为上亿钉钉用户提供应用和服务,开发微应用并上架到钉钉应用市场,供企业用户选用
行业服务商:为钉钉上237个行业的企业/组织提供成熟的解决方案,在钉钉上部署并推广适合于该行业的微应用
定制服务商:承接钉钉500万企业的定制需求,根据企业的个性化业务场景提供定制开发和系统集成服务
然后,我们行业属于应用服务商,获取不到用户的手机号。
https://www.cnblogs.com/applerosa/p/9025789.html
参数
|
说明
|
errcode
|
返回码
|
errmsg
|
对返回码的文本描述内容
|
userid
|
员工唯一标识ID(不可修改)
|
openid
|
在本 服务窗运营服务商 范围内,唯一标识关注者身份的id(不可修改)
|
name
|
成员名称
|
tel
|
分机号(仅限企业内部开发调用)
|
workPlace
|
办公地点(ISV不可见)
|
remark
|
备注(ISV不可见)
|
mobile
|
手机号码(ISV不可见)
|
email
|
员工的电子邮箱(ISV不可见)
|
orgEmail
|
员工的企业邮箱,如果员工已经开通了企业邮箱,接口会返回,否则不会返回(ISV不可见)
|
active
|
是否已经激活,
true:表示已激活
false:表示未激活
|
orderInDepts
|
在对应的部门中的排序,Map结构的json字符串,key是部门的Id,value是人员在这个部门的排序值
|
isAdmin
|
是否为企业的管理员,
true:表示是
false:表示不是
|
isBoss
|
是否为企业的老板,true表示是,false表示不是(
【设置负责人】:主管理员登陆钉钉手机客户端 -【通讯录】-【企业名后面的管理】-【企业通讯录】-【负责人设置】进行添加即可。 ) |
unionid
|
在当前isv全局范围内唯一标识一个用户的身份,用户无法修改
|
isLeaderInDepts
|
在对应的部门中是否为主管:Map结构的json字符串,key是部门的Id,value是人员在这个部门中是否为主管,
true:表示是
false:表示不是
|
isHide
|
是否号码隐藏,
true:表示隐藏,
false:表示不隐藏
|
department
|
成员所属部门id列表
|
position
|
职位信息
|
avatar
|
头像url
|
hiredDate
|
入职时间
|
jobnumber
|
员工工号
|
extattr
|
扩展属性,可以设置多种属性
(但手机上最多只能显示10个扩展属性,
具体显示哪些属性,请到OA管理后台->设置->通讯录信息设置和OA管理后台->设置->手机端显示信息设置)
|
roles
|
角色信息(ISV不可见),json数组格式
|
roles.id
|
角色id(ISV不可见)
|
stateCode
|
手机号码区号
|
isSenior
|
是否是高管
|
roles.name
|
角色名称(ISV不可见)
|
roles.groupName
|
角色分组名称(ISV不可见)
|
beta:被理解为测试的意思。(beta阶段)
sdk:软件开发工具包
dll:动态链接库
然后看看我作为isv是如何获取用户的信息的:
1、首先我们在前端调用dd.getAuthCode接口,获取authCode,这是免登接口。
2、服务器装钉钉推荐的sdk,该sdk包含了两个计算api签名功能和快捷调用各种服务api功能。
3、计算api签名。(获取signature)
把timestamp+”\n”+suiteTicket当做签名字符串,suiteSecret做为签名秘钥,使用HmacSHA256算法计算签名,然后进行Base64 encode获取最后结果。然后把签名参数再进行urlconde,加到请求url后面。
hmac(哈希运算)
String stringToSign = timestamp+"\n"+suiteTicket Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(suiteSecret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); return new String(Base64.encodeBase64(signData));
进行Base64 encode获取最后结果
// encoding参数使用utf-8 public static String urlEncode(String value, String encoding) { if (value == null) { return ""; } try { String encoded = URLEncoder.encode(value, encoding); return encoded.replace("+", "%20").replace("*", "%2A") .replace("~", "%7E").replace("/", "%2F"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("FailedToEncodeUri", e); } }
4、访问服务端api /service/get_corp_token,这个api可以获取corpid(企业唯一标示码)。
https://oapi.dingtalk.com/service/get_corp_token?signature=kKlP1QmmXXX×tamp=1527130370219&suiteTicket=xxx&accessKey=suitezmpdnvsw4xxxxx
需要上传的数据:
accessKey | ISV应用的suiteKey |
timestamp | 当前时间戳,单位是毫秒 |
suiteTicket | 钉钉给E应用推送的ticket,测试应用随意填写如:TestSuiteTicket,正式应用需要从回调地址获取suiteTicket |
signature | 以timestamp+”\n”+suiteTicket为签名字符串,suiteSecret为签名秘钥,使用算法HmacSHA256计算的签名值。签名计算说明 |
返回授权方corpid。
5、再就是获取access_token,sdk请求实例如下(java)。
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token"); OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest(); req.setAuthCorpid("dingc365fcabbf733c3535c2f4657eb6378f"); OapiServiceGetCorpTokenResponse execute = client.execute(req,"suiteKey","suiteSecret", "suiteTicket");
需要传入的是corpid(授权方corpid),suiteKey(应用的id),suiteSecret(签名秘钥),suiteTicket(钉钉推送的ticket,测试应用可以随便填写)
(没开发过java后台,纯属个人理解,有些理解可能是错的,后期可能会改,但大致思路是这样的。)
6、获取userid。
上传:access_token,code
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo"); OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest(); request.setCode("BzmP5AL3tYoZ8f3aKJP"); request.setHttpMethod("GET"); OapiUserGetuserinfoResponse response = client.execute(request,accessToken);
7、服务端通过userid获取用户信息
上传:access_token,userid,
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get"); OapiUserGetRequest request = new OapiUserGetRequest(); request.setUserid("zhangsan"); request.setHttpMethod("GET"); OapiUserGetResponse response = client.execute(request, accessToken);
8、最后isv需要做的事,ISV(应用服务商)开发者:
- 首先应用服务商入驻钉钉,完成审批后,将申请人加入服务商沟通组织,在该组织内的审批应用中发起“通讯录权限申请”流程;
- 申请钉钉云,并将微应用部署到钉钉云,请参考开放平台钉钉云相关文档;
- 钉钉的安全审核人员会审核微应用在钉钉云上的部署状态,审核通过后2个工作日内,开通该微应用的通讯录接口权限。
注意:第三方企业应用的通讯录权限仅包括读取权限,不包括数据增删改的写权限。应用申请到通讯录权限后,在应用不具备通讯录权限时已经开通应用的企业,需要先解除该企业的授权,再重新授权,之后再次获取的token才具备访问通讯录的能力。