ToB企服应用市场:ToB评测及商务社交产业平台

标题: 对接专有钉钉(浙政钉)登陆步骤 [打印本页]

作者: 西河刘卡车医    时间: 2024-6-11 12:45
标题: 对接专有钉钉(浙政钉)登陆步骤
配景

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

参考链接中有流程,我这面的话在贴一张流程图

预备工作

创建应用

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


设置回调

应用创建成功之后点击详情

凭证与基础信息 中的 App Key 和App Secret 这二我们后端是需要使用的,先简朴看一下。到时候可以设置成配置。

设置回调地点

回调地点的作用:可参考在流程中政务登陆服务给我们后端临时授权码的那一步。
后端实现

引入第三方jar

  1.         <dependency>
  2.             <groupId>com.alibaba.zwdd</groupId>
  3.             <artifactId>zwdd-sdk</artifactId>
  4.             <version>1.2.0</version>
  5.             <scope>system</scope>
  6.             <systemPath>${project.basedir}/lib/zwdd-sdk-java-1.2.0.jar</systemPath><!--路径-->
  7.         </dependency>
  8.         <dependency>
  9.             <groupId>joda-time</groupId>
  10.             <artifactId>joda-time</artifactId>
  11.             <version>2.10</version>
  12.         </dependency>
  13.         <dependency>
  14.             <groupId>com.alibaba</groupId>
  15.             <artifactId>fastjson</artifactId>
  16.             <version>1.2.47</version>
  17.         </dependency>
  18.         <dependency>
  19.             <groupId>org.apache.commons</groupId>
  20.             <artifactId>commons-lang3</artifactId>
  21.             <version>3.12.0</version>
  22.         </dependency>
  23.         <dependency>
  24.             <groupId>org.apache.httpcomponents</groupId>
  25.             <artifactId>httpclient</artifactId>
  26.             <version>4.5.13</version>
  27.         </dependency>
复制代码
这个zwdd-sdk-java-1.2.0.jar没有在中央仓库中,需要自己下载引入。
下载链接
引入也很简朴,在项目目录创建一个lib文件夹,放进去就可以了。上面有写好怎么引入当地包的。
代码实现

这里我们就实现二个接口,一个是获取token 一个是获取用户信息。
Service接口

  1. public interface ZheJiangDingTalkService {
  2.     /**
  3.      * 获取token
  4.      * @param
  5.      * @return
  6.      */
  7.     String getToken();
  8.     /**
  9.      * 获取用户信息
  10.      * @param authCode
  11.      * @return
  12.      */
  13.     ZheJiangUserInfoApiResult getUserInfo(String accessToken,String authCode);
  14. }
复制代码
Service实现

  1. Service
  2. public class ZheJiangDingTalkServiceImpl implements ZheJiangDingTalkService {
  3.     @Resource
  4.     private DingDingProperties dingDingProperties;
  5.     @Override
  6.     public String getToken() {
  7.         try {
  8.             ExecutableClient executableClient = init();
  9.             return getToken(executableClient);
  10.         } catch (Exception e) {
  11.             e.printStackTrace();
  12.         }
  13.         return null;
  14.     }
  15.     private String getToken(ExecutableClient executableClient) {
  16.         try {
  17.             
  18.             //executableClient保证单例
  19.             PostClient intelligentGetClient = executableClient.newPostClient("/gettoken.json");
  20.             OapiGettokenJsonRequest oapiGettokenJsonRequest = new OapiGettokenJsonRequest();
  21.             //应用的唯一标识key
  22.             oapiGettokenJsonRequest.setAppkey(dingDingProperties.getAppKey());
  23.             //应用的密钥
  24.             oapiGettokenJsonRequest.setAppsecret(dingDingProperties.getAppSecret());
  25.             //获取结果
  26.             String apiResult = intelligentGetClient.post();
  27.             Type type = new TypeToken<ZheJiangTokenApiResult<ZheJiangTokenBaseApiResult>>() {}.getType();
  28.             ZheJiangTokenApiResult<ZheJiangTokenBaseApiResult> tokenApiResult = GsonUtil.stringToBean(apiResult, type);
  29.             if (tokenApiResult.success()) {
  30.                 ZheJiangTokenBaseApiResult.ZheJiangTokenApiResult resultData = tokenApiResult.getContent().getData();
  31.                 String accessToken = resultData.getAccessToken();
  32.                
  33.                 return accessToken;
  34.             }
  35.             return null;
  36.         } catch (Exception e) {
  37.             e.printStackTrace();
  38.         }
  39.         return null;
  40.     }
  41.     @Override
  42.     public ZheJiangUserInfoApiResult getUserInfo(String accessToken,String code) {
  43.         ExecutableClient init = init();
  44.         IntelligentGetClient  intelligentPostClient = init.newIntelligentGetClient("/rpc/oauth2/getuserinfo_bycode.json");
  45.         OapiRpcOauth2GetuserinfoBycodeJsonRequest oapiRpcOauth2DingtalkAppUserJsonRequest = new OapiRpcOauth2GetuserinfoBycodeJsonRequest ();
  46.         //登录access_token
  47.         oapiRpcOauth2DingtalkAppUserJsonRequest.setAccess_token(accessToken);
  48.         //临时授权码 //回调的码
  49.         oapiRpcOauth2DingtalkAppUserJsonRequest.setCode(code);
  50.         //获取结果
  51.         OapiRpcOauth2GetuserinfoBycodeJsonResponse apiResult = intelligentPostClient.get(oapiRpcOauth2DingtalkAppUserJsonRequest);
  52.         String content = apiResult.getContent();
  53.         Type type = new TypeToken<ZheJiangTokenApiResult<ZheJiangBaseApiResult<ZheJiangUserInfoApiResult>>>() {}.getType();
  54.         ZheJiangTokenApiResult<ZheJiangBaseApiResult<ZheJiangUserInfoApiResult>> tokenApiResult = GsonUtil.stringToBean(content, type);
  55.         if(tokenApiResult.success()) {
  56.             return tokenApiResult.getContent().getData();
  57.         }
  58.         return null;
  59.     }
  60.     private ExecutableClient init(){
  61.         ExecutableClient executableClient =ExecutableClient.getInstance();
  62.         executableClient.setAccessKey(dingDingProperties.getAppKey());
  63.         executableClient.setSecretKey(dingDingProperties.getAppSecret());
  64.         executableClient.setDomainName(dingDingProperties.getDomainName());
  65.         executableClient.setProtocal("https");
  66.         executableClient.init();
  67.         return executableClient;
  68.     }
  69. }
