【浙政钉】第一篇:企业内应用免登

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 介绍如何对接浙政钉。

专有钉钉为浙政钉的测试平台,接下来为大家介绍如何对接浙政钉。

image.png

介绍

一 、专有钉钉

专有钉钉是什么?专有钉钉是个开放的saas平台,用于对接浙政钉的测试平台,接口等和浙政钉正式环境一样。

二、准备工作

对接浙政钉之前,需要申请专有钉钉的ISV账号,这个账号是以单位为主进行创建。

传送门:https://openplatform-portal.dg-work.cn/portal/#/ISVRegisterLogin

image.png

创建好账号后,可以创建一个项目,如图:
https://openplatform-portal.dg-work.cn/devPage/#/appDev/myApp

image.png

然后就是对创建的项目进行配置,如图:

image.png

好了,到此就正式介绍完毕了。

开发阶段

三、开发环境

开发工具:idea 开发语言:Java 使用框架:SpringBoot

依赖:

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.oracel</groupId>
            <artifactId>zwdd-sdk-java</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dingtalk</artifactId>
            <version>1.3.23</version>
        </dependency>

        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </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.54</version>
        </dependency>

注意:依赖这个依赖是我自己生成在maven中的,你们可以根据自己maven仓库生成到具体文件夹

<dependency>
            <groupId>com.oracel</groupId>
            <artifactId>zwdd-sdk-java</artifactId>
            <version>1.2.0</version>
</dependency>

sdk(jar包)下载:https://openplatform-portal.dg-work.cn/portal/#/helpdoc?apiType=TOOL_SOURCES&docKey=3355368

image.png

jar生成maven依赖命令,我这边以为上面说的依赖来


mvn install:install-file -Dfile=D:\jar\zwdd-sdk-java-1.2.0.jar -DgroupId=com.oracel -DartifactId=zwdd-sdk-java
-Dversion=1.2.0 -Dpackaging=jar

路径:D:\jar\zwdd-sdk-java-1.2.0.jar 我是下载jar包的路径,可以根据自己的来。

四、参数配置

先在yml文件中做好配置:

#专有钉钉参数
zzdingTalk :
  appKey : xxxxxxxxxxxxxxx
  appSecret : xxxxxxxxxxxxxxxxx
  domainName : openplatform.dg-work.cn
  protocal : https
  tenantId : 1111111

参数说明:
appKey 、appSecret : 为创建应用的秘钥

image.png

domainName:调用服务的域名

服务端     |            域名
浙政钉    | openplatform-pro.ding.zj.gov.cn
专有钉钉    |  openplatform.dg-work.cn

tenantId :为租户id,简单点说就是你登陆的账号id
如何知道你的tenantId呢?你可以在钉钉专有版开放平台开发者后台 (dg-work.cn)这个页面https://openplatform-portal.dg-work.cn/devPage/#/appDev/myApp 右击查看源代码,如图找到tenantId。
image.png

五、代码开发

1、获取token

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationListOrganizationsByCodesRequest;
import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationListOrganizationsByCodesResponse;
import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
import com.alibaba.xxpt.gateway.shared.client.http.IntelligentPostClient;
import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/***
 * 浙政钉通讯
 */
@Service
@Slf4j
public class DingTalkService {
   
   

    @Value("${zzdingTalk.domainName}")
    private String domainName;
    @Value("${zzdingTalk.appKey}")
    private String appKey;
    @Value("${zzdingTalk.appSecret}")
    private String appSecret;
    @Value("${zzdingTalk.protocal}")
    private String protocal;
    @Value("${zzdingTalk.tenantId}")
    private String tenantId;

    @Autowired
    private RedisTemplate redisTemplate;


    /***
     * 获取浙政钉token
     * @return
     */
    public String getToken() {
   
   
        if (redisTemplate.hasKey("dingTalkToken")) {
   
   
            return redisTemplate.opsForValue().get("dingTalkToken").toString();
        }
        ExecutableClient executableClient = ExecutableClient.getInstance();
        executableClient.setDomainName(domainName);
        executableClient.setProtocal(protocal);
        executableClient.setAccessKey(appKey);
        executableClient.setSecretKey(appSecret);
        executableClient.init();
        //executableClient要单例,并且使用前要初始化,只需要初始化一次
        String api = "/gettoken.json";
        GetClient getClient = executableClient.newGetClient(api);
        //调用API
        String apiResult = getClient.get();
        log.info("获取浙政钉token:{}", apiResult);
        JSONObject jsonObject = JSONObject.parseObject(apiResult);
        String token = "";
        Integer expiresIn = 0;
        if (jsonObject.getBoolean("success")) {
   
   
            token = jsonObject.getJSONObject("content").getJSONObject("data").getString("accessToken");
            expiresIn = jsonObject.getJSONObject("content").getJSONObject("data").getInteger("expiresIn");
            redisTemplate.opsForValue().set("dingTalkToken", token, expiresIn, TimeUnit.SECONDS);
        }
        return token;
    }
}

返回参数:

log.info("获取浙政钉token:{}", apiResult);返回如下:
{
   
   
    "success":true,
    "content":{
   
   
        "data":{
   
   
            "accessToken":"c139fe44362f41b6b84862ec82ab84d9",
            "expiresIn":"7200"
        },
        "requestId":"df04428415724925400701038d663a",
        "responseMessage":"OK",
        "responseCode":"0",
        "success": true
    }
}

我的代码中已经解析了json,所以最后只返回token字符串了。

2、获取临时授权码
这个就涉及到前端了,前端可以调用如下代码,新建个页面,然后在专有钉钉内打开你页面的地址。(其他容器打开获取不到),点击 专有钉钉门户 (dg-work.cn)进行查看api。

小程序获取免登授权码
使用说明

npm install gdt-jsapi

推荐使用 npm 包形式按需引入,小程序可以通过以下方式进行引入

import dd from 'gdt-jsapi';

dd.getAuthCode({
   
   }).then(res =>{
   
   
    console.log(res)
}).
catch(err =>{
   
   })

3、获取用户信息

 /***
     * 获取用户信息
     * @param code 临时授权码
     * @return
     */
    public JSONObject getDingTalk(String code) {
   
   
        String accessToken = getToken();
        ExecutableClient executableClient = ExecutableClient.getInstance();
        executableClient.setDomainName(domainName);
        executableClient.setProtocal(protocal);
        executableClient.setAccessKey(appKey);
        executableClient.setSecretKey(appSecret);
        executableClient.init();
        String api = "/rpc/oauth2/dingtalk_app_user.json";
        PostClient postClient = executableClient.newPostClient(api);
        postClient.addParameter("access_token", accessToken);
        postClient.addParameter("auth_code", code);
        String apiResult = postClient.post();
        log.info("获取浙政钉获取用户信息:{}", apiResult);
        return JSONObject.parseObject(apiResult);
    }

返回参数:

{
   
   
    "success":true,
    "content":{
   
   
        "data":{
   
   
            "accountId":93,
            "lastName":"洪阳",
            "clientId":"mozi-developer-center",
            "realmId":57,
            "openid":"6f1a885a4020f3624b71570b74925d7b",
            "realmName":"绣花针测试租户",
            "namespace":"local",
            "nickNameCn":"洪阳",
            "tenantUserId":"57$93",
            "account":"pishi.hy",
            "employeeCode":"pishi.hy"
        },
        "responseMessage":"成功",
        "responseCode":"0",
        "success":true
    }
}

到此处,已经获取到用户信息了,接下来就是对用户的入库,生成对应的token给前端,然后就是一些业务了。

按照如上操作,就已经实现了企业内免登操作了。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
区块链 开发者
教程(1):关于如何上链的简单直接的操作教程
这是一篇关于如何上链的简单直接地操作流程。
1425 0
教程(1):关于如何上链的简单直接的操作教程
|
11天前
|
数据采集 API 开发者
调用API接口获取小红书笔记详情数据(小红书怎么推广)
小红书平台对于其API的使用有严格的规定和限制,并且并非所有的功能和数据都通过公开API提供。关于获取小红书笔记详情的API,以下是一些建议和指导:
|
11天前
|
API Nacos
【想进大厂还不会阅读源码】ShenYu源码-接入注册中心发现服务
ShenYu源码阅读。相信大家碰到源码时经常无从下手🙃,不知道从哪开始阅读😭。我们先思考下我们的阅读线索,贡献者是怎么添加发现服务的。这些发现服务是怎么和项目集成的,让ShenYu网关能从注册中心获取节点信息?
52 1
【想进大厂还不会阅读源码】ShenYu源码-接入注册中心发现服务
|
10月前
|
小程序 安全 定位技术
微信小程序学习实录4(开发前准备、认证必备资料、公众号关联小程序、小程序发布、开发配置、服务器域名、业务域名、位置接口设置)
微信小程序学习实录4(开发前准备、认证必备资料、公众号关联小程序、小程序发布、开发配置、服务器域名、业务域名、位置接口设置)
228 0
阿里云商标智能注册流程(2023新手入门教程)
阿里云商标注册图文教程快速上手笔记,本文以阿里云商标智能注册申请为例,商标智能注册申请需要用户手动填写商标类型、商标名称、商标图样、商标说明及商标分类表选择等操作,流程较为复杂,包括阿里云商标类型、阿里云商标名称、阿里云商标图样、阿里云商标说明、阿里云商标类别选择、阿里云上传商标申请人材料
200 0
阿里云商标智能注册流程(2023新手入门教程)
|
小程序 前端开发 IDE
实战营第4课-搭建企业审批工作流 | 学习笔记
简介:快速学习实战营第4课-搭建企业审批工作流
767 0
实战营第4课-搭建企业审批工作流 | 学习笔记
|
小程序
4.3【微信小程序全栈开发课程】个人中心(三)--操作指引页面
1、创建说明书页面 在第二章讲过创建新页面的步骤,这次再来复习一下 (1)在src/pages文件夹下面新建一个命名为instruction的文件夹,并且在文件夹下创建instruction.vue、main.js两个文件
247 0
4.3【微信小程序全栈开发课程】个人中心(三)--操作指引页面
|
存储 缓存 运维
【云+社区年度征文】基于云开发完成小程序用户注册登录
【云+社区年度征文】基于云开发完成小程序用户注册登录
185 0
【云+社区年度征文】基于云开发完成小程序用户注册登录
|
API
免费开放的API接口 供学习使用
免费开放的API接口 供学习使用
851 0
免费开放的API接口 供学习使用
|
弹性计算 运维 云计算
云上运维最佳实践一览|阿里云产品内容精选(三十九)
本文内容取自阿里云开发者社区ECS版块,云计算时代选云、用云指南,洞察前沿技术趋势、分享云上运维实战经验,云计算开发者的家园。