EnterpriseWechatEventHandler.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package com.qqflow.engine.domain.ewechat.component;
  2. import com.qqflow.engine.common.service.RedissonService;
  3. import com.qqflow.engine.common.util.Assert;
  4. import com.qqflow.engine.common.util.RedisCache;
  5. import com.qqflow.engine.domain.ewechat.api.EnterpriseWechatApi;
  6. import com.qqflow.engine.domain.ewechat.assemble.EnterpriseWechatAssembler;
  7. import com.qqflow.engine.domain.ewechat.config.EnterpriseWechatProperties;
  8. import com.qqflow.engine.domain.ewechat.mapper.EnterpriseWechatCorpMapper;
  9. import com.qqflow.engine.domain.ewechat.enums.EnterpriseWechatInfoType;
  10. import com.qqflow.engine.domain.ewechat.model.enterprise.EnterpriseWechatEvent;
  11. import com.qqflow.engine.domain.ewechat.model.enterprise.callback.EnterpriseWechatAuthNotice;
  12. import com.qqflow.engine.domain.ewechat.model.enterprise.callback.EnterpriseWechatSuiteTicket;
  13. import com.qqflow.engine.domain.ewechat.model.enterprise.rsp.EnterpriseWechatPermanentCodeRsp;
  14. import com.qqflow.engine.domain.ewechat.model.enterprise.rsp.EnterpriseWechatSuiteAccessTokenRsp;
  15. import com.qqflow.engine.common.util.XmlUtil;
  16. import com.qqflow.engine.domain.ewechat.po.EnterpriseWechatCorp;
  17. import lombok.RequiredArgsConstructor;
  18. import org.springframework.context.event.EventListener;
  19. import org.springframework.stereotype.Component;
  20. import java.util.concurrent.TimeUnit;
  21. /**
  22. * @author WuWenYi
  23. * @see EnterpriseWechatInfoType
  24. * @since 2025/3/18
  25. */
  26. @Component
  27. @RequiredArgsConstructor
  28. public class EnterpriseWechatEventHandler {
  29. private static final String SUITE_TICKET_KEY_PREFIX = "suite_ticket::";
  30. private static final String SUITE_ACCESS_TOKEN_KEY_PREFIX = "suite_access_token::";
  31. private final EnterpriseWechatCorpMapper corpMapper;
  32. private final EnterpriseWechatAssembler assembler;
  33. private final EnterpriseWechatProperties wechatProperties;
  34. private final RedisCache redisCache;
  35. private final RedissonService redissonService;
  36. private final EnterpriseWechatApi enterpriseWechatApi;
  37. /** 授权事件 */
  38. @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='create_auth'")
  39. public void createAuth(EnterpriseWechatEvent event) {
  40. EnterpriseWechatAuthNotice authNotice = XmlUtil.fromXml(event.getCallbackXml(), EnterpriseWechatAuthNotice.class);
  41. boolean locked = redissonService.tryLock("hanle-create-auth-event::" + authNotice.getSuiteId());
  42. if (!locked) return;
  43. try {
  44. EnterpriseWechatPermanentCodeRsp permanentCodeRsp = this.fetchPermanentCode(authNotice);
  45. String corpid = permanentCodeRsp.getAuthCorpInfo().getCorpid();
  46. EnterpriseWechatCorp wechatCorp = corpMapper.selectByCorpIdAndSuiteId(corpid, authNotice.getSuiteId());
  47. if (wechatCorp == null) {
  48. corpMapper.insert(assembler.assembleCorp(permanentCodeRsp));
  49. } else {
  50. wechatCorp.setPermanentCode(permanentCodeRsp.getPermanentCode());
  51. corpMapper.updateById(wechatCorp);
  52. }
  53. } finally {
  54. redissonService.unlock("hanle-create-auth-event::" + authNotice.getSuiteId());
  55. }
  56. }
  57. /** 取消授权事件 */
  58. @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='cancel_auth'")
  59. public void cancelAuth(EnterpriseWechatEvent event) {
  60. // TODO: 取消授权事件处理
  61. }
  62. /** 推送suite_ticket事件 */
  63. @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='suite_ticket'")
  64. public void suiteTicket(EnterpriseWechatEvent event) {
  65. EnterpriseWechatSuiteTicket suiteTicket = XmlUtil.fromXml(event.getCallbackXml(), EnterpriseWechatSuiteTicket.class);
  66. String key = SUITE_TICKET_KEY_PREFIX + suiteTicket.getSuiteId();
  67. redisCache.setCacheObject(key, suiteTicket.getSuiteTicket(), 60 * 30, TimeUnit.SECONDS);
  68. }
  69. /** 永久授权码更新事件(企业重新授权时触发) */
  70. @EventListener(value = {EnterpriseWechatEvent.class}, condition = "#event.source.toString()=='reset_permanent_code'")
  71. public void resetPermanentCode(EnterpriseWechatEvent event) {
  72. EnterpriseWechatAuthNotice authNotice = XmlUtil.fromXml(event.getCallbackXml(), EnterpriseWechatAuthNotice.class);
  73. boolean locked = redissonService.tryLock("handle-reset-permanent-code::" + authNotice.getSuiteId());
  74. if (!locked) return;
  75. try {
  76. EnterpriseWechatPermanentCodeRsp permanentCodeRsp = this.fetchPermanentCode(authNotice);
  77. String corpid = permanentCodeRsp.getAuthCorpInfo().getCorpid();
  78. EnterpriseWechatCorp wechatCorp = corpMapper.selectByCorpIdAndSuiteId(corpid, authNotice.getSuiteId());
  79. if (wechatCorp != null) {
  80. wechatCorp.setPermanentCode(permanentCodeRsp.getPermanentCode());
  81. wechatCorp.setCorpName(permanentCodeRsp.getAuthCorpInfo().getCorpName());
  82. corpMapper.updateById(wechatCorp);
  83. }
  84. } finally {
  85. redissonService.unlock("handle-reset-permanent-code::" + authNotice.getSuiteId());
  86. }
  87. }
  88. /** 获取永久授权码:suite_ticket → suite_access_token → permanent_code */
  89. private EnterpriseWechatPermanentCodeRsp fetchPermanentCode(EnterpriseWechatAuthNotice authNotice) {
  90. String suiteTicket = redisCache.getCacheObject(SUITE_TICKET_KEY_PREFIX + authNotice.getSuiteId());
  91. Assert.notBlank(suiteTicket, "suite_ticket不存在");
  92. EnterpriseWechatSuiteAccessTokenRsp tokenRsp = enterpriseWechatApi.getSuiteAccessToken(
  93. wechatProperties.getSuiteId(), wechatProperties.getSuiteSecret(), suiteTicket);
  94. redisCache.setCacheObject(SUITE_ACCESS_TOKEN_KEY_PREFIX + authNotice.getSuiteId(),
  95. tokenRsp.getSuiteAccessToken(), tokenRsp.getExpiresIn(), TimeUnit.SECONDS);
  96. return enterpriseWechatApi.getPermanentCode(tokenRsp.getSuiteAccessToken(), authNotice.getAuthCode());
  97. }
  98. }