当前位置:网站首页>浙政钉扫码登录

浙政钉扫码登录

2022-04-22 09:28:00 WXF_Sir

专有钉钉扫码登录

参考专有钉钉开发文档,链接:https://openplatform-portal.dg-work.cn/portal/#/helpdoc?docKey=kfzn&slug=engk1k

一、官方流程

image.png

二、具体实现

1.准备工作,下载官方sdk

①.JAVA 语言

新文档对应sdk: zwdd-sdk-java-1.2.0.jar

旧文档对应sdk:zwdd-sdk-java-1.1.9.jar

②.PHP 语言

zwdd-sdk-php.php

③.Python 语言

zwdd-sdk-python.py

注:

遇到 org.joda.time.ReadableInstant 报错,请在 pom.xml 中添加如下内容

<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.10</version>
</dependency>

如遇到 fastjson 相关报错,请在 pom.xml 中添加如下内容

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.47</version>
</dependency>

2.准备工作,获取appKey和appSecrect

查看应用详情

登录开发者后台,点击“应用管理”-找到应用并点击详情,可以查看 AppKey 和 AppSecret 。

image.png

权限管理

申请API授

在我的应用页面,点击左侧接口权限,进入权限管理页面,开启应用功能所需要的权限。请仅仅选择需要的权限进行授权。

image.png

3.获取access_token

这里的ExecutableClient和GetClient,都是依赖第一步的sdk(mvn仓库也没有,协同开发时记得带上)

//调用dingding api
//private JSONObject getMsgByApi(String apiMethod,Map paramMap){
private JSONObject getMsgByApi(){
    ExecutableClient executableClient =ExecutableClient.getInstance();
    executableClient.setAccessKey(appKey);										//appKey<1>
    executableClient.setSecretKey(appSecret);									//appSecret<2>
    executableClient.setDomainName(domainName);									//domainName<3>
    executableClient.setProtocal("https");
    executableClient.init();
    //executableClient要单例,并且使用前要初始化,只需要初始化一次

    String api = "/gettoken.json"; 												
    GetClient getClient = executableClient.newGetClient(api);
    //设置参数
    getClient.addParameter("appkey", appkey);									//appKey<1>
	getClient.addParameter("appsecret", appsecret);								//appSecret<2>
    //调用API
    String apiResult = getClient.get();

    JSONObject map = JSON.parseObject(apiResult);
    System.out.println(apiResult);
    return map;
}

其中<1>、<2>参数都是来自第二步,而<3>参照下表填入对应接口环境域名

环境 开放平台域名(调接口使用) 登录域名(构造登录页面)
Saas openplatform.dg-work.cn login.dg-work.cn
浙政钉 openplatform-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.1) login-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.68)

完整接口地址:https://环境域名/+接口名 例如:https://openplatform.dg-work.cn/gettoken.json

返回的apiResult结果

{
    "success":true,
    "content":{
        "data":{
            "accessToken":"c139fe44362f41b6b84862ec82ab84d9", //这就是咱们要的
            "expiresIn":"7200"
        },
        "requestId":"df04428415724925400701038d663a",
        "responseMessage":"OK",
        "responseCode":"0",
        "success": true
    }
}

4.获取免登授权码(若是前后端分离,可以交给前端来做)

构造扫码登录页面(官方)

Web系统可以通过两种方式实现政务钉钉扫码登录

方式一 使用政务钉钉提供的扫码登录页面

在企业Web系统里,用户点击使用钉钉扫码登录,第三方Web系统跳转到如下地址:

https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE

URL中的client_id和redirect_uri两个参数的值填入第三方web系统的应用标识和回调地址。政务钉钉用户扫码登录并确认后,会302到你指定的redirect_uri,并向url参数中追加临时授权码code(此code非authcode)及state两个参数。

注意事项:

参数"redirect_uri=回调地址"涉及的域名,需和创建扫码登录应用授权时填写的回调域名一致,否则会提示无权限访问。

生成二维码大小固定为200*200px,不支持修改。

image.png

方式二 支持网站将政务钉钉登录二维码内嵌到自己页面中

步骤1:在****页面中通过iframe嵌入页面

通过方式一构造的地址增加embedMode=true的参数

https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE&embedMode=true

步骤2:扫码成功后需要在页面中监听扫码结果

<script type="application/javascript">
    window.addEventListener('message', function(event) {
          // 这里的event.data 就是登录成功的信息
            // 数据格式:{ "code": "aaaa", "state": "bbbb" }
        alert(JSON.stringify(event.data));
    });
</script>

注意:生成二维码大小固定为200*200px,不支持修改。

image.png

参考方式一实现(clint_id就是所建应用的应用标识)

@Override
public void toALiDingDing(HttpServletResponse response) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=")
            .append(appID)
            .append("&scope=get_user_info&authType=QRCODE")
            .append("&redirect_uri=")
            .append(redirectUrl);
    try {
        response.sendRedirect(stringBuilder.toString());
    } catch (IOException e1) {

    }
}

5.获取用户详情

通过前面几个步骤,我们已经拿到了最关键的两个东西access_token调�9�2接�9�1凭证、code免登授权码

因此,同理,我们在调用接口如下:

//调用dingding api
//private JSONObject getMsgByApi(String apiMethod,Map paramMap){
private JSONObject getMsgByApi(){
    ExecutableClient executableClient =ExecutableClient.getInstance();
    executableClient.setAccessKey(appKey);										
    executableClient.setSecretKey(appSecret);									
    executableClient.setDomainName(domainName);									
    executableClient.setProtocal("https");
    executableClient.init();
    //executableClient要单例,并且使用前要初始化,只需要初始化一次

    String api = "/rpc/oauth2/dingtalk_app_user.json"; 												
    GetClient getClient = executableClient.newGetClient(api);
    //设置参数
    getClient.addParameter("access_token", "xxxxx");									
	getClient.addParameter("code", "xxxxx");								
    //调用API
    String apiResult = getClient.get();

    JSONObject map = JSON.parseObject(apiResult);
    System.out.println(apiResult);
    return map;
}

返回apiResult如下(以实际返回为主):

{
    "success":true,
    "content":{
        "data":{
            "accountId":100135,
            "lastName":"俊锋",
            "clientId":"mozi-buc-sso",
            "realmId":12371,
            "tenantName":"租户2",
            "realmName":"租户2",
            "namespace":"local",
            "tenantId":12371,
            "nickNameCn":"俊锋",
            "tenantUserId":"12371$100135",
            "account":"admin2"
        },
        "success":true,
        "responseMessage":"成功",
        "responseCode":"0"
    }
}

错误码

responseCode responseMessage
240111 code失效或不存在
240133 应用accessToken失效或不存在

6.走自己的登录业务吧

版权声明
本文为[WXF_Sir]所创,转载请带上原文链接,感谢
https://blog.csdn.net/WXF_Sir/article/details/124325342