ソースを参照

feat: 重置授权码事件处理

wuwenyi 1 週間 前
コミット
5719e48d26

+ 33 - 12
src/main/java/com/qqflow/engine/domain/ewechat/component/EnterpriseWechatEventHandler.java

@@ -45,25 +45,15 @@ public class EnterpriseWechatEventHandler {
     /** 授权事件 */
     @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='create_auth'")
     public void createAuth(EnterpriseWechatEvent event) {
-
         EnterpriseWechatAuthNotice authNotice = XmlUtil.fromXml(event.getCallbackXml(), EnterpriseWechatAuthNotice.class);
         boolean locked = redissonService.tryLock("hanle-create-auth-event::" + authNotice.getSuiteId());
         if (!locked) return;
         try {
-            String key = SUITE_TICKET_KEY_PREFIX + authNotice.getSuiteId();
-            String suiteTicket = redisCache.getCacheObject(key);
-            Assert.notBlank(suiteTicket, "suite_ticket不存在");
-            EnterpriseWechatSuiteAccessTokenRsp tokenRsp = enterpriseWechatApi.getSuiteAccessToken(
-                    wechatProperties.getSuiteId(), wechatProperties.getSuiteSecret(), suiteTicket);
-            String tokenKey = SUITE_ACCESS_TOKEN_KEY_PREFIX + authNotice.getSuiteId();
-            redisCache.setCacheObject(tokenKey, tokenRsp.getSuiteAccessToken(), tokenRsp.getExpiresIn(), TimeUnit.SECONDS);
-
-            EnterpriseWechatPermanentCodeRsp permanentCodeRsp = enterpriseWechatApi.getPermanentCode(tokenRsp.getSuiteAccessToken(), authNotice.getAuthCode());
+            EnterpriseWechatPermanentCodeRsp permanentCodeRsp = this.fetchPermanentCode(authNotice);
             String corpid = permanentCodeRsp.getAuthCorpInfo().getCorpid();
             EnterpriseWechatCorp wechatCorp = corpMapper.selectByCorpIdAndSuiteId(corpid, authNotice.getSuiteId());
             if (wechatCorp == null) {
-                EnterpriseWechatCorp corp = assembler.assembleCorp(permanentCodeRsp);
-                corpMapper.insert(corp);
+                corpMapper.insert(assembler.assembleCorp(permanentCodeRsp));
             } else {
                 wechatCorp.setPermanentCode(permanentCodeRsp.getPermanentCode());
                 corpMapper.updateById(wechatCorp);
@@ -87,4 +77,35 @@ public class EnterpriseWechatEventHandler {
         redisCache.setCacheObject(key, suiteTicket.getSuiteTicket(), 60 * 30, TimeUnit.SECONDS);
     }
 
+    /** 永久授权码更新事件(企业重新授权时触发) */
+    @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='reset_permanent_code'")
+    public void resetPermanentCode(EnterpriseWechatEvent event) {
+        EnterpriseWechatAuthNotice authNotice = XmlUtil.fromXml(event.getCallbackXml(), EnterpriseWechatAuthNotice.class);
+        boolean locked = redissonService.tryLock("handle-reset-permanent-code::" + authNotice.getSuiteId());
+        if (!locked) return;
+        try {
+            EnterpriseWechatPermanentCodeRsp permanentCodeRsp = this.fetchPermanentCode(authNotice);
+            String corpid = permanentCodeRsp.getAuthCorpInfo().getCorpid();
+            EnterpriseWechatCorp wechatCorp = corpMapper.selectByCorpIdAndSuiteId(corpid, authNotice.getSuiteId());
+            if (wechatCorp != null) {
+                wechatCorp.setPermanentCode(permanentCodeRsp.getPermanentCode());
+                wechatCorp.setCorpName(permanentCodeRsp.getAuthCorpInfo().getCorpName());
+                corpMapper.updateById(wechatCorp);
+            }
+        } finally {
+            redissonService.unlock("handle-reset-permanent-code::" + authNotice.getSuiteId());
+        }
+    }
+
+    /** 获取永久授权码:suite_ticket → suite_access_token → permanent_code */
+    private EnterpriseWechatPermanentCodeRsp fetchPermanentCode(EnterpriseWechatAuthNotice authNotice) {
+        String suiteTicket = redisCache.getCacheObject(SUITE_TICKET_KEY_PREFIX + authNotice.getSuiteId());
+        Assert.notBlank(suiteTicket, "suite_ticket不存在");
+        EnterpriseWechatSuiteAccessTokenRsp tokenRsp = enterpriseWechatApi.getSuiteAccessToken(
+                wechatProperties.getSuiteId(), wechatProperties.getSuiteSecret(), suiteTicket);
+        redisCache.setCacheObject(SUITE_ACCESS_TOKEN_KEY_PREFIX + authNotice.getSuiteId(),
+                tokenRsp.getSuiteAccessToken(), tokenRsp.getExpiresIn(), TimeUnit.SECONDS);
+        return enterpriseWechatApi.getPermanentCode(tokenRsp.getSuiteAccessToken(), authNotice.getAuthCode());
+    }
+
 }

+ 3 - 0
src/main/java/com/qqflow/engine/domain/ewechat/enums/EnterpriseWechatInfoType.java

@@ -16,4 +16,7 @@ public enum EnterpriseWechatInfoType {
 
     /** ticket更新 */
     suite_ticket,
+
+    /** 重置永久授权码 */
+    reset_permanent_code,
 }