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

背景

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

流程

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

准备工作

创建应用

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

在这里插入图片描述

设置回调

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

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

相关文章

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译&#xff1a; 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

Vue3中的常见组件通信之mitt

Vue3中的常见组件通信之mitt 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs…

Spring Boot框架基础

文章目录 1 Spring Boot概述2 Spring Boot入门2.1 项目搭建2.2 入门程序 3 数据请求与响应3.1 数据请求3.2 数据响应 4 分层解耦4.1 三层架构4.2 控制反转4.3 依赖注入 5 参考资料 1 Spring Boot概述 Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;是为了解决企业级…

欧美北美南美国外媒体投稿和东南亚中东亚洲媒体海外新闻发稿软文推广营销策略有哪些?

在当今全球化的浪潮中&#xff0c;中国品牌正积极拓展海外市场&#xff0c;寻求更广阔的发展空间。面对国际竞争&#xff0c;有效的海外媒体发稿营销策略对于品牌国际化至关重要。以下是一些关键点和建议&#xff0c;以帮助品牌在海外市场取得成功。 深入了解目标市场&#xf…

11. MySQL 备份、恢复

文章目录 【 1. MySQL 备份类型 】【 2. 备份数据库 mysqldump 】2.1 备份单个数据表2.2 备份多个数据库2.3 备份所有数据库2.4 备份文件解析 【 3. 恢复数据库 mysql 】【 4. 导出表数据 OUTFILE 】【 5. 恢复表数据 INFILE 】 问题背景 尽管采取了一些管理措施来保证数据库的…

【python】unindent does not match any outer indentation level错误的解决办法

【Python】"unindent does not match any outer indentation level"错误的解决办法 在Python编程中&#xff0c;缩进是定义代码块的关键。与其它编程语言使用花括号或特定关键字不同&#xff0c;Python完全依赖缩进来区分代码结构。如果你在编码时遇到了错误信息unin…

stm32编写Modbus步骤

1. modbus协议简介&#xff1a; modbus协议基于rs485总线&#xff0c;采取一主多从的形式&#xff0c;主设备轮询各从设备信息&#xff0c;从设备不主动上报。 日常使用都是RTU模式&#xff0c;协议帧格式如下所示&#xff1a; 地址 功能码 寄存器地址 读取寄存器…

MySQL基础---库的操作和表的操作(配着自己的实操图,简单易上手)

绪论​ 勿问成功的秘诀为何&#xff0c;且尽全力做您应该做的事吧。–美华纳&#xff1b;本章是MySQL的第二章&#xff0c;本章主要写道MySQL中库和表的增删查改以及对库和表的备份处理&#xff0c;本章是基于上一章所写若没安装mysql可以查看Linux下搭建mysql软件及登录和基本…

ubuntu18.04离线安装Mysql

查看系统位数 首先看自己Ubuntu是32还是64位的 sudo uname --m 我是64位。 下载mysql MySQL :: Download MySQL Community Server (Archived Versions) 上传到服务器上 解压 mkdir mysql8 sudo tar -xvf mysql-server_8.0.11-1ubuntu18.04_amd64.deb-bundle.tar -C ./mysql8…

1 c++多线程创建和传参

什么是进程&#xff1f; 系统资源分配的最小单位。 什么是线程&#xff1f; 操作系统调度的最小单位&#xff0c;即程序执行的最小单位。 为什么需要多线程&#xff1f; &#xff08;1&#xff09;加快程序执行速度和响应速度, 使得程序充分利用CPU资源。 &#xff08;2&…

【MySQL】(基础篇二) —— MySQL初始用

MySQL初始用 目录 MySQL初始用基本语法约定选择数据库查看数据库和表其它的SHOW 在Navicat中&#xff0c;大部分数据库管理相关的操作都可以通过图形界面完成&#xff0c;这个很简单&#xff0c;大家可以自行探索。虽然Navicat等图形化数据库管理工具为操作和管理数据库提供了非…

upload-labs-第五关

目录 第五关 1、构造.user.ini文件 2、构造一个一句话木马文件&#xff0c;后缀名为jpg 3、上传.user.ini文件后上传flag.jpg 4、上传成功后访问上传路径 第五关 原理&#xff1a; 这一关采用黑名单的方式进行过滤&#xff0c;不允许上传php、php3、.htaccess等这几类文件…

AB测试学习(附有相关代码)

目录 一、基本概念1. 定义2. 作用3. 原理 二、实验基本原则三、实验步骤四、实验步骤详解1. 确定实验目的2. 确定实验变量3. 实验指标设计3.1 实验指标类型&#xff08;按作用区分&#xff09;3.1.1 核心指标3.1.2 驱动指标&#xff08;跟踪指标&#xff09;3.1.3 护栏指标 3.2…

vue-router全部搞定(附源码)

源码下载链接&#xff08;先转存&#xff0c;后下载&#xff09;&#xff1a;https://pan.quark.cn/s/b0c6edd68c21 怎么用vue-cli搭建项目 我们固然可以用传统htmljs的方式来搭建vue项目&#xff0c;但是如果组件很多&#xff0c;就需要通过Vue.component的方式一个个去引入…

mathematica中针对三维图中的颜色和填充透明度进行指定

颜色指定使用的命令为&#xff1a;PlotStyle 填充的透明度使用的命令为&#xff1a;FillingStyle 示例代码&#xff1a; Clear["Global*"] Plot3D[{Sin[x^2 y], Sin[x^2 - y]}, {x, -2, 2}, {y, -2, 2}, PlotStyle -> {Directive[Red, Specularity[White, 100…

1.VMware软件的安装与虚拟机的创建

1. VMware软件的安装 1.1 为什么需要虚拟机 嵌入式Linux开发需要在Linux系统下运行&#xff0c;我们选择Ubuntu。   1、双系统安装     有问题&#xff0c;一次只能使用一个系统。Ubuntu基本只做编译用。双系统安装不能同时运行Windows和Linux。   2、虚拟机软件   …

Golang Context详解

文章目录 基本介绍context源码剖析Context接口emptyCtxcancelCtxtimerCtxvalueCtx context使用案例协程取消超时控制数据共享 基本介绍 基本介绍 在Go 1.7版本中引入了上下文&#xff08;context&#xff09;包&#xff0c;用于在并发编程中管理请求范围的数据、控制生命周期、…

k8s 1.28 搭建rabbitmq集群

1.环境 1.1 k8s 1.28 1.2 rabbit 3.8 1.3 工作空间default 1.4 注意&#xff0c;内存最好充足一点&#xff0c;因为我就两个节点一个master、一个node&#xff0c;起初我的node是8g&#xff0c;还剩3~4G&#xff0c;集群竟然一直起不来&#xff0c;后来将虚拟机内存扩大&#x…

数字孪生智慧水利:精准管理与智能决策的新时代

图扑数字孪生技术在智慧水利中的应用&#xff0c;通过虚拟模型与真实水利系统的无缝连接&#xff0c;实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力&#xff0c;从洪水预警到水质监测&#xff0c;数字孪生助力各项决策更…

【Meetup】探索Apache SeaTunnel的二次开发与实战案例

在数据科技快速演进的今天&#xff0c;业务场景的复杂化和数据量的激增&#xff0c;推动了大数据技术的迅速发展&#xff0c;在众多开源大数据处理工具中&#xff0c;Apache SeaTunnel以其强大的数据集成能力&#xff0c;成为众多企业的首选。 但随着应用深入&#xff0c;企业面…