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("验证完了");
View Code

 

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>
View Code

 

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));  
                }  
            });  
        
        
        
        
        
        });  
 
View Code

 

获取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));  
        }  
});  
View Code

 

发送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);  
                        }  
                    });  
View Code

 

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");
View Code

 

根据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();
                    }
                }
View Code

 

将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;  
                
View Code

 

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>
View Code

 

1.2.5 手势密码

登录成功之后,若有手势密码,则输入手势密码,即可登录手台。若没有手势密码,则设置之。

 

以上是关于Aurora钉钉_总结_02_开发简介的主要内容,如果未能解决你的问题,请参考以下文章

Java钉钉开发_02_免登授权(身份验证)(附源码)

Java钉钉开发_03_通讯录管理之 人员管理 和 部门管理

Java钉钉开发_异常_01_error code:50002, error message:请求的员工userid不在授权范围内

钉钉小程序开发一则趟坑日记(js写不顺溜导致的)_js里的作用域

Aurora头行保存

Git学习总结_03_代码托管平台简介