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

news2024/11/15 17:58:27

背景

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

流程

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

准备工作

创建应用

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

在这里插入图片描述

设置回调

应用创建成功之后点击详情
在这里插入图片描述
凭证与基础信息 中的 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就可以了。
在这里插入图片描述
剩下的二维码和对接就交给前端的同事来对接就好了。

参考链接

专有钉钉

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

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

相关文章

三维重建,谁才是顶流?

3DGS技术是近年来计算机视觉领域最具突破性的研究成果之一。它不仅在学术界引起了广泛关注&#xff0c;成为计算机视觉、SLAM等领域的研究热点&#xff0c;而且每天都有大量基于Gaussian Splatting的新研究问世。此外&#xff0c;3DGS技术在商业应用方面也取得了显著进展&#…

PPT设置为本框的默认格式以及固定文本框

调整文本框固定位置 双击文本框之后勾选如下三个位置 设置文本框为默认 在调整好文本框的基本性质后&#xff0c;设置为默认即可

2024最新python入门教程|python安装|pycharm安装

前言&#xff1a;在安装PyCharm之前&#xff0c;首先需要明确PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。PyCharm旨在通过提供智能代码补全、语法高亮、代码检查、快速导航和重构等丰富的编码辅助工具&#xff0c…

BypassD: Enabling fast userspace access to shared SSDs——论文泛读

ASPLOS 2024 Paper 论文阅读笔记整理 问题 现代存储设备&#xff0c;如Optane NVMe SSD&#xff0c;提供几微秒的超低延迟和每秒数千GB的高带宽&#xff0c;导致内核软件I/O堆栈是开销的主要来源。例如&#xff0c;Optane SSD可以在4&#x1d707;s内返回4KB块&#xff0c;而…

金融风控模型论文定制服务_研究生博士生毕业论文_小论文_中文核心_CCF_EI会议_AI_人工智能_机器学习

金融风控论文定制服务范围 论文复现案例包括但不限于&#xff1a; 1.个人信贷风控模型 1.1.German Credit德国信用数据集风控模型 1.2.Give me some credit风控模型 1.3.lending club风控信贷模型&#xff08;美国最大P2P平台&#xff0c;目前已转线上银行&#xff09; 1…

针对AlGaN/GaN高电子迁移率晶体管的显式表面电势计算和紧凑电流模型

来源&#xff1a;An Explicit Surface Potential Calculation and Compact Current Model for AlGaN/GaN HEMTs&#xff08;EDL 15年&#xff09; 摘要 在本文中,我们提出了一种新的紧凑模型,用于基于费米能级和表面电位的显式解来描述AlGaN/GaN高电子迁移率晶体管。该模型计算…

Matlab2010安装注册+激活(保姆级教程)

目录 一、软件安装 二、软件激活 三、软件测试 Matlab2010压缩包: 链接&#xff1a;https://pan.baidu.com/s/1bX4weZ0nC-4zlDLUiSKcRQ?pwdxljj 提取码&#xff1a;xljj 一、软件安装 1.解压所给压缩包&#xff0c;目录双击setup.exe打开. (如果用户名为中文则会遇到这个…

使用Flutter开发APP的问题

在使用Flutter进行APP开发时&#xff0c;尽管Flutter提供了许多优势和便利&#xff0c;但也存在一些常见问题和挑战。以下是开发过程中可能遇到的问题以及应对方法&#xff0c;通过充分理解和应对这些问题&#xff0c;可以更好地利用Flutter的优势&#xff0c;开发出高质量的跨…

儿童护眼灯买什么牌子质量好又实惠?儿童品牌台灯质量前十的款式

儿童护眼灯买什么牌子质量好又实惠&#xff1f;在当今时代&#xff0c;电子设备在我们的日常生活中扮演着越来越重要的角色。然而&#xff0c;长时间使用这些设备可能会增加眼睛疲劳和近视的风险。为了解决这一问题&#xff0c;护眼台灯应运而生&#xff0c;并逐渐成为许多家庭…

