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

背景

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

流程

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

准备工作

创建应用

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

在这里插入图片描述

设置回调

应用创建成功之后点击详情
在这里插入图片描述
凭证与基础信息 中的 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 {@Resourceprivate DingDingProperties dingDingProperties;@Overridepublic 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();//应用的唯一标识keyoapiGettokenJsonRequest.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;}@Overridepublic ZheJiangUserInfoApiResult getUserInfo(String accessToken,String code) {ExecutableClient init = init();IntelligentGetClient  intelligentPostClient = init.newIntelligentGetClient("/rpc/oauth2/getuserinfo_bycode.json");OapiRpcOauth2GetuserinfoBycodeJsonRequest oapiRpcOauth2DingtalkAppUserJsonRequest = new OapiRpcOauth2GetuserinfoBycodeJsonRequest ();//登录access_tokenoapiRpcOauth2DingtalkAppUserJsonRequest.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@Getterpublic 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就可以了。
在这里插入图片描述
剩下的二维码和对接就交给前端的同事来对接就好了。

参考链接

专有钉钉

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

儿童护眼灯什么牌子好点?五款儿童护眼灯品牌推荐

儿童护眼灯什么牌子好点&#xff1f;根据往年的统计&#xff0c;我国青少年近视率位居世界第一&#xff0c;儿童青少年总体近视率达到了52.7%。其中&#xff0c;6岁儿童的近视率为14.5%&#xff0c;小学生为36.0%&#xff0c;初中生为71.6%&#xff0c;高中生为81%。造成近视的…

基于STM32的位置速度环PID控制伺服电机转动位置及程序说明

PID控制原理 PID控制原理是一种广泛应用于工业自动化和其他领域的控制算法。PID控制器的名字来源于其三个主要组成部分&#xff1a;比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&#xff09;和微分&#xff08;Derivative&#xff09;。PID控制器实现…

Go方法特性详解:简单性和高效性的充分体现

本文深入探讨了Go语言中方法的各个方面&#xff0c;包括基础概念、定义与声明、特性、实战应用以及性能考量。文章充满技术深度&#xff0c;通过实例和代码演示&#xff0c;力图帮助读者全面理解Go方法的设计哲学和最佳实践。 关注作者&#xff0c;分享互联网架构、云服务技术的…

excle中数据分析,excle导入用sql简单处理

前言&#xff1a; 办法一&#xff1a;直接用excle导入db就行&#xff0c;如果excle导如db不能用&#xff0c;就用笨办法下面这个方法去做 1、从系统中导出excle 2、db中插入相应的表和标题 3、先手动插入条件&#xff0c;把insert语句复制出来 INSERT INTO test.test (orders…

【人工智能】第五部分:ChatGPT的实际应用案例和未来发展方向

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Linux基础 (十三):计算机网络基础概论

一、网络基本概念 1.1 网络 把独立自主的计算机通过传输介质和网络设备链接起来&#xff0c;就构成一个网络 &#xff0c;网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 网络设备有&#xff1a;交换机、…

名字能化解命中的劫数,你可知道?

老师&#xff0c;是我们全社会都要尊重的职业&#xff0c;教书育人培养着优秀人才。然而&#xff0c;在她人生最脆弱的时候&#xff0c;学校却解除了与她的劳动关系&#xff0c;再次给她“致命一击”&#xff0c;她所遭受的不公待遇和供职学校的冷漠&#xff0c;引发了社会极大…

【Vue】——前端框架的基本使用

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

聊 · Flutter

曾经的团队是国内最早投入Flutter框架怀抱的团队&#xff0c;后来又有机会负责起了Flutter相关项目&#xff0c;翻回以前写的文章&#xff0c;感慨良多&#xff0c;这是其中的一篇关于这些内容的闲聊。 | 导语Flutter相关的技术资源官网和网友都有过系统且细致的整理&#xff0…

GIT安装以及详细操作流程

一、Git的安装 Git支持Linux、Windows和Mac系统&#xff0c;安装Git&#xff0c;可以到Git官方网站直接下载安装程序。 Git仓库的基本概念和流程 什么是版本库&#xff1f;版本库又名仓库&#xff0c;英文名repository,你可以简单的理解一个目录&#xff0c;这个目录里面的所…

element-plus表格添加简单右键

实现如下 <template><main class"mainClass" > <el-table :data"tableData" style"width: 100%"row-contextmenu"rowContextmenu"cell-contextmenu"cellContextmenu"contextmenu.prevent><el-table-c…

【全开源】Shopro社区团购(小程序版)

邻里间的购物新选择 基于Fastadmin后端管理系统Uniapp客户端&#xff08;仅支持微信小程序&#xff09;开发&#xff0c;生鲜果蔬社区团购的不二之选、快速搭建社区团购平台、让你的产品走进上千个社区。线上团购线下自提&#xff0c;玩转社区消费新模式提供专业、优质的社区团…

openh264 编码命令行工具源码分析

openh264 OpenH264 是由 Cisco 公司发布的一个开源的 H.264 编码和解码器。它提供了命令行工具&#xff0c;可以用于对视频进行编码和解码操作。 使用说明 openh264 编码命令行工具可以使用命令行或 config 配置进行编码操作。编译和使用方法具体可以参考 Windows11编译open…

easyexcel将csv转为excel处理数字问题

使用easyexcel可以将csv格式的文件转为.xlsx文件&#xff0c;但是csv中有很多数字&#xff0c;比如&#xff1a;"123","12.34","-111"&#xff0c;默认情况下会将其作为字符串写入.xlsx文件&#xff0c;就如同下面一样&#xff0c;字符类型的数字…

国产SDI/功能与GV7600/GS2972类似

是一款传递数字标清和高清信号的数字视频发送器&#xff0c;功能与GV7600/GS2972类似&#xff0c;集成了线缆驱动器&#xff0c;可以使用 75 欧姆的同轴线缆传递525i&#xff0c;625i&#xff0c;720P&#xff0c;1080P。 支持的速率如下&#xff1a; 如需更多资料请留言哦&am…

【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置_配置文件分类(详细)

文章目录 1.三种配置文件2. yaml语法2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环境开发控制 4. 配置文件分类 1.三种配置文件 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 比如&#xf…

python11 序列的相关操作

枚举遍历 序列的相关操作 text "hello,python" # in 判断字符是否在序列中&#xff0c;存在返回true,否则返回false print(p是否存在:,(p in text)) print(a是否存在:,(a in text)) # not in 判断字符不在序列中&#xff0c;不存在返回true,否则返回false print(p不…

2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

2024年数字化经济与金融创新国际学术会议&#xff08;ICDEFI 2024&#xff09; 会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者&#xff0c;共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿…

如何理解 Java 8 引入的 Lambda 表达式及其使用场景

Lambda表达式是Java 8引入的一项重要特性&#xff0c;它使得编写简洁、可读和高效的代码成为可能。Lambda表达式本质上是一种匿名函数&#xff0c;能够更简洁地表示可传递的代码块&#xff0c;用于简化函数式编程的实现。 一、Lambda表达式概述 1. 什么是Lambda表达式 Lambd…

【STM32】STM32F103C6T6标准外设库

1、标准外设库获取 第一步&#xff0c;首先获取标准外设库&#xff0c;可以从官网进行下载。 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 根据自己的型号选择不同的系列&#xff0c;我这里选择是STM32F1系列 下载最新版本V3.6&a…