钉钉小程序开发实战:第二章,H5企业第三方应用开发讲解
H5开发应用:
H5应用开发最典型的就是第三方企业应用,我们就以第三方企业应用作为样例进行开发。
步骤一,登录钉钉开发者后台,选择"应用开发"-"第三方企业应用"-"H5微应用",点击"创建应用",开始创建第三方企业微应用。(开发者后天网址:https://oa.dingtalk.com/#/login)
填写应用基本信息。包括应用名称、应用Logo、应用类型和应用简介,其中,管理后台、PC端首页地址,如果不使用都可以先不填写。需特别注意:
1. 应用类型
应用类型分为“测试应用”和“正式应用”,选择后不能进行修改,测试应用不受服务器IP白名单限制,无法发布上架,仅供测试使用。如果选择正式应用,需要填写IP白名单。
点击下一步配置开发信息:
2. 推送类型
可以选择使用“钉钉云推送”或“HTTP推送”。
(1)钉钉云推送:
在保障数据安全的前提下,极大的简化了推送协议,减少了数据传输次数,提高了数据传输速度,提升了推送的稳定性。正式版的第三方应用都须使用钉钉云推送(注意:第三方应用在申请接口权限、上架应用市场的时候,必须使用钉钉云)。
不需要服务端加密解密,只需要确认有服务即可。
参考网址:https://ding-doc.dingtalk.com/doc#/serverapi3/hwd30h
(2)HTTP推送:
是使用回调地址推送数据的方式,开发者提供HTTP回调服务,钉钉服务器会向此回调地址推送数据,数据需要经过加解密的处理。
也就是说需要服务端写一个公网连接地址,然后把接受到的数据进行加密解密,返回正确的值,通常有两个作用,第一个是验证服务器地址的正确性用的,第二个是开通一些功能的权限用的。
参考网址:
步骤二,创建成功后,可以在应用列表查看到创建的应用。点击您创建的应用可以查看应用的详细信息,如下图所示:
点击应用信息后面的“查看详情”,可以查看应用的信息,包括创建后得到的suiteId、suiteKey和suiteSecret,还可以在此页面点击修改进行内容的调整。
注意在应用主页地址后面可以写上?corpid=$CORPID$用URL传参的方式来获取第三方企业的corpid
创建完事微应用了,就可以在前端到后端的代码了,主要是写两个方面,第一个方面是页面获取临时授权码然后到后台换取应用token的一套代码,以页面和java为例:
页面:
1.引用js,引用js调用钉钉的方法
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script>
2.钉钉的方法写在钉钉环境下可以获得换取token的免登授权码的地方,免登授权码5分钟内有效。
dd.ready(function() {
dd.runtime.permission.requestAuthCode({
corpId: _config.corpId, // 企业id
onSuccess: function (info) {
code = info.code // 通过该免登授权码可以获取用户身份
}});
});
参考网址:https://ding-doc.dingtalk.com/doc#/dev/about
3.在js页面获取url传参传递过来的corpid
var corpid = ”想尽办法活得url网址后面的corpid下面的auth_corpid会用“
4.使用前端获取的code临时码换取两个小时有效的access_token,获取之前需要导入一个阿里的sdk的包,java版本下载地址:https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02 下载完事导入项目可以直接复制使用钉钉官网样例代码了,
把官网的代码复制到本地:
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","suiteSecrect", "suiteTicket");
把里面的参数替换替换,上面的参数大部分都是创建应用的时候有的,可以找一找,然后解析返回的数据里面就有access_token了(access_token两个小时有效,如果用户量比较大可以存入数据库或者服务器缓存里面等失效了再去官网取,如果用户量比较小,也可以每次都去官网取,这个看自己)。
注意的是上面有一个计算机签名的生成,在参考网址里面也有
参考网址:https://ding-doc.dingtalk.com/doc#/serverapi3/hv357q
5.使用access_token获取用户ID
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();request.setCode(requestAuthCode);request.setHttpMethod("GET");OapiUserGetuserinfoResponse response = client.execute(request, accessToken);String userId = response.getUserid();
在返回值里面可以解析出来userid
参考网址:https://ding-doc.dingtalk.com/doc#/serverapi3/xcdh0r
6.使用用户ID还可以获取用户的详情信息
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);
通过access_token和userid可以获取用户的详细信息:比如姓名,角色等
到现在,整个免登流程就结束了,还有获取企业权限部门等等。
参考网址:https://ding-doc.dingtalk.com/doc#/serverapi2/ege851/AaRQe
然后就回到常用的h5移动端的开发模式了,在一系列的开发之后,有时候会发现需要更高级的功能,比如利用钉钉播出电话共鞥你需要这个时候就需要了jsapi鉴权功能了,说明白一点就是每一次调用这个功能的时候,都需要进行网址和签名的安全校验,符合安全机制,不允许论调用等等,注意只有H5微应用才需要做鉴权。
- 也需要引入js
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script>
- jsapi需要页面引用配置
dd.config({ agentId: ‘‘, // 必填,微应用ID corpId: ‘‘,//必填,企业ID timeStamp: ‘‘, // 必填,生成签名的时间戳 nonceStr: ‘‘, // 必填,生成签名的随机串 signature: ‘‘, // 必填,签名 type:0/1, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持 jsApiList : [ ‘runtime.info‘, ‘biz.contact.choose‘, ‘device.notification.confirm‘, ‘device.notification.alert‘, ‘device.notification.prompt‘, ‘biz.ding.post‘, ‘biz.util.openLink‘, ] // 必填,需要使用的jsapi列表,注意:不要带dd。});
参考网址:https://ding-doc.dingtalk.com/doc#/dev/uwa7vs
从上面的参数来看,agentid和signature是需要获取的,其他的我们都已经有了,nonceStr是自己随便定义一个大于6位的字符串就行
3.agentid获取的方式:
参考网址:https://ding-doc.dingtalk.com/doc#/serverapi3/fmdqvx
4.计算机签名signature获取方式,注意url是当前网页调用鉴权方法的全部网址但是不包含#后面的网址。
public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException { String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp) + "&url=" + url; try { MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); sha1.reset(); sha1.update(plain.getBytes("UTF-8")); return byteToHex(sha1.digest()); } catch (NoSuchAlgorithmException e) { throw new OApiResultException(e.getMessage()); } catch (UnsupportedEncodingException e) { throw new OApiResultException(e.getMessage()); }} // 字节数组转化成十六进制字符串 private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; }
参考网址:https://ding-doc.dingtalk.com/doc#/dev/uwa7vs
把所需要的参数都传回页面,就可以了
页面代码:
dd.config({ agentId: ‘‘, // 必填,微应用ID corpId: ‘‘,//必填,企业ID timeStamp: ‘‘, // 必填,生成签名的时间戳 nonceStr: ‘‘, // 必填,生成签名的随机串 signature: ‘‘, // 必填,签名 type:0/1, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持 jsApiList : [ ‘runtime.info‘, ‘biz.contact.choose‘, ‘device.notification.confirm‘, ‘device.notification.alert‘, ‘device.notification.prompt‘, ‘biz.ding.post‘, ‘biz.util.openLink‘, ] // 必填,需要使用的jsapi列表,注意:不要带dd。});
参考网址:https://ding-doc.dingtalk.com/doc#/dev/uwa7vs
鉴权成功以后,调用鉴权功能的方法要写在dd.ready里面
比如播出功能
参考网址:https://ding-doc.dingtalk.com/doc#/dev/afrr0d
最后补充一下开通应用授权的流程:
https://ding-doc.dingtalk.com/doc#/serverapi3/hwd30h
最后由于官网没提供调试工具,得自己找调试工具
第一种调试工具是开发版的钉钉,然后在谷歌浏览器上面输入localhost:168888可以调试
还有一种是在硬件设备上,比如手机或者平板上面安装调试工具,真是异常麻烦,作者强烈不建议H5的技术模式。。。。
如果觉得讲解的不错但是不想自己一个一个下载代码的,可以参考这个博客的网站:https://www.cnblogs.com/ZenoLiang/p/12677392.html