Aurora钉钉_总结_02_开发简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aurora钉钉_总结_02_开发简介相关的知识,希望对你有一定的参考价值。
一、本节要点
1.1 开发什么?
汉得关于钉钉的开发,主要是做一个app的登陆、消息、通讯录相关的功能。在钉钉内集成咱们公司软件。
1.2 钉钉免登流程(即身份认证)
1.2.1 jsapi签名校验
在weixin2.screen页面发起ajax请求,获取jsapi签名校验需要用到的参数。然后进行jsapi签名校验
//1.获取_config(钉钉jsapi的配置信息) var configTemp; //String类型,做中转 var _config; //json类型 var user_name; //接收后台返回的user_name var ticket; //接收后台返回的ticket //执行ajax请求,去请求一个svc,通过这个svc获取到jsapi _config所需的参数 jQuery.ajax({ url: ‘${/request/@context_path}/modules/dingtalk/get_jsapi_config.svc‘, //http://bj27ek.natappfree.cc/dingtalk_hec/modules/dingtalk/get_jsapi_config.svc async:false, //必须设置为同步请求,才会按顺序执行js type: ‘POST‘, success: function(data){ //data位string类型 alert("请求成功"); var returnstr1=JSON.stringify(data); alert(returnstr1); configTemp=data; }, error: function(data){ alert("请求失败:"); var returnstr2=JSON.stringify(data); alert(returnstr2); } }); alert("钉钉configTemp:"+configTemp); _config=eval(‘(‘ + configTemp + ‘)‘); //将String转json alert("agentId:"+_config.agentId+" corpId:"+_config.corpId+" timeStamp:"+_config.timeStamp+" nonceStr:"+_config.nonceStr+" signature:"+_config.signature); console.log("agentId:"+_config.agentId+" corpId:"+_config.corpId+" timeStamp:"+_config.timeStamp+" nonceStr:"+_config.nonceStr+" signature:"+_config.signature); //2.进行jsapi验证 dd.config({ agentId : _config.agentId, corpId : _config.corpId, timeStamp : _config.timeStamp, nonceStr : _config.nonceStr, signature : _config.signature, jsApiList : [ //需要调用的借口列表 ‘runtime.info‘, ‘biz.contact.choose‘, //选择用户接口 ‘device.notification.confirm‘, ‘device.notification.alert‘, //confirm,alert,prompt都是弹出小窗口的接口 ‘device.notification.prompt‘, ‘biz.ding.post‘, ‘biz.util.openLink‘ ] }); alert("验证完了");
get_jsapi_config.svc在中执行java代码获取jsapi签名校验需要的参数
<?xml version="1.0" encoding="UTF-8"?> <a:screen xmlns:b="aurora.service" xmlns:p="uncertain.proc" xmlns:a="http://www.aurora-framework.org/application" xmlns:s="aurora.plugin.script" trace="true"> <a:init-procedure> <s:server-script><![CDATA[ importPackage(Packages.aurora.plugin.dingtalk.util); function getJsapiConfig() { println("111111"); //1.获取jsapi签名校验的参数 var resultStr = AuthHelper.getDDConfig(‘hecGroup‘, $instance(‘uncertain.ocm.IObjectRegistry‘), $ctx.getData().get(‘_instance.javax.servlet.http.HttpServletRequest‘)); println("svc:"+resultStr); //println("resp:"+$ctx.getData().get(‘_instance.javax.servlet.http.HttpServletResponse‘)); //2.将参数写入response(printWriter) AuthHelper.printWriter_print(resultStr,$ctx.getData().get(‘_instance.javax.servlet.http.HttpServletResponse‘)); } getJsapiConfig(); ]]></s:server-script> </a:init-procedure> </a:screen>
1.2.2 发送code
使用钉钉jsapi函数获取code,并通过ajax请求将code、groupName、autoLoginProc发送到后台servlet
alert("验证完了"); //2.验证成功之后执行dd.ready,去获取code dd.ready(function() { /**1.获取免登授权码 CODE * */ alert("即将获取免登授权码 CODE"); dd.runtime.permission.requestAuthCode({ corpId : _config.corpId, onSuccess : function(info) { //成功获得code值,code值在info中 alert(‘code: ‘ + info.code); /* *$.ajax的是用来使得当前js页面和后台服务器交互的方法 *参数url:是需要交互的后台服务器处理代码,userInfoServlet *参数type:指定和后台交互的方法,因为后台servlet代码中处理Get和post的doGet和doPost *data:负责传递请求参数 *其中success方法和error方法是回调函数,分别表示成功交互后和交互失败情况下处理的方法 */ $.ajax({ type : "POST", async:false, url : "http://8gm6x3.natappfree.cc/dingtalk_hec/dingtalk", data : { code : info.code, autoLoginProc : "weixin.sys.login", groupName : "hecGroup" }, success : function(data) { alert("code发送成功:"+data); var userInfo=eval(‘(‘ + data + ‘)‘); //将String转json user_name=userInfo.user_name; ticket = userInfo.ticket; //执行登录 weixinLogin(); }, error : function(data) { alert("code发送失败:"+data); } }); }, onFail : function(err) { //获得code值失败 alert(‘fail: ‘ + JSON.stringify(err)); } }); });
获取code
dd.runtime.permission.requestAuthCode({ corpId : _config.corpId, onSuccess : function(info) { //成功获得code值,code值在info中 alert(‘code: ‘ + info.code); }, onFail : function(err) { //获得code值失败 alert(‘fail: ‘ + JSON.stringify(err)); } });
发送code到DingTalkServlet
$.ajax({ type : "POST", async:false, url : "http://8gm6x3.natappfree.cc/dingtalk_hec/dingtalk", data : { code : info.code, autoLoginProc : "weixin.sys.login", groupName : "hecGroup" }, success : function(data) { alert("code发送成功:"+data); var userInfo=eval(‘(‘ + data + ‘)‘); //将String转json user_name=userInfo.user_name; ticket = userInfo.ticket; //执行登录 weixinLogin(); }, error : function(data) { alert("code发送失败:"+data); } });
1.2.3 返回userName、tickt
后台servlet根据code、groupName获取钉钉用户信息(userName),根据autoLoginProc来运行login.proc并生成一个tickt,最后将userName、tickt返回到前台weixin2.screen
获取钉钉用户信息
//4.2根据code和accessToken获取成员Id(和userTickt) —————移动端网页授权 //userName = QiyeWeixinNetworkUtil.getUserId(task.getAccessToken(), code); userName =UserService.getUserInfo(task.getAccessToken(), code).getString("userid"); //数据库中的userName对应钉钉的userid //4.3根据userID和accessToken获取成员详细信息——————成员管理 //mobile = QiyeWeixinNetworkUtil.getUserinfo(task.getAccessToken(),userName); mobile = UserService.getUser(task.getAccessToken(), userName).getString("mobile");
根据autoLoginProc来运行login.proc并生成一个tickt
//5.执行proc HttpServiceInstance svc = createHttpService(autoLoginProc, request, response, procedureManager, auroraContext); ServiceThreadLocal.setCurrentThreadContext(auroraContext); try { ServiceInvoker.invokeProcedureWithTransaction(autoLoginProc, proc, serviceFactory, svc, auroraContext); } catch (Exception e) { System.out.println(Level.SEVERE+ "***loginName:" + userName + "***" + e.getMessage()); try { throw new IllegalAccessException(e.getMessage()); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
将userName、tickt返回到前台weixin2.screen(通过ajax的response返回)
//将userName和tickt传到前台 //获取tickt String ticketTemp=auroraContext.getObject("weixin").toString(); System.out.println("ticketTemp:"+ticketTemp); int ticketBegin=ticketTemp.indexOf("ticket=")+7; int ticketEnd=ticketTemp.lastIndexOf(","); String ticket=ticketTemp.substring(ticketBegin,ticketEnd); //拼装json String resultStr= "{user_name:‘" + userName + "‘,ticket:‘" + ticket + "‘}"; System.out.println("resultStr:"+resultStr); PrintWriter out = response.getWriter(); out.print(resultStr); out.close(); out = null;
1.2.4 执行login.svc
weixin2.screen以userName、tickt为参数,通过ajax请求执行login.svc,验证咱们数据库中有没有这个userName,并查处手势密码
主要是执行存储过程:db.sys_mobile_pkg.login
<?xml version="1.0" encoding="UTF-8"?> <a:service xmlns:a="http://www.aurora-framework.org/application" xmlns:p="uncertain.proc" trace="true"> <a:init-procedure> <a:session-clear/> <a:model-execute model="db.sys_mobile_pkg.login"/> <a:session-clear/> <a:session-write source="/session"/> <a:put-cookie name="JSID" value="${/session/@jsid}"/> <p:echo/> </a:init-procedure> <a:service-output output="/parameter"/> </a:service>
1.2.5 手势密码
登录成功之后,若有手势密码,则输入手势密码,即可登录手台。若没有手势密码,则设置之。
以上是关于Aurora钉钉_总结_02_开发简介的主要内容,如果未能解决你的问题,请参考以下文章
Java钉钉开发_03_通讯录管理之 人员管理 和 部门管理
Java钉钉开发_异常_01_error code:50002, error message:请求的员工userid不在授权范围内