关闭

【JavaWeb开发】初步实现网站应用钉钉扫码登录

标签: java web钉钉钉钉开发
3193人阅读 评论(0) 收藏 举报
分类:

写在前面:如果你还不知道钉钉是什么,就赶紧问问Google。当然,这篇博客是用流水线的形式完成钉钉扫码登录。

第一步,看官方文档

网站应用钉钉扫码登录开发指南(钉钉官网)

如果你想要通过用户扫码获取到他的个人信息,那么你需要完成全部的交互,如果你只是想为你的网站做一个免登录处理,其实只要拿到用户的openid就可以了。当然我会在这篇博客中贴出全部步骤的代码。

第二步,获取appId和appSecret

  • 登录/注册到钉钉开发者官网:新版开发者平台:http://open-dev.dingtalk.com
  • 在左侧的五个菜单中点击自助工具,然后在右侧的菜单中创建扫码登录应用授权,然后依次输入名称描述授权页面logo地址(这个图片最后会出现在用户扫码设备中,建议使用压缩图片减少用户加载时间)、回调域名(一般都是写一个子域名,比如http://oa.dingtalk.com),保存之后便可以看到对应的appId以及appSecret了。

第三步,创建一个用户扫码界面并获取临时code

官网一共给大家提供了两种方式,第一种就是直接跳转到钉钉的二维码扫描;第二种是嵌入到自己的网页显示二维码。

因为我用的是第一种,并且这篇博客也仅仅是建立在初步实现,所以这里就不为大家介绍第二种嵌入方式了。

https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI

将自己的appid填写在APPID处,将自己希望扫码后跳转到的地址填写在REDIRECT_URI,比如可以填写为http://google.com/dingtalkLogin或者http://google.com/dingtalkLogin.action等等,大家可以根据自己的实际情况填写。

  • 获取临时code和参数state,首先再看一次官网说明文档:
    这里写图片描述
    所以你在REDIRECT_URI跳转回去的方法中,需要获取到code和state两个参数。而关于state,参数其实就是你在之前拼接URL的时候中的STATE,这里建议大家可以使用时间戳(当用户访问的时候,因为URL不同,所以浏览器会重新获取,避免浏览器因缓存而导致二维码无法使用等问题);

代码:

  • 拼接URL:
    /**
     * 
     * 描述:后台默认跳转到二维码登录界面
     * 开发人员:暴沸
     * 开发时间: 2017年2月23日 下午9:09:57
     * 联系方式:admin@baofeidyz.com 
     *
     * @param request
     */
    @RequestMapping(value="login")
    public void toALiDingDing(HttpServletResponse response){
        //这是我自己写的一个获取时间戳的Util,前期大家可以不管这个STATE
        TimeUtil timeUtil = new TimeUtil();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&")
            .append("response_type=code&scope=snsapi_login&state=")
            .append(timeUtil.getNow())
            .append("&redirect_uri=")
            .append("REDIRECT_URI");
        try {
            response.sendRedirect(stringBuilder.toString());
        } catch (IOException e1) {
        }
    }

第四步,获取access_token

关于java如何封装get和post请求可以参考一下我自己写的博客:
【JavaWeb开发】用Apache的HttpClient4.5完成HttpGet请求
【JavaWeb开发】用Apache的HttpClient4.5完成HttpPost请求

        //获取accesstoken
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        HttpClient httpClient = httpClientBuilder.build();
        HttpResponse httpResponse = null;
        String url = "https://oapi.dingtalk.com/sns/gettoken?appid=APPID&appsecret=APPSECRET";
        HttpGet httpGet = new HttpGet(url);
        try {
            httpResponse = httpClient.execute(httpGet);
        } catch (Exception e) {
        }
        BufferedReader bufferedReader = null;
        StringBuilder entityStringBuilder=new StringBuilder();  
        //得到httpResponse的状态响应码  
        int statusCode=httpResponse.getStatusLine().getStatusCode();  
        if (statusCode==HttpStatus.SC_OK) {  
            //得到httpResponse的实体数据  
            HttpEntity httpEntity=httpResponse.getEntity();  
            if (httpEntity!=null) {  
                try {  
                    bufferedReader=new BufferedReader  
                    (new InputStreamReader(httpEntity.getContent(), "UTF-8"), 8*1024);  
                    String line=null;  
                    while ((line=bufferedReader.readLine())!=null) {  
                        entityStringBuilder.append(line+"/n");  
                    }  
                } catch (Exception e) {  
                }  
            }  
        }
        JSONObject jsonObject = new JSONObject(entityStringBuilder.toString());
        String access_token = jsonObject.getString("access_token");

第五步,获取持久授权码persistent_code

获取用户授权的持久授权码(钉钉官网)

在官网文档中指出,需要使用之前获取到的临时code以及access_token两个参数来发送一个POST请求:

        //获取用户授权的持久授权码
        String url3 = "https://oapi.dingtalk.com/sns/get_persistent_code?access_token="+access_token;
        System.out.println("url3="+url3);
        HttpPost httpPost3 = new HttpPost(url3);
        //封装临时授权码

        JSONObject jsonObject3_1 = new JSONObject();
        jsonObject3_1.put("tmp_auth_code", code); 
        HttpEntity httpEntity3 = null;
        httpEntity3 = new StringEntity(jsonObject3_1.toString(),"UTF-8");
        httpPost3.setEntity(httpEntity3);
        HttpResponse httpResponse3 = null;
        try {
            httpResponse3 = httpClient.execute(httpPost3);
        } catch (Exception e) {
            // TODO: handle exception
        }
        StringBuilder entityStringBuilder3=new StringBuilder();
        //得到httpResponse的状态响应码  
        int statusCode3=httpResponse3.getStatusLine().getStatusCode();  
        if (statusCode3==HttpStatus.SC_OK) {  
            //得到httpResponse的实体数据  
            HttpEntity httpEntity3_2=httpResponse3.getEntity();  
            if (httpEntity3!=null) {  
                try {  
                    bufferedReader=new BufferedReader  
                    (new InputStreamReader(httpEntity3_2.getContent(), "UTF-8"), 8*1024);  
                    String line=null;  
                    while ((line=bufferedReader.readLine())!=null) {  
                        entityStringBuilder3.append(line+"/n");  
                    }  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }
        JSONObject jsonObject3_2 = new JSONObject(entityStringBuilder3.toString());
        String persistent_code = jsonObject3_2.getString("persistent_code");
        String openid = jsonObject3_2.getString("openid");

如果你自习看代码,在这一步中我们已经拿到了用户在这个网页应用中的唯一标识openid了,其实到这里就可以实现网站的免登录扫码了哦!

第六步,获取SNS_TOKEN

获取用户授权的SNS_TOKEN(钉钉官网)

文档指出,我们需要在POST请求中封装之前获取到的access_token、openid以及persistent_code

        //获取用户授权的SNS_TOKEN
        String url4 = "https://oapi.dingtalk.com/sns/get_sns_token?access_token="+access_token;
        HttpPost httpPost4 = new HttpPost(url4);
        JSONObject jsonObject4 = new JSONObject();
        jsonObject4.put("openid", openid);
        jsonObject4.put("persistent_code", persistent_code);
        HttpEntity httpEntity4 = null;
        httpEntity4 = new StringEntity(jsonObject4.toString(),"UTF-8");
        httpPost4.setEntity(httpEntity4);
        HttpResponse httpResponse4 = null;
        //重新获取一个新的httpClient
        HttpClientBuilder httpClientBuilder2 = HttpClientBuilder.create();
        HttpClient httpClient2 = httpClientBuilder2.build();
        try {
            httpResponse4 = httpClient2.execute(httpPost4);
        } catch (Exception e) {
            // TODO: handle exception
        }
        StringBuilder entityStringBuilder4=new StringBuilder();
        //得到httpResponse的状态响应码  
        int statusCode4=httpResponse4.getStatusLine().getStatusCode();  
        if (statusCode4==HttpStatus.SC_OK) {  
            //得到httpResponse的实体数据  
            HttpEntity httpEntity4_1=httpResponse4.getEntity();  
            if (httpEntity4_1!=null) {  
                try {  
                    bufferedReader=new BufferedReader  
                    (new InputStreamReader(httpEntity4_1.getContent(), "UTF-8"), 8*1024);  
                    String line=null;  
                    while ((line=bufferedReader.readLine())!=null) {  
                        entityStringBuilder4.append(line+"/n");  
                    }  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }
        //
        JSONObject jsonObject4_1 = new JSONObject(entityStringBuilder4.toString());
        String sns_token = jsonObject4_1.getString("sns_token");

胜利就在眼前了!

第七步,获取用户信息

获取用户授权的个人信息(钉钉官网)

直接发送GET请求即可!

        //获取用户授权的个人信息
        String url5 = "https://oapi.dingtalk.com/sns/getuserinfo?sns_token="+sns_token;
        HttpGet httpGet5 = new HttpGet(url5);
        HttpResponse httpResponse5 = null;
        try {
            HttpClient httpClient3 = httpClientBuilder.build();
            httpResponse5 = httpClient3.execute(httpGet5);
        } catch (Exception e) {
            // TODO: handle exception
        }
        StringBuilder entityStringBuilder5=new StringBuilder();
        //得到httpResponse的状态响应码  
        int statusCode5=httpResponse5.getStatusLine().getStatusCode();  
        if (statusCode5==HttpStatus.SC_OK) {  
            //得到httpResponse的实体数据  
            HttpEntity httpEntity5=httpResponse5.getEntity();  
            if (httpEntity5!=null) {  
                try {  
                    bufferedReader=new BufferedReader  
                    (new InputStreamReader(httpEntity5.getContent(), "UTF-8"), 8*1024);  
                    String line=null;  
                    while ((line=bufferedReader.readLine())!=null) {  
                        entityStringBuilder5.append(line+"/n");  
                    }  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }
        JSONObject jsonObject5_1 = new JSONObject(entityStringBuilder5.toString());
        JSONObject jsonObject5 = jsonObject5_1.getJSONObject("user_info");
        String nick = jsonObject5.getString("nick");
        String unionid = jsonObject5.getString("unionid");
        String dingId = jsonObject5.getString("dingId");

大功搞成!

当然,这篇博客只是用流水线的方式去写这个接入的过程,实际上应该对代码进行优化,比如access_token应该使用定时任务获取,如果每次都在用户扫码的时候去获取,会占用大量资源。

1
0
查看评论

实现网站应用钉钉扫码登录,及查询用户详细信息

第一步,看官方文档 网站应用钉钉扫码登录开发指南(钉钉官网) 如果你想要通过用户扫码获取到他的个人信息,那么你需要完成全部的交互,如果你只是想为你的网站做一个免登录处理,其实只要拿到用户的 第三步,创建一个用户扫码界面并获取临时code 官网一共给大家提供了两种方式,第一种就是直接跳转到钉钉...
  • u012888052
  • u012888052
  • 2017-08-04 14:07
  • 1395

钉钉开发系列(十一)钉钉网页扫码登录

在《钉钉开发系列(八)二维码扫描登录的实现》介绍了一种扫码登录的方式,该方式是自己产生二维码,二维码中的URL指到自身的服务器页面,在该页面中以JSSDK的方式来获取钉钉用户的信息。钉钉官方提供了另外两种扫码登录的方式,可以参见钉钉官网。 先申请获取相应的appid和appsecret,然后架设一个...
  • xxdddail
  • xxdddail
  • 2016-11-04 14:38
  • 6071

【JavaWeb开发】初步实现网站应用钉钉扫码登录

初步实现网站应用钉钉扫码登录功能
  • baofeidyz
  • baofeidyz
  • 2017-03-01 12:20
  • 3193

钉钉开发系列(八)二维码扫描登录的实现

钉钉PC版在登录的时候,需要使用手机版的来扫描,扫描之后会弹出一个确定的页面,确定之后PC端就会登录进去。基于此,我们也想实现相似的功能,为此我们需要先探讨其中的原理。 查看钉钉PC版的二维码会发现是一个含有一个KEY的URL,钉钉扫描后会直接进入该URL的页面,在页面中确定之后,会向钉钉服务器发起...
  • xxdddail
  • xxdddail
  • 2016-07-22 17:15
  • 6971

C# 钉钉--网站应用钉钉扫码登录开发(C# asp.net)

网站应用钉钉扫码登录开发,C#,asp.net 。 第三方web服务提供者,通过此项服务,可以使用钉钉用户扫码登录自有的系统,并可将自有系统的账号与钉钉账号进行绑定,同时还能够获取钉钉用户的个人及企业数据,如姓名、手机号、对应企业的名称、企业是否认证过、企业的权益等级、其在企业内是否为管理人员等信息...
  • WXbluethink
  • WXbluethink
  • 2017-07-25 23:58
  • 1626

JAVA实现二维码扫码登录

实现客户端扫码登录分为下列四步.
  • FENGZIITI
  • FENGZIITI
  • 2016-10-31 12:52
  • 2731

钉钉免登陆前端操作详解

在钉钉免登陆中,前端操作是很重要的,因为在前端我们需要调用钉钉的jsapi来获取code,而这个code值是至关重要的。所以我 再次清清楚楚的解析一遍前端的操作。下面的是我写的demo,我讲以这个demo为例进行讲解。 先是demo的主页代码: dingding-1 ...
  • jeryjeryjery
  • jeryjeryjery
  • 2016-11-20 20:01
  • 11364

实现网站二维码扫描登录

在尝试使用网页版微信时,发现微信的登录方式比较酷。区别与常用的用户名和密码的登录方式,网页微信登录只需要轻轻一扫,即可方便的实现登录功能。 下面尝试根据个人的理解对其可能的架构猜测一番。总体来看,扫描二维码实现网站的登录并不是太困难的事情。首先来看一下二维码登录的整体架构: 在整个架构中,主要...
  • jiang1013nan
  • jiang1013nan
  • 2014-03-31 10:33
  • 56266

java实现二维码扫描登录

实现流程: pc端: 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事   a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程   b:生成二维码图片,二...
  • qq_17641373
  • qq_17641373
  • 2015-05-23 08:41
  • 10112

Java实现扫码二维码登录

http://www.toutiao.com/a6347453272806605058/?tt_from=mobile_qq&utm_campaign=client_share&app=explore_article&utm_source=mobile_qq&iid=...
  • u013322876
  • u013322876
  • 2016-11-11 01:40
  • 562
    关于我
    个人资料
    • 访问:114392次
    • 积分:1575
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:7篇
    • 译文:1篇
    • 评论:19条
    博客专栏
    最新评论