人工智能_机器学习096_PCA主成分分析降维算法_PCA降维原理_介绍和使用_模式识别_EVD特征值分解_SVD奇异值分解---人工智能工作笔记0221

首先我来看PCA降维,可以看到在图像处理中经常用到PCA,经过对数据进行降维可以去除数据噪声,发现数据中的模式,也就是 发现数据的规律. 这里的模式识别就是 机器学习中的一个分支 就是在数据中找规律的意思 我们使用代码看一下 from sklearn.docomposition import PCA from skl…

通配符SSL证书:保障多子域名安全的明智之选

在数字化时代&#xff0c;网络安全日益成为企业和个人关注的焦点。SSL证书作为保障网络安全的重要手段之一&#xff0c;其种类和功能也日趋多样化。其中&#xff0c;通配符证书&#xff08;也称为泛域名SSL证书&#xff09;以其独特的功能和广泛的应用场景&#xff0c;成为网络…

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 过程&#xff1a; 1 操作流程&#xff1a;页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果&#xff1a;返回页面后页面没有刷新导致用户名还显示着&#xff0c;页面没有发生任何变化&a…

EV24CXXA EEPROM 选型

如何选择一个靠谱的EEPROM? EV24C128A EV24C256A EV24C512A 是用得最多的

k8s集群的存储卷、pvc和pv

目录 简介 简介 PV 全称叫做 Persistent Volume&#xff0c;持久化存储卷。它是用来描述或者说用来定义一个存储卷的&#xff0c;这个通常都是由运维工程师来定义。 PVC 的全称是 Persistent Volume Claim&#xff0c;是持久化存储的请求。它是用来描述希望使用什么样的或者说…

吴恩达2022机器学习专项课程C2W3:2.24 机器学习实践建议(决定下一步做什么模型评估模型选择交叉验证)

目录 引言一、绘图评估模型的局限性二、使用测试集评估模型1.线性回归2.逻辑回归3.测试误差与泛化误差 三、测试集评估模型存在的问题1.评估模型流程2.流程存在的问题 四、解决问题1.训练集分割成三段2.计算交叉验证集的误差 五、重新评估模型1.线性回归模型2.神经网络模型3.评…

Java多线程核心工具类

1.Thread类&#xff1a;代表一个线程。你可以通过继承Thread类或实现Runnable接口来创建线程。 2.Executor框架&#xff1a;java.util.concurrent.Executors和java.util.concurrent.Executor接口提供了一种创建和管理线程池的方法&#xff0c;可以减少在创建和销毁线程上的开销…

[移动通讯]【无线感知-P2】[特征,算法,数据集】

前言&#xff1a; 这里面主要参考清华大学的杨峥教授&#xff0c;做一下无线感知的总结. 基本思想&#xff1a; 无线信号不仅可以传输数据,还可以感知环境信号发射机产生的无线电波 经由直射,反射,散射等多条路径传播,在信号接收机形成的多径叠加信号 携带反映环境特征…

分布式事务Seata中XA和AT模式介绍

Seata中XA和AT模式介绍 分布式事务介绍分布式解决方案解决分布式事务的思路Seata的架构Seata中的XA模式Seata的XA模型流程XA模式优缺点实现XA模式 Seata中的AT模式Seata中的AT模式流程实现AT模式AT模式优缺点 AT模式与XA模式的区别 分布式事务介绍 分布式事务&#xff0c;就是…

基于LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用

LEAP&#xff08;Long Range Energy Alternatives Planning System/ Low emission analysis platform&#xff0c;长期能源可替代规划模型&#xff09;是一种自下而上的能源-环境核算工具&#xff0c;该模型与情景分析法紧密结合&#xff0c;可用于预测不同发展条件下中长期能源…

discuz如何添加主导航

大家好&#xff0c;今天教大家怎么样给discuz添加主导航。方法其实很简单&#xff0c;大家跟着我操作既可。一个网站的导航栏是非常重要的&#xff0c;一般用户进入网站的第一印象就是看网站的导航栏。如果大家想看效果的话可以搜索下网创有方&#xff0c;或者直接点击查看效果…