对接专有钉钉(浙政钉)登陆步骤

背景

因为项目需要对接浙政钉,我想应该和之前对接阿里云的钉钉登陆钉钉登陆类似,就上网搜索看看,出现了个专有钉钉的概念,就一时间搞不清楚,钉钉,专有钉钉,浙政钉的区别,后续稍微理解了点,不一定完全正确哈。 可给大家做参考。
浙政钉: 线上环境使用的,一般是政府用的比较多。 在政务外网
钉钉:一般是企业用的,公网使用。
专有钉钉: 浙政钉的公网测试版本。专有钉钉下载

流程

参考链接中有流程,我这面的话在贴一张流程图
在这里插入图片描述

准备工作

创建应用

登陆专有钉钉,这里的话,如果是首次的话我感觉比较麻烦,没有注册之类的。 我都是让同事把我加到他的测试组织中的,就跳过比较麻烦的点,所以我就不清楚具体怎么注册了。 登陆之后创建应用
根据自己的需求来选择,这里我选择了扫码登陆。
在这里插入图片描述

在这里插入图片描述

设置回调

应用创建成功之后点击详情
在这里插入图片描述
凭证与基础信息 中的 App Key 和App Secret 这二我们后端是需要使用的,先简单看一下。到时候可以设置成配置。
在这里插入图片描述

设置回调地址
在这里插入图片描述

回调地址的作用:可参考在流程中政务登陆服务给我们后端临时授权码的那一步。

后端实现

引入第三方jar

 
        <dependency>
            <groupId>com.alibaba.zwdd</groupId>
            <artifactId>zwdd-sdk</artifactId>
            <version>1.2.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/zwdd-sdk-java-1.2.0.jar</systemPath><!--路径-->
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version> 
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version> 
        </dependency>

这个zwdd-sdk-java-1.2.0.jar没有在中央仓库中,需要自己下载引入。
下载链接
引入也很简单,在项目目录创建一个lib文件夹,放进去就可以了。上面有写好怎么引入本地包的。

代码实现

这里我们就实现二个接口,一个是获取token 一个是获取用户信息。

Service接口

public interface ZheJiangDingTalkService {
    /**
     * 获取token
     * @param
     * @return
     */
    String getToken();

    /**
     * 获取用户信息
     * @param authCode
     * @return
     */
    ZheJiangUserInfoApiResult getUserInfo(String accessToken,String authCode);
}

Service实现

Service
public class ZheJiangDingTalkServiceImpl implements ZheJiangDingTalkService {
    @Resource
    private DingDingProperties dingDingProperties;


