Эх сурвалжийг харах

企业微信回调接口配置, 增加cropid 接收id 日志打印

zhouy 1 жил өмнө
parent
commit
08a819ae47

+ 62 - 0
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/DevSDK.java

@@ -0,0 +1,62 @@
+package com.usoftchina.qywx.sdk;
+
+import com.usoftchina.qywx.sdk.config.QywxProperties;
+import com.usoftchina.qywx.sdk.dto.GetOpenCorpIDResp;
+import com.usoftchina.qywx.sdk.dto.GetProviderTokenResp;
+import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
+
+/**
+ * 代开发应用相关应用功能
+ * */
+public class DevSDK  extends BaseSdk {
+
+    private String providerCropId;
+
+    private String providerSecret;
+
+    public String getProviderCropId() {
+        return providerCropId;
+    }
+
+    public void setProviderCropId(String providerCropId) {
+        this.providerCropId = providerCropId;
+    }
+
+    public String getProviderSecret() {
+        return providerSecret;
+    }
+
+    public void setProviderSecret(String providerSecret) {
+        this.providerSecret = providerSecret;
+    }
+
+    public DevSDK(QywxProperties properties) {
+        super(properties);
+    }
+    public DevSDK(QywxProperties properties , String providerCropId , String providerSecret) {
+        super(properties);
+        this.providerCropId = providerCropId;
+        this.providerSecret = providerSecret;
+    }
+    //获取服务商凭证
+    public GetProviderTokenResp getProviderToken() {
+        ResponseEntity<GetProviderTokenResp> resp = restTemplate.postForEntity(
+                baseUrl + "/cgi-bin/service/get_provider_token",
+                new ModelMap("corpid", this.providerCropId).addAttribute("provider_secret", this.providerSecret),
+                GetProviderTokenResp.class);
+        assertOK(resp);
+        return resp.getBody();
+    }
+
+    //获取企业主体的明文corpid转换为服务商主体的密文corpid
+    public GetOpenCorpIDResp getCorpid_to_openCorpid(String cropId, String providerToken) {
+        ResponseEntity<GetOpenCorpIDResp> resp = restTemplate.postForEntity(
+                baseUrl + "cgi-bin/service/corpid_to_opencorpid?provider_access_token={access_token}",
+                new ModelMap("corpid", cropId),
+                GetOpenCorpIDResp.class,
+                new ModelMap("access_token", providerToken));
+        assertOK(resp);
+        return resp.getBody();
+    }
+}

+ 13 - 0
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/dto/GetOpenCorpIDResp.java

@@ -0,0 +1,13 @@
+package com.usoftchina.qywx.sdk.dto;
+
+public class GetOpenCorpIDResp extends BaseResp {
+    private String  open_corpid;
+
+    public String getOpen_corpid() {
+        return open_corpid;
+    }
+
+    public void setOpen_corpid(String open_corpid) {
+        this.open_corpid = open_corpid;
+    }
+}

+ 22 - 0
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/dto/GetProviderTokenResp.java

@@ -0,0 +1,22 @@
+package com.usoftchina.qywx.sdk.dto;
+
+public class GetProviderTokenResp extends BaseResp {
+    private String provider_access_token;
+    private Long expires_in;
+
+    public String getProvider_access_token() {
+        return provider_access_token;
+    }
+
+    public void setProvider_access_token(String provider_access_token) {
+        this.provider_access_token = provider_access_token;
+    }
+
+    public Long getExpires_in() {
+        return expires_in;
+    }
+
+    public void setExpires_in(Long expires_in) {
+        this.expires_in = expires_in;
+    }
+}

+ 2 - 0
qywx-sdk/src/main/java/com/usoftchina/qywx/sdk/util/QywxConst.java

@@ -8,4 +8,6 @@ public class QywxConst {
     public static final String API_BASE_URL = "https://qyapi.weixin.qq.com";
 
     public static final String OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize";
+
+    public static final String PROVIDER_TOKEN = "provider_token_key";
 }

+ 7 - 1
uas-office-qywx-server/src/main/resources/application.yaml

@@ -35,4 +35,10 @@ spring:
 logging:
   path: ${user.home}/.office/logs/
   level:
-    com.usoftchina.uas.office: debug
+    com.usoftchina.uas.office: debug出
+qywx:
+  provider:
+    corpID: wwbb7e27c4decb7872
+    providerSecret: Rp146lRUXs2koJkudYV-TmW0xZrKP1t8ZcMpLLJ8snSQPelgP7WwXO_Omry1DYkL
+    token: fD8frpMuXpkPLUM
+    encodingAESKey: 73euRc0KW5IbOPNmD6IRFqGAYhcCBRUBrIloAPBLvsR

+ 50 - 0
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/config/ProviderConfig.java