复制代码
这里我们使用了Gson和创建了几个对象,这里的代码的话,我简朴贴一下,看你们是否乐意使用,不乐意的话,可自己写的。
工具类

  1. public class GsonUtil {
  2.     /**
  3.      * 不用创建对象,直接使用Gson.就可以调用方法
  4.      */
  5.     private static Gson gson = null;
  6.     private static JsonParser jsonParser = null;
  7.     /**
  8.      * 判断gson对象是否存在了,不存在则创建对象
  9.      */
  10.     static {
  11.         //gson = new Gson();
  12.         // 当使用GsonBuilder方式时属性为空的时候输出来的json字符串是有键值key的,显示形式是"key":null,而直接new出来的就没有"key":null的
  13.         gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
  14.         if(jsonParser == null ){
  15.             jsonParser = new JsonParser();
  16.         }
  17.     }
  18.     private GsonUtil() {}
  19.     }
  20.       /**
  21.      * 将json转成特定的cls的对象
  22.      * @param gsonString
  23.      * @param cls
  24.      * @return
  25.      */
  26.     public static <T> T stringToBean(String gsonString, Class<T> cls) {
  27.         T t = null;
  28.         if (gson != null) {
  29.             //传入json对象和对象类型,将json转成对象
  30.             t = gson.fromJson(gsonString, cls);
  31.         }
  32.         return t;
  33.     }
  34.     public static <T> T stringToBean(String gsonString, Type type) {
  35.         T t = null;
  36.         if (gson != null) {
  37.             //传入json对象和对象类型,将json转成对象
  38.             t = gson.fromJson(gsonString, type);
  39.         }
  40.         return t;
  41.     }
  42. }
  43. @Component
  44. @ConfigurationProperties(prefix = "dingtalk.msg")
  45. @Setter
  46. @Getter
  47. public class DingDingProperties {
  48.    
  49.     public String appKey = "xx";
  50.     public String appSecret = "xxx";
  51.     private String domainName="openplatform.dg-work.cn";
  52. }
复制代码
实体

  1. @Setter
  2. @Getter
  3. @ToString
  4. public class ZheJiangBaseApiResult<T> {
  5.     private T data;
  6.     private boolean success;
  7.     private String requestId;
  8.     private String responseMessage;
  9.     private String responseCode;
  10.     private String bizErrorCode;
  11.     public boolean isSuccess(){
  12.         return ("0").equals(this.bizErrorCode);
  13.     }
  14. }
  15. @Setter
  16. @Getter
  17. @ToString
  18. public class ZheJiangTokenApiResult<T> {
  19.     private T content;
  20.     private String bizErrorCode;
  21.     private boolean success;
  22.     public boolean success(){
  23.         return ("0").equals(this.bizErrorCode) || success;
  24.     }
  25. }
  26. @Setter
  27. @Getter
  28. @ToString
  29. public class ZheJiangTokenBaseApiResult {
  30.     private ZheJiangTokenApiResult data;
  31.     private boolean success;
  32.     private String requestId;
  33.     private String responseMessage;
  34.     private String responseCode;
  35.     private String bizErrorCode;
  36.     @Setter
  37.     @Getter
  38.     public class ZheJiangTokenApiResult {
  39.         private int expiresIn;
  40.         private String accessToken;
  41.     }
  42. }
  43. @Setter
  44. @Getter
  45. @ToString
  46. @NoArgsConstructor
  47. public class ZheJiangUserInfoApiResult {
  48.     public Integer accountId;
  49.     private boolean success;
  50.     public String lastName;
  51.     public String clientId;
  52.     public Integer realmId;
  53.     public String realmName;
  54.     public String namespace;
  55.     public String nickNameCn;
  56.     public String tenantUserId;
  57.     public String account;
  58.     public String employeeCode;
  59.    
  60. }
复制代码
额外的pom文件

  1.     <!-- gson -->
  2.         <dependency>
  3.             <groupId>com.google.code.gson</groupId>
  4.             <artifactId>gson</artifactId>
  5.             <version>2.8.5</version>
  6.         </dependency>
  7.          <dependency>
  8.             <groupId>org.projectlombok</groupId>
  9.             <artifactId>lombok</artifactId>
  10.             <optional>true</optional>
  11.         </dependency>
  12.          <dependency>
  13.             <groupId>org.springframework.boot</groupId>
  14.             <artifactId>spring-boot-starter-web</artifactId>
  15.         </dependency>
复制代码
注意事项

DingDingProperties 中的domainName 记得正式环境更改成openplatform-pro.ding.zj.gov.cn
让客户提供下正式环境下的 app-key和app-secret就可以了。

剩下的二维码和对接就交给前端的同事来对接就好了。
参考链接

专有钉钉

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4