    @Override
    public String getToken() {
        try {

            ExecutableClient executableClient = init();
            return getToken(executableClient);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    private String getToken(ExecutableClient executableClient) {
        try {
            
            //executableClient保证单例
            PostClient intelligentGetClient = executableClient.newPostClient("/gettoken.json");
            OapiGettokenJsonRequest oapiGettokenJsonRequest = new OapiGettokenJsonRequest();
            //应用的唯一标识key
            oapiGettokenJsonRequest.setAppkey(dingDingProperties.getAppKey());
            //应用的密钥
            oapiGettokenJsonRequest.setAppsecret(dingDingProperties.getAppSecret());
            //获取结果
            String apiResult = intelligentGetClient.post();

            Type type = new TypeToken<ZheJiangTokenApiResult<ZheJiangTokenBaseApiResult>>() {}.getType();
            ZheJiangTokenApiResult<ZheJiangTokenBaseApiResult> tokenApiResult = GsonUtil.stringToBean(apiResult, type);

            if (tokenApiResult.success()) {
                ZheJiangTokenBaseApiResult.ZheJiangTokenApiResult resultData = tokenApiResult.getContent().getData();
                String accessToken = resultData.getAccessToken();
                
                return accessToken;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    public ZheJiangUserInfoApiResult getUserInfo(String accessToken,String code) {
        ExecutableClient init = init();
        IntelligentGetClient  intelligentPostClient = init.newIntelligentGetClient("/rpc/oauth2/getuserinfo_bycode.json");
        OapiRpcOauth2GetuserinfoBycodeJsonRequest oapiRpcOauth2DingtalkAppUserJsonRequest = new OapiRpcOauth2GetuserinfoBycodeJsonRequest ();
        //登录access_token
        oapiRpcOauth2DingtalkAppUserJsonRequest.setAccess_token(accessToken);
        //临时授权码 //回调的码
        oapiRpcOauth2DingtalkAppUserJsonRequest.setCode(code);
        //获取结果
        OapiRpcOauth2GetuserinfoBycodeJsonResponse apiResult = intelligentPostClient.get(oapiRpcOauth2DingtalkAppUserJsonRequest);
        String content = apiResult.getContent();
        Type type = new TypeToken<ZheJiangTokenApiResult<ZheJiangBaseApiResult<ZheJiangUserInfoApiResult>>>() {}.getType();
        ZheJiangTokenApiResult<ZheJiangBaseApiResult<ZheJiangUserInfoApiResult>> tokenApiResult = GsonUtil.stringToBean(content, type);
        if(tokenApiResult.success()) {
            return tokenApiResult.getContent().getData();
        }
        return null;
    }

    private ExecutableClient init(){
        ExecutableClient executableClient =ExecutableClient.getInstance();
        executableClient.setAccessKey(dingDingProperties.getAppKey());
        executableClient.setSecretKey(dingDingProperties.getAppSecret());
        executableClient.setDomainName(dingDingProperties.getDomainName());
        executableClient.setProtocal("https");
        executableClient.init();
        return executableClient;
    }

}

这里我们使用了Gson和创建了几个对象,这里的代码的话,我简单贴一下,看你们是否愿意使用,不愿意的话,可自己写的。

工具类

public class GsonUtil {

    /**
     * 不用创建对象,直接使用Gson.就可以调用方法
     */
    private static Gson gson = null;

    private static JsonParser jsonParser = null;

    /**
     * 判断gson对象是否存在了,不存在则创建对象
     */
    static {
        //gson = new Gson();
        // 当使用GsonBuilder方式时属性为空的时候输出来的json字符串是有键值key的,显示形式是"key":null,而直接new出来的就没有"key":null的
        gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

        if(jsonParser == null ){
            jsonParser = new JsonParser();
        }
    }

    private GsonUtil() {}
    }
      /**
     * 将json转成特定的cls的对象
     * @param gsonString
     * @param cls
     * @return
     */
    public static <T> T stringToBean(String gsonString, Class<T> cls) {
        T t = null;
        if (gson != null) {
            //传入json对象和对象类型,将json转成对象
            t = gson.fromJson(gsonString, cls);
        }
        return t;
    }
    public static <T> T stringToBean(String gsonString, Type type) {
        T t = null;
        if (gson != null) {
            //传入json对象和对象类型,将json转成对象
            t = gson.fromJson(gsonString, type);
        }
        return t;
    }
}
@Component
@ConfigurationProperties(prefix = "dingtalk.msg")
@Setter
@Getter
public class DingDingProperties {

    
    public String appKey = "xx";

    public String appSecret = "xxx";

    private String domainName="openplatform.dg-work.cn";

}


实体

@Setter
@Getter
@ToString
public class ZheJiangBaseApiResult<T> {
    private T data;
    private boolean success;
    private String requestId;
    private String responseMessage;
    private String responseCode;
    private String bizErrorCode;

    public boolean isSuccess(){
        return ("0").equals(this.bizErrorCode);
    }

}
@Setter
@Getter
@ToString
public class ZheJiangTokenApiResult<T> {
    private T content;
    private String bizErrorCode;

    private boolean success;

    public boolean success(){
        return ("0").equals(this.bizErrorCode) || success;
    }


}
@Setter
@Getter
@ToString
public class ZheJiangTokenBaseApiResult {
    private ZheJiangTokenApiResult data;
    private boolean success;
    private String requestId;
    private String responseMessage;
    private String responseCode;
    private String bizErrorCode;

    @Setter
    @Getter
    public class ZheJiangTokenApiResult {
        private int expiresIn;
        private String accessToken;
    }


}
@Setter
@Getter
@ToString
@NoArgsConstructor
public class ZheJiangUserInfoApiResult {
    public Integer accountId;
    private boolean success;
    public String lastName;
    public String clientId;
    public Integer realmId;
    public String realmName;
    public String namespace;
    public String nickNameCn;
    public String tenantUserId;
    public String account;
    public String employeeCode;

    
}



额外的pom文件

    <!-- gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

注意事项

DingDingProperties 中的domainName 记得正式环境更改成openplatform-pro.ding.zj.gov.cn
让客户提供下正式环境下的 app-key和app-secret就可以了。
在这里插入图片描述
剩下的二维码和对接就交给前端的同事来对接就好了。

参考链接

专有钉钉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/680544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向阳而生,逐光而行。—定制化系统解决方案—

风之所及&#xff0c;皆有麦浪 目之所及&#xff0c;皆为所向

Precision和Recall

Precision&#xff08;精确率 / 查准率&#xff09;和 Recall&#xff08;召回率 / 查全率&#xff09;是分类任务中常用的两种性能度量&#xff0c;它们用于评估模型在处理二分类或多分类问题时的表现。 Precision&#xff08;精确率&#xff09; 精确率衡量的是模型预测为正…

干货!如何在Jmeter中实现对NCR响应的解析

最近做接口测试时发现了一个问题&#xff0c;部分请求的响应是通过NCR编码实现的&#xff0c;这样就导致了无法对这些请求进行断言&#xff0c;为了解决这个问题进行了如下调研&#xff0c;大家可以参考下面两篇文章&#xff1a; 使用Java apache commons包五分钟搞定NCR解析&…

智慧校园应用平台的全面建设

在当今社会&#xff0c;随着科技的不断进步&#xff0c;智慧校园应用平台逐渐成为学校管理的必备工具。在实现智慧校园全面建设的过程中&#xff0c;学校需要运用先进的技术和创新的理念&#xff0c;为教育提供更好的服务和支持。这篇文章将为您介绍智慧校园应用平台的全面建设…

qt中使用QSLite时发现query.value(0).toInt()未获取数据问题

1、首先确保数据库名没有问题 2、确保正常连接 3、非常重要的一点&#xff1a;query.value(0).toInt()之前&#xff0c;必须要有query.first()&#xff0c;非常重要&#xff0c;缺少了这个会一直查不到

ruoyi-nbcio基于jeecg的flowable前端支持自定义表单组件的自动获取方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

罗德、西圣、猛犸无线麦克风哪个好?罗德、西圣领夹麦克风对比测评

在当今短视频蓬勃发展的时代&#xff0c;越来越多的人投身于短视频创作的浪潮之中&#xff0c;通过镜头捕捉生活点滴&#xff0c;记录工作瞬间。而在谈及视频制作时&#xff0c;不得不提及的是视频录制工具。目前&#xff0c;随着手机影像技术的飞速发展&#xff0c;其视频录制…

沟通技巧(Communication Skills 业务分析能力)

背景 业务分析的胜任力模型&#xff0c;有六大部分&#xff0c;今天我们看第二部分&#xff0c;业务知识 Analytical Thinking and Problem Solving &#xff1a;分析判断及问题解决能力Behavioural Characteristics&#xff1a; 行为特质&#xff08;责任、道德、适应性等等…

免费注册US.KG域名支持接入CF

注册地址&#xff1a; https://register.us.kg/auth/register 号码和地址我是随便填的&#xff0c;不知道对以后有没有影响 收到激活邮件&#xff0c;可能在垃圾箱里 接下来是有个KYC验证&#xff0c;需要填写信息和上传KYC照片&#xff0c;我也是乱填的和乱上传的。可以去找…

Android Studio | 小白如何运行别人的安卓项目

目录 Step1&#xff1a;正确地打开项目 Step2&#xff1a;AS 同步时报错 Step3&#xff1a;同步完成后启动 Step4&#xff1a;启动成功 说明&#xff1a;本文简称 Android Studio 为 AS Step1&#xff1a;正确地打开项目 重点&#xff1a;确认好项目的根目录是哪个目录&am…

Vitis HLS 学习笔记--通道的FIFO/PIPO选择

目录 1. 简介 2. 代码详解 2.1 FIFO 通道示例 2.1.1 配置默认通道 2.1.2 kernel 代码 2.1.3 综合报告 2.1.4 depth 32 解析 2.1.5 FIFO 通道分类 2.2 PIPO 2.2.1 配置默认通道 2.2.2 kernel 代码 2.2.3 综合报告 2.2.4 PIPO 通道分类 3. 综合对比 3.1 数据类…

WSDM 2023 推荐系统相关论文整理(三)

WSDM 2023的论文录用结果已出&#xff0c;推荐系统相关的论文方向包含序列推荐&#xff0c;点击率估计等领域&#xff0c;涵盖图学习&#xff0c;对比学习&#xff0c;因果推断&#xff0c;知识蒸馏等技术&#xff0c;累计包含近四十篇论文&#xff0c;下文列举了部分论文的标题…

Element UI上传图片和PDF,支持预览,并支持复制黏贴上传

背景 如上图&#xff0c;使用Element UI的el-upload组件&#xff0c;并且预览的时候可以展示图片和PDF格式文件&#xff1b; 做法 index.vue <template><div><el-uploadv-model"diaForm.list":limit"5":on-exceed"handleExceed"…

2.6倍!WhaleTunnel 客户POC实景对弈DataX

作为阿里早期的开源产品&#xff0c;DataX是一款非常优秀的数据集成工具&#xff0c;普遍被用于多个数据源之间的批量同步&#xff0c;包括类似Apache DolphinScheduler的Task类型也对DataX进行了适配和增强&#xff0c;可以直接在DolphinScheduler里面利用通用的数据源调用Dat…

UE4 使用自带的插件制作音频可视化

1.插件默认为开启 2.新建共感NRT&#xff0c;选择要使用的音频 3.添加音频组件&#xff0c;添加共感NRT变量&#xff0c;选择新建的共感NRT对象 4.编写蓝图

【机器学习】YOLOv10与YOLOv8分析

YOLOv10与YOLOv8&#xff1a;实时目标检测技术的演进与对比 一、YOLOv8与YOLOv10的概述二、YOLOv8的特点与优势三、YOLOv10的改进与创新四、YOLOv10与YOLOv8的性能对比五、总结与展望 随着深度学习技术的飞速发展&#xff0c;实时目标检测技术已成为计算机视觉领域的研究热点。…

爬山算法:启发式搜索的简单而有效的方法

1. 概述 爬山算法是一种在人工智能和优化领域广泛使用的启发式搜索方法。它从一个初始解开始&#xff0c;逐步选择邻域内的最优解&#xff0c;直到找到目标点或无法进一步改进为止。该算法的核心在于通过逐渐逼近的方式寻找问题的最优解或近似最优解。 2. 背景 在许多实际问…

Spring Boot 实现动态数据源配置

前言 之前在CSDN博客以及某站看了教程&#xff0c;不免觉得有点不知如何下手&#xff0c;好在最后融合了以下&#xff0c;得出了一个比较简单的配置动态数据源的过程。 首先项目是Spring Boot的单体项目&#xff0c;我们的需求是要连接多个数据库&#xff0c;那么就需要配置多个…

Source Insight 4.0安装和使用

文章目录 一、前言二、新建工程2.1 新建工程2.2 同步工程 3 Source Insight怎么生成函数调用关系图&#xff1f;3.1 打开关系窗口3.2 打开关系函数3.3 修改关系属性3.4设置 Relation Window Options3.5 设置Levels3.6 修改显示模式 4 下载地址 一、前言 Source Insight 4.0 是每…

Flutter开发效率提升1000%,Flutter Quick教程之定义Api(三)

将tab键切换到Response&#xff0c;会出现这么一个界面 这是添加api返回的json数据。比如我们添加一个json数据。 添加完json数据后&#xff0c;右上角有一个删除按钮。要换json数据的话&#xff0c;可以点击清除再重新输入。 这时候&#xff0c;左边的面板上还会显示出 这个的…