一、前言
哈哈,这是我的第一篇博客。
先说一下这个小功能的具体场景:
用户登录钉钉app,点击微应用,获取当前用户的信息,与H5系统的数据库的用户信息对比,如果存在该用户,则点击后直接进入H5系统的首页,否则显示“您无权限”。
补充:又加了一个小需求,就是免登成功,会给该用户发条消息
我是参考钉钉开发文档实现的这个小功能,文档地址:https://ding-doc.dingtalk.com/doc#/serverapi2/clotub
二、准备工作
需要创建一个微应用:https://open-dev.dingtalk.com
1.是在企业内部开发中创建H5微应用,不是第三方企业应用中
企业内部开发:企业内部开发是指“开发企业内部应用”供企业内部的人员使用。企业可以选择由企业内部的开发者进行开发,或者由企业授权定制服务商进行开发。
第三方企业应用:第三方企业应用开发,是指开发者以钉钉、企业之外的第三方身份,基于钉钉的开放能力开发应用,并提供给钉钉上的其他组织使用。(哈哈,这个区别我是直接copy文档中的)
2.H5工程中,创建的一个前端页面ddNoLogin.html(哈哈,这个起名有点中文式英语,因为我没有找到合适的英文单词):
该页面是用来获取免登授权码,然后把该code传递给后台接口的。
3.填写公司服务器的公网IP
可以敲命令查看该ip:curl ifconfig.me
4.微应用创建好,会生成三个参数,
agentId、appKey、appSecret
外加一个corpId(钉钉开发者平台的首页中有显示),这四个参数值是固定的,后续开发需用
5.接口权限
高级权限-企业通讯录中的接口都需要给开通
6.最后发布应用
三、功能开发
哈哈,要开始敲代码了
1.获取免登授权码code
这里调用的是钉钉JS-API中的方法,本功能调用的方法是不需要鉴权的,如果需要鉴权,则还需先dd.config。
关于功能方法是否需要鉴权,可以去查看JSAPI总览
ddNoLogin.html:
<!DOCTYPE html> <html> <head> <title>微应用登陆</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1 user-scalable=0" /> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script type="text/java script" src="http://g.alicdn.com/dingding/open-develop/1.9.0/dingtalk.js"></script> </head> <body> <div id="ddNoLogin"></div> <script type="text/java script"> dd.ready(function() { //1.获取免登授权码code dd.runtime.permission.requestAuthCode({ corpId : corpId , //企业id onSuccess : function(result) { var code = result.code; getUserInfo(code); //通过该code可以获取用户身份 }, onFail : function(err) { alert('出错了, ' + err); } }); }); function getUserInfo(code) { $.ajax({ type : "GET", url : "/xxx/noLogin?code=" + code, async : false, dataType : 'json', contentType : "application/json;charset=utf-8", success : (function(res) { if(res.code == "0000"){ window.location.href = '/#/xxxxx'; }else{ $('#ddNoLogin').html(res.msg); } }), }); } </script> </body> </html>
获取code的实现是需要用前端JS去写的
2.获取access_token
钉钉提供了开放的api后台接口,这里通过appkey和appsecret获取token,请求路径:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret
该token有效期是2个小时,有效期内重复获取,会返回相同结果,并自动续期,
故这里我的实现是:定时刷新token,每隔1小时50分钟去获取钉钉的token,并缓存到redis中(我把钉钉的相关配置都放入到application.yml中了)
DdTokenTask.java:
/** * 定时获取钉钉的token */ @Component @EnableScheduling public class DdTokenTask { @Autowired private JedisClient jedisClient; public static final long cacheTime = 1000 * 60 * 55 * 2;//1小时50分钟 @Value("${dtalk.tokenUrl}") private String tokenUrl; @Value("${dtalk.app.key}") private String appKey; @Value("${dtalk.app.secret}") private String appSecret; @Value("${dtalk.redisTokenKey}") private String tokenKey; @Value("${dtalk.taskRun}") private String taskRun; /** * 每隔1小时50分钟获取