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

背景

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

流程

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

准备工作

创建应用

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

在这里插入图片描述

设置回调

应用创建成功之后点击详情
在这里插入图片描述
凭证与基础信息 中的 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…

Linux 命令 `diff` 的深度解析

Linux 命令 diff 的深度解析 在 Linux 系统中&#xff0c;diff 命令是一个非常重要的工具&#xff0c;用于比较两个文件或目录的差异。无论是代码审查、版本控制还是日常的文件管理&#xff0c;diff 命令都能为我们提供极大的便利。下面&#xff0c;我们将详细解析 diff 命令的…

呼叫中心系统一些常用的功能都有哪些?okcc呼叫中心磐石云pscc呼叫中心

批量上传数据 号码、客户信息一键导入&#xff0c;自动识别归属地等信息&#xff0c;可指定范围呼叫号码。 可视化流程编辑 在线可视化流程编辑&#xff0c;仅需轻轻拖拽便可创建外呼话术流程&#xff0c;话术预览、设置机器人回答机制、外呼测试一步搞定&#xff01; 真人声音…

Objective-C相关开发中, 为什么 delegate protocol 不建议单独写一个头文件 ?

概述 将 delegate protocol 定义放在与相关类的头文件中&#xff0c;有助于保持代码组织的一致性、减少编译依赖、避免命名冲突&#xff0c;并增强逻辑上的一致性。这些因素综合起来&#xff0c;使得这种做法在 Objective-C 开发中被广泛推荐。 在 Objective-C 开发中&#xf…

动态规划详细解释

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种用于解决复杂问题的算法思想&#xff0c;特别适用于具有重叠子问题和最优子结构性质的问题。它通过将问题分解为更小的子问题&#xff0c;并保存这些子问题的解以避免重复计算&#xff0c;从而提高…

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

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

HR问你为什么从上家公司离职,你该如何应对?

离职这件事,大佬曾经说过,要么是钱没给到位,要么是心受委屈了。但其实现实场景中,离职原因多种多样,比如这些北漂一组们,不想在北京了,要回老家了,或者要去天津了,这也算一种原因吧。比如考上公务员了,你说如果是你,你会不会离职呢?比如某个同事干测试,经过学习一…

【Javascript系统学习】(二)

函数 定义函数 函数提升仅适用于函数声明&#xff0c;而不适用于函数表达式 函数声明 函数表达式 //例子1 const factorial function fac(n) {return n < 2 ? 1 : n * fac(n - 1); };console.log(factorial(3)); // 6 //factorial(n)、fac(n)、arguments.callee() ----…

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

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

MySQL多表查询分类

1.连接查询 内连接:查询多张表的交集部分&#xff0c;只有在两个表中都有匹配的字段值时&#xff0c;记录才会返回。 以下是一个简单的MySQL内连接查询示例&#xff1a; 假设我们有两个表&#xff0c;一个是员工表 employees 和一个是部门表 departments。 employees 表: …

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

老师&#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…

『大模型笔记』Transformer的几种高效自注意力(降低计算复杂度的方法)!

Transformer的几种高效自注意力(降低计算复杂度的方法)! 文章目录 一. 快速回顾一下注意力机制二. 有哪些技术可以用来提高注意力的效率1. Sparse attention(1) 算法原理:Strided Attention & Fixed Attention(2) 复杂度分析: O ( N N p

关于ASPICE 4.0评估师资质更新的说明-亚远景科技

什么时候能查到ASPICE评估师4.0资质的更新&#xff1f; 从2024年7月1日起&#xff0c;您的官方认证记录中将会注明您所具备的Automotive SPICE版本&#xff08;3.1或4.0&#xff09;。这将适用于您在www.intacs.info上的评估师档案以及您的个人认证文件&#xff08;证书和评估…

黄仁勋:打破摩尔定律,机器人时代来了

6月2日&#xff0c;英伟达联合创始人兼首席执行官黄仁勋在Computex 2024&#xff08;2024台北国际电脑展&#xff09;上发表主题演讲&#xff0c;分享了人工智能时代如何助推全球新产业革命。 以下为本次演讲的要点&#xff1a; ①黄仁勋展示了最新量产版Blackwell芯片&#…

聊 · Flutter

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

GIT安装以及详细操作流程

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