解决阿里钉钉获取用户信息失败问题

  • A+
所属分类:Java
摘要

参考官方文档(https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.MdR92c&treeId=367&articleId=106818&docType=1) 解决阿里钉钉获取用户信息失败问题。

注意点:
1)官方开发参考文档:https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.MdR92c&treeId=367&articleId=106818&docType=1
2)下文中的access_token 全部为企业的全局token,建议缓存起来,官方默认2小时有效

1、钉钉官方工作台(链接:https://oa.dingtalk.com/index.htm#/microApp/microAppList)添加对应的应用,并添加该应用的首页地址

解决阿里钉钉获取用户信息失败问题

2、通过接口获取js_ticket,access_token

1)获取access_token接口

  1. https://oapi..com/gettoken?corpid=&corpsecret=

2)获取ticket (js_ticket):

  1. https://oapi.dingtalk.com/get_jsapi_ticket?access_token=

3、后台对把参数做签名操作,签名包含js_ticket,nonceStr, timeStamp , url ,其中nonceStr写死为jr-os-dd-nonce , timeStamp为当前服务器的时间单位秒时间缀。

官方的签名例子:

  1. public static String getJsApiSingnature(String url,String nonce,Long timeStamp,String jsTicket) throws DingTalkEncryptException{
  2.         String plainTex = "jsapi_ticket=" + jsTicket +"&noncestr=" + nonce +"&timestamp=" + timeStamp + "&url=" + url;
  3.         System.out.println(plainTex);
  4.         String  = "";
  5.         try{
  6.             MessageDigest crypt = MessageDigest.getInstance("SHA-1");
  7.             crypt.reset();
  8.             crypt.update(plainTex.getBytes("UTF-8"));
  9.             signature = byteToHex(crypt.digest());
  10.             return signature;
  11.         }catch (Exception e){
  12.             throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);
  13.         }
  14.     }

4、将:‘url’,‘nonceStr’,‘agentId’,‘timeStamp’,‘corpId’,‘signature’传递到前端页面。

  1. {
  2.     " jsticket""xxx",
  3.     "signature""xxx",
  4.     "nonceStr""xxx",
  5.     "timeStamp""xxx",
  6.     "corpId""xxx"//
  7.     "agentid""" // 企业自建应用,agentId可以不传
  8. }

5、前端引用JSAPi :https://g.alicdn.com/ilw/ding/0.7.3/scripts/dingtalk.js,然后对jsapi提供的dd.config接口进行签名校验。【注意:jsAPI的使用需要先进行dd.config注册然后再在dd.ready里面调用jsAPI】

  1. <script type="text/"
  2.         src="//g.alicdn.com/ilw/ding/0.7.3/scripts/dingtalk.js"></script>
  3.             document.getElementById("loading").innerText = "检测到钉钉" + dd.version + ",正在自动登录中...";
  4.         // 服务端传来的congfig信息
  5.         dd.config({
  6.             agentId : 'xxx',
  7.             corpId : 'xxxx',
  8.             timeStamp : xxx,
  9.             nonceStr : 'xxx',
  10.             signature : 'xxxx',
  11.             jsApiList : [ // 所有需要使用到的jsApi需要在config的时候进行注册,写在这里。
  12.             'runtime.info, runtime.permission.requestAuthCode' ]
  13.         });

6、使用钉钉js-api提供的获取免登授权码接口获取CODE(注:授权码,5分钟有效,且只能使用一次)

  1. dd.ready(function() {
  2.             dd.runtime.permission.requestAuthCode({
  3.                 corpId : 'xxx',
  4.                 onSuccess : function(result) {
  5.                     //code: 'hYLK98jkf0m' //string authCode
  6.                     location.href = "/login-dingtalk?code=" + result.code + "&redirectUri=${redirectUri}";
  7.                 },
  8.                 onFail : function(err) {
  9.                     '钉钉授权失败: ' + JSON.stringify(err)
  10.                 }
  11.             });
  12.         });
  13.         dd.error(function(err) {
  14.             alert('钉钉错误: ' + JSON.stringify(err));
  15.         })

7、使用CODE通过接口获取用户的userid。

  1. https://oapi.dingtalk.com/user/getuserinfo?access_token=ACCESS_TOKEN&amp;code=CODE

8、使用接口获取用户的详细信息

  1. https://oapi.dingtalk.com/user/get?access_token=ACCESS_TOKEN&userid=zhangsan

至此按照上面的步骤就能正确的获取到钉钉用户的详细信息

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: