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


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

    版权:本文提供大家参考学习,如需转载,请附上本文链接。 

    目录

    介绍

    一 、专有钉钉

    二、准备工作

    开发阶段

    一、开发环境

    二、参数配置

    三、代码开发

    1、获取token

    2、获取临时授权码

    三、获取用户信息


    介绍

    一 、专有钉钉

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

    二、准备工作

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

    传送门:专有钉钉门户 (dg-work.cn)

    创建好账号后,可以创建一个项目,如图:

    钉钉专有版开放平台开发者后台 (dg-work.cn)

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

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

    开发阶段

    一、开发环境

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

    依赖:

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. <optional>trueoptional>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.httpcomponentsgroupId>
    8. <artifactId>httpclientartifactId>
    9. <version>4.5.6version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.oracelgroupId>
    13. <artifactId>zwdd-sdk-javaartifactId>
    14. <version>1.2.0version>
    15. dependency>
    16. <dependency>
    17. <groupId>com.aliyungroupId>
    18. <artifactId>dingtalkartifactId>
    19. <version>1.3.23version>
    20. dependency>
    21. <dependency>
    22. <groupId>org.assertjgroupId>
    23. <artifactId>assertj-coreartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.apache.commonsgroupId>
    27. <artifactId>commons-lang3artifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>joda-timegroupId>
    31. <artifactId>joda-timeartifactId>
    32. <version>2.10version>
    33. dependency>
    34. <dependency>
    35. <groupId>com.alibabagroupId>
    36. <artifactId>fastjsonartifactId>
    37. <version>1.2.54version>
    38. dependency>

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

    1. <dependency>
    2. <groupId>com.oracelgroupId>
    3. <artifactId>zwdd-sdk-javaartifactId>
    4. <version>1.2.0version>
    5. dependency>

    sdk(jar包)下载:专有钉钉门户 (dg-work.cn)

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

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

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

    二、参数配置

    先在yml文件中做好配置:

    1. #专有钉钉参数
    2. zzdingTalk :
    3. appKey : xxxxxxxxxxxxxxx
    4. appSecret : xxxxxxxxxxxxxxxxx
    5. domainName : openplatform.dg-work.cn
    6. protocal : https
    7. tenantId : 1111111

    参数说明:

    appKey 、appSecret : 为创建应用的秘钥

     domainName:调用服务的域名

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

    tenantId :为租户id,简单点说就是你登陆的账号id

    如何知道你的tenantId呢?你可以在钉钉专有版开放平台开发者后台 (dg-work.cn)这个页面右击查看源代码,如图找到tenantId。

    三、代码开发

    1、获取token

    1. import com.alibaba.fastjson.JSONArray;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationListOrganizationsByCodesRequest;
    4. import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationListOrganizationsByCodesResponse;
    5. import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
    6. import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
    7. import com.alibaba.xxpt.gateway.shared.client.http.IntelligentPostClient;
    8. import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
    9. import lombok.extern.slf4j.Slf4j;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import org.springframework.beans.factory.annotation.Value;
    12. import org.springframework.data.redis.core.RedisTemplate;
    13. import org.springframework.stereotype.Service;
    14. import org.springframework.util.CollectionUtils;
    15. import java.util.ArrayList;
    16. import java.util.Arrays;
    17. import java.util.List;
    18. import java.util.concurrent.TimeUnit;
    19. import java.util.stream.Collectors;
    20. /***
    21. * 浙政钉通讯
    22. */
    23. @Service
    24. @Slf4j
    25. public class DingTalkService {
    26. @Value("${zzdingTalk.domainName}")
    27. private String domainName;
    28. @Value("${zzdingTalk.appKey}")
    29. private String appKey;
    30. @Value("${zzdingTalk.appSecret}")
    31. private String appSecret;
    32. @Value("${zzdingTalk.protocal}")
    33. private String protocal;
    34. @Value("${zzdingTalk.tenantId}")
    35. private String tenantId;
    36. @Autowired
    37. private RedisTemplate redisTemplate;
    38. /***
    39. * 获取浙政钉token
    40. * @return
    41. */
    42. public String getToken() {
    43. if (redisTemplate.hasKey("dingTalkToken")) {
    44. return redisTemplate.opsForValue().get("dingTalkToken").toString();
    45. }
    46. ExecutableClient executableClient = ExecutableClient.getInstance();
    47. executableClient.setDomainName(domainName);
    48. executableClient.setProtocal(protocal);
    49. executableClient.setAccessKey(appKey);
    50. executableClient.setSecretKey(appSecret);
    51. executableClient.init();
    52. //executableClient要单例,并且使用前要初始化,只需要初始化一次
    53. String api = "/gettoken.json";
    54. GetClient getClient = executableClient.newGetClient(api);
    55. //调用API
    56. String apiResult = getClient.get();
    57. log.info("获取浙政钉token:{}", apiResult);
    58. JSONObject jsonObject = JSONObject.parseObject(apiResult);
    59. String token = "";
    60. Integer expiresIn = 0;
    61. if (jsonObject.getBoolean("success")) {
    62. token = jsonObject.getJSONObject("content").getJSONObject("data").getString("accessToken");
    63. expiresIn = jsonObject.getJSONObject("content").getJSONObject("data").getInteger("expiresIn");
    64. redisTemplate.opsForValue().set("dingTalkToken", token, expiresIn, TimeUnit.SECONDS);
    65. }
    66. return token;
    67. }
    68. }

    返回参数:

    log.info("获取浙政钉token:{}", apiResult);返回如下:
    1. {
    2. "success":true,
    3. "content":{
    4. "data":{
    5. "accessToken":"c139fe44362f41b6b84862ec82ab84d9",
    6. "expiresIn":"7200"
    7. },
    8. "requestId":"df04428415724925400701038d663a",
    9. "responseMessage":"OK",
    10. "responseCode":"0",
    11. "success": true
    12. }
    13. }

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

    2、获取临时授权码

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

    1. 小程序获取免登授权码
    2. 使用说明
    3. npm install gdt-jsapi
    4. 推荐使用 npm 包形式按需引入,小程序可以通过以下方式进行引入
    5. import dd from 'gdt-jsapi';
    6. dd.getAuthCode({}).then(res =>{
    7. console.log(res)
    8. }).
    9. catch(err =>{})

    3、获取用户信息

    1. /***
    2. * 获取用户信息
    3. * @param code 临时授权码
    4. * @return
    5. */
    6. public JSONObject getDingTalk(String code) {
    7. String accessToken = getToken();
    8. ExecutableClient executableClient = ExecutableClient.getInstance();
    9. executableClient.setDomainName(domainName);
    10. executableClient.setProtocal(protocal);
    11. executableClient.setAccessKey(appKey);
    12. executableClient.setSecretKey(appSecret);
    13. executableClient.init();
    14. String api = "/rpc/oauth2/dingtalk_app_user.json";
    15. PostClient postClient = executableClient.newPostClient(api);
    16. postClient.addParameter("access_token", accessToken);
    17. postClient.addParameter("auth_code", code);
    18. String apiResult = postClient.post();
    19. log.info("获取浙政钉获取用户信息:{}", apiResult);
    20. return JSONObject.parseObject(apiResult);
    21. }

    返回参数:

    1. {
    2. "success":true,
    3. "content":{
    4. "data":{
    5. "accountId":93,
    6. "lastName":"洪阳",
    7. "clientId":"mozi-developer-center",
    8. "realmId":57,
    9. "openid":"6f1a885a4020f3624b71570b74925d7b",
    10. "realmName":"绣花针测试租户",
    11. "namespace":"local",
    12. "nickNameCn":"洪阳",
    13. "tenantUserId":"57$93",
    14. "account":"pishi.hy",
    15. "employeeCode":"pishi.hy"
    16. },
    17. "responseMessage":"成功",
    18. "responseCode":"0",
    19. "success":true
    20. }
    21. }

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

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

  • 相关阅读:
    3298:练50.1 查分程序《信息学奥赛一本通编程启蒙(C++版)》
    重读Java设计模式: 适配器模式解析
    编译原理—计算三地址码、布尔语句翻译
    基于黄金正弦算法优化概率神经网络PNN的分类预测 - 附代码
    gin项目对于favicon.ico请求的处理
    go与java
    神经网络ppt不足之处怎么写,神经网络ppt免费下载
    进程控制3——进程程序替换
    vim中粘贴代码片段出现每行新增缩进的解决方法-set paste
    Vue中添加旋转动画
  • 原文地址:https://blog.csdn.net/qq_23126581/article/details/126529774