@@ -0,0 +1,50 @@
+package com.usoftchina.uas.office.qywx.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "qywx.provider")
+public class ProviderConfig {
+    //服务商企业ID
+    private String corpID;
+    //服务密钥
+    private String providerSecret;
+
+    //回调token
+    private String token;
+    //回调密钥
+    private String encodingAESKey;
+
+    public String getCorpID() {
+        return corpID;
+    }
+
+    public void setCorpID(String corpID) {
+        this.corpID = corpID;
+    }
+
+    public String getProviderSecret() {
+        return providerSecret;
+    }
+
+    public void setProviderSecret(String providerSecret) {
+        this.providerSecret = providerSecret;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getEncodingAESKey() {
+        return encodingAESKey;
+    }
+
+    public void setEncodingAESKey(String encodingAESKey) {
+        this.encodingAESKey = encodingAESKey;
+    }
+}

+ 7 - 0
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/config/QywxConfig.java

@@ -56,6 +56,13 @@ public class QywxConfig {
         return new ScheduleSdk(qywxProperties());
     }
 
+    @Bean
+    public DevSDK devSDK(){
+        return new DevSDK(qywxProperties());
+    }
+    @Autowired
+    private ProviderConfig providerConfig;
+
     @Autowired
     private QywxProperties qywxProperties;
 

+ 52 - 16
uas-office-qywx/src/main/java/com/usoftchina/uas/office/qywx/manage/service/QywxCallbackService.java

@@ -1,17 +1,26 @@
 package com.usoftchina.uas.office.qywx.manage.service;
 
 import com.alibaba.fastjson.JSON;
+import com.usoftchina.qywx.sdk.DevSDK;
+import com.usoftchina.qywx.sdk.dto.GetProviderTokenResp;
+import com.usoftchina.qywx.sdk.util.QywxConst;
 import com.usoftchina.qywx.sdk.weixin.AesException;
 import com.usoftchina.qywx.sdk.weixin.WXBizJsonMsgCrypt;
 import com.usoftchina.uas.office.dto.Result;
 import com.usoftchina.uas.office.entity.DataCenter;
 import com.usoftchina.uas.office.jdbc.DataSourceHolder;
+import com.usoftchina.uas.office.qywx.config.ProviderConfig;
 import com.usoftchina.uas.office.service.AbstractService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.concurrent.TimeUnit;
 
 @Service
 public class QywxCallbackService extends AbstractService {
@@ -20,24 +29,23 @@ public class QywxCallbackService extends AbstractService {
     @Lazy
     private QywxSettingService settingService;
 
+    @Autowired
+    private ProviderConfig providerConfig;
+    @Autowired
+    @Lazy
+    private RedisTemplate redisTemplate;
+
+    @Autowired
+    private DevSDK devSDK;
+
     private final Logger logger = LoggerFactory.getLogger(QywxCallbackService.class);
 
     public String verifyURL(String msgSignature, Integer timestamp, String nonce, String echostr){
         //TODO 获取参数回调配置
-        String sToken = "fD8frpMuXpkPLUM";
-        String sEncodingAESKey = "73euRc0KW5IbOPNmD6IRFqGAYhcCBRUBrIloAPBLvsR";
-        String sCorpID = "wwbb7e27c4decb7872";
-        DataCenter dataCenter = DataCenter.INSTANCE;
-        try {
-            DataSourceHolder.set(dataCenter);
-            sCorpID = settingService.find().getCorpId();
-        } finally {
-            DataSourceHolder.clear();
-        }
         String callBackStr = null;
         try {
-            logger.info("企业微信MsgCrypt sToken {} sEncodingAESKey{} sCorpID{}", sToken, sEncodingAESKey, sCorpID);
-            WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(sToken, sEncodingAESKey, sCorpID);
+            logger.info("企业微信MsgCrypt sToken {} sEncodingAESKey{} sCorpID{}", providerConfig.getToken() , providerConfig.getEncodingAESKey(), getCropId());
+            WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(providerConfig.getToken(), providerConfig.getEncodingAESKey() , getCropId());
             callBackStr = wxcpt.VerifyURL(msgSignature, String.valueOf(timestamp),
                     nonce, echostr);
         } catch (AesException e) {
@@ -49,13 +57,10 @@ public class QywxCallbackService extends AbstractService {
 
     public String callBack(String msgSignature, String timestamp, String nonce, String jsonMsg){
         //TODO 获取参数回调配置
-        String sToken = "fD8frpMuXpkPLUM";
-        String sEncodingAESKey = "73euRc0KW5IbOPNmD6IRFqGAYhcCBRUBrIloAPBLvsR";
-        String sCorpID = "wwbb7e27c4decb7872";
         String decryptMsg = null;
         logger.info("企业微信CallBack POST ");
         try {
-            WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(sToken, sEncodingAESKey, sCorpID);
+            WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(providerConfig.getToken(), providerConfig.getEncodingAESKey(), getCropId());
             decryptMsg = wxcpt.DecryptMsg(msgSignature, timestamp, nonce, jsonMsg);
             logger.info("企业微信CallBack POST {}", decryptMsg);
             JSON.parseObject(decryptMsg);
@@ -66,5 +71,36 @@ public class QywxCallbackService extends AbstractService {
 
         return null;
     }
+
+    /**
+     *  获取服务商授权Token
+     * */
+    public String getProviderToken(){
+       String providerToken = String.valueOf(redisTemplate.opsForValue().get("QywxProviderToken"));
+       if(StringUtils.isEmpty(providerToken)){
+           GetProviderTokenResp resp = devSDK.getProviderToken();
+           providerToken = resp.getProvider_access_token();
+           redisTemplate.opsForValue().set(QywxConst.PROVIDER_TOKEN, providerToken , resp.getExpires_in(), TimeUnit.SECONDS);
+       }
+       return providerToken;
+    }
+    /**
+     * 获取企业cropID
+     * */
+    private  String getCropId () {
+        String sCorpID = "";
+        DataCenter dataCenter = DataCenter.INSTANCE;
+        try {
+            DataSourceHolder.set(dataCenter);
+            sCorpID = settingService.find().getCorpId();
+        } finally {
+            DataSourceHolder.clear();
+        }
+        if(!providerConfig.getCorpID().equals(sCorpID)) {
+            //当前回调用户不为服务商时,企业corpID 为密文 详见https://developer.work.weixin.qq.com/document/path/97104
+            sCorpID = devSDK.getCorpid_to_openCorpid(sCorpID, getProviderToken()).getOpen_corpid();
+        }
+        return sCorpID;
+    }
 }