亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

釘釘掃碼登錄

標簽:
Java

功能描述

通过钉钉扫码登录,并且获取到登录的用户信息。这样省去自己开发一套登录系统。相对比较方便。

背景描述

现在钉钉主推E应用,官方的案例也是E应用的,其实这个E应用的后台调用的过程和原来的扫码的登录的已经是不一样了。所以要做这个功能需要查旧的api文档。地址如下:https://open-doc.dingtalk.com/dingdocold
为了兼容性,旧的api以及url应该不会再有改动了。所以现在做一套模板上来,大家可以直接复制代码。修改一些配置就可以运行了。

开发流程

这里根据场景稍微做了一些改变。(sdk的下载自己做)

  1. 创建扫码传递的检验信息
    在钉钉的开发者平台,扫码登录创建一个授权。主要有如下信息
需提交字段 说明
名称 授权微应用的名称
描述 扫码登录用于,主要是说明,使用的场景
授权页面LOGO地址 这个会显示在授权页面的中间页中,以http或https开头
回调域名 回调的URL,以http或https开头

这里需要注意的是回调域名,就是扫码后跳转的页面,这个后面会用到。创建好以后,我们就可以看到appId及appSecret。
2. 创建二维码
这里主要使用的是跳转,比较方便,一个url解决。

就是上面的url。传递的参数有需要修改的几个地方appid就是第一步获取的id。redirect_uri就是第一步写的跳转页面(跳转页面其实就是要获取具体的信息的请求,扫描只是通过验证了,我们还要记录谁登录等信息,获取具体信息再跳转的页面做)。state这里其实主要是用来禁止缓存的,这是一个get请求,需要做这些操作,其余参数不改。
3. 剩余步骤
后面的步骤比较机械化,如果有兴趣就去看官方文档。这些代码是不需要修改的,我已经抽象成了方法。

重点强调

我们需要获取的一些信息,appid,appSecret,回调的url。

代码

@RestController
@RequestMapping("")
public class DingLoginController {

    private static final String URL = "http://127.0.0.1:8080/loginInfo";
    private static final String DINGDING_URL = "https://oapi.dingtalk.com";
    private static final String METHOD_GET = "GET";
    private static final String APP_ID = "";
    private static final String APP_SECRET = "";

    @RequestMapping("/login")
    public void login(HttpServletResponse response) throws IOException {

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(DINGDING_URL).append("/connect/qrconnect?appid=" + APP_ID + "&")
                .append("response_type=code&scope=snsapi_login&state=")
                .append(System.currentTimeMillis()).append("&redirect_uri=").append(URL);
        response.sendRedirect(stringBuilder.toString());
    }

    @RequestMapping("/loginInfo")
    public JSONResult login(String code) throws ApiException {
        String accessToken = getAccessToken(APP_ID, APP_SECRET);
        String persistentCode = getPersistentCode(accessToken, code);
        JSONObject infos= JSONObject.parseObject(persistentCode);
        String openid = infos.getString("openid");
        String persistent_code = infos.getString("persistent_code");
        String unionid = infos.getString("unionid");
        String snsToken = getSnsToken(accessToken,openid,persistent_code);
        String userInfo = getUserInfo(snsToken);
        return JSONResult.ok(userInfo);


    }


    public String getAccessToken(String appId, String appSecret) throws ApiException {
        OapiSnsGettokenResponse response = null;

        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/gettoken");
        OapiSnsGettokenRequest request = new OapiSnsGettokenRequest();
        request.setAppid(appId);
        request.setAppsecret(appSecret);
        request.setHttpMethod(METHOD_GET);
        response = client.execute(request);
        String body = response.getBody();
        JSONObject jo = JSON.parseObject(body);
        String errcode = jo.getString("errcode");
        String access_token = null;
        if ("0".equals(errcode)) {
            access_token = (String) jo.get("access_token");
        }
        return access_token;
    }


    public String getPersistentCode(String accessToken, String code) throws ApiException {
        OapiSnsGetPersistentCodeResponse response = null;

        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/get_persistent_code");
        OapiSnsGetPersistentCodeRequest request = new OapiSnsGetPersistentCodeRequest();
        request.setTmpAuthCode(code);
        response = client.execute(request, accessToken);

        return response.getBody();
    }


    public String getSnsToken(String accessToken,String openId,String persistentCode) throws ApiException {
        OapiSnsGetSnsTokenResponse response = null;
        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/get_sns_token");
        OapiSnsGetSnsTokenRequest request = new OapiSnsGetSnsTokenRequest();
        request.setPersistentCode(persistentCode);
        request.setOpenid(openId);
        response = client.execute(request, accessToken);
        return response.getSnsToken();
    }


    public String getUserInfo(String snsToken) throws ApiException {
        OapiSnsGetuserinfoResponse response = null;
        DingTalkClient client = new DefaultDingTalkClient(DINGDING_URL + "/sns/getuserinfo");
        OapiSnsGetuserinfoRequest request = new OapiSnsGetuserinfoRequest();
        request.setSnsToken(snsToken);
        request.setHttpMethod(METHOD_GET);
        response = client.execute(request);
        return response.getBody();
    }


}

复制以上代码,然后修改APP_ID ,APP_SECRET ,这里URL = "

點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
1.6萬
獲贊與收藏
380

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消