diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java index def3a88..eb9378c 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java @@ -13,6 +13,8 @@ import com.agileboot.domain.common.dto.CurrentLoginUserDTO; import com.agileboot.domain.common.dto.TokenDTO; import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService; import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity; +import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoEntity; +import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoService; import com.agileboot.domain.qywx.user.QyUserApplicationService; import com.agileboot.domain.qywx.user.dto.QyUserDTO; import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService; @@ -71,6 +73,8 @@ public class LoginController { private final QyUserApplicationService qyUserApplicationService; + private final QyAuthCorpInfoService qyAuthCorpInfoService; + /** * 访问首页,提示语 */ @@ -179,7 +183,12 @@ public class LoginController { @GetMapping("/getQyUserinfo") public ResponseDTO getQyUserinfo(String corpid, String code) { try { - QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity qyAuthCorpInfo = qyAuthCorpInfoService.selectByCorpid(corpid); + if (qyAuthCorpInfo == null) { + log.error("获取企业微信应用配置失败, corpid: {}", corpid); + return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "无效的corpid参数")); + } + QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid(qyAuthCorpInfo.getAppid(), corpid); String url = String.format( "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s", qyAccessToken.getAccessToken(), code); diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/qywx/QyUserController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/qywx/QyUserController.java index f55e5c0..21c7a74 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/qywx/QyUserController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/qywx/QyUserController.java @@ -13,6 +13,8 @@ import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity; import com.agileboot.domain.qywx.api.QywxApiUtil; import com.agileboot.domain.qywx.api.response.OpenidResponse; import com.agileboot.domain.qywx.api.response.UserIdResponse; +import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoEntity; +import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoService; import com.agileboot.domain.qywx.user.QyUserApplicationService; import com.agileboot.domain.qywx.user.command.AddQyUserCommand; import com.agileboot.domain.qywx.user.command.UpdateQyUserCommand; @@ -38,6 +40,7 @@ public class QyUserController extends BaseController { private final QyUserApplicationService qyUserApplicationService; private final QywxScheduleJob qywxScheduleJob; private final AccessTokenApplicationService accessTokenApplicationService; + private final QyAuthCorpInfoService qyAuthCorpInfoService; @Operation(summary = "用户列表") @GetMapping @@ -94,13 +97,21 @@ public class QyUserController extends BaseController { @GetMapping("/convertToOpenid") public ResponseDTO convertToOpenid(String corpid, String userid) { - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity authCorpInfo = qyAuthCorpInfoService.selectByCorpid(corpid); + if (authCorpInfo == null) { + return ResponseDTO.fail("corpid不存在"); + } + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); OpenidResponse response = QywxApiUtil.convertToOpenid(accessToken.getAccessToken(), userid); return ResponseDTO.ok(JSONUtil.toJsonStr(response)); } @GetMapping("/convertToUserid") public ResponseDTO convertToUserid(String corpid, String openid) { - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity authCorpInfo = qyAuthCorpInfoService.selectByCorpid(corpid); + if (authCorpInfo == null) { + return ResponseDTO.fail("corpid不存在"); + } + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); UserIdResponse response = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), openid); return ResponseDTO.ok(JSONUtil.toJsonStr(response)); } diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/QywxScheduleJob.java b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/QywxScheduleJob.java index 4ee4d76..19a684c 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/QywxScheduleJob.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/QywxScheduleJob.java @@ -79,7 +79,7 @@ public class QywxScheduleJob { * 企业微信应用ID常量 * 用于标识当前集成的第三方应用,对应企业微信服务商后台配置的应用凭证 */ - private static final String appid2 = "QWTONG_YS_WXSHOP"; +// private static final String appid2 = "QWTONG_YS_WXSHOP"; /** * 定时获取第三方应用凭证(suite_access_token) @@ -96,16 +96,13 @@ public class QywxScheduleJob { */ @Scheduled(cron = "0 10 * * * *") public void getSuiteAccessTokenTask() { - /*try { - getSuiteAccessToken(appid); - } catch (Exception e) { - log.error("getSuiteAccessTokenTask appid: " + appid, e); - }*/ - - try { - getSuiteAccessToken(appid2); - } catch (Exception e) { - log.error("getSuiteAccessTokenTask appid: " + appid2, e); + List appidList = templateApplicationService.getTemplateAppidList(); + for (String appid : appidList) { + try { + getSuiteAccessToken(appid); + } catch (Exception e) { + log.error("getSuiteAccessTokenTask appid: " + appid, e); + } } } @@ -154,10 +151,13 @@ public class QywxScheduleJob { log.error("getAccessTokenTask error appid: " + appid, e); }*/ - try { - getAccessToken(appid2); - } catch (Exception e) { - log.error("getAccessTokenTask error appid: " + appid2, e); + List appidList = templateApplicationService.getTemplateAppidList(); + for (String appid : appidList) { + try { + getAccessToken(appid); + } catch (Exception e) { + log.error("getAccessTokenTask error appid: " + appid, e); + } } } @@ -208,16 +208,19 @@ public class QywxScheduleJob { log.error("syncDepartmentInfoTask error appid: " + appid, e); }*/ - try { - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid2); - if (null == authCorpInfoList || authCorpInfoList.isEmpty()) { - return; + List appidList = templateApplicationService.getTemplateAppidList(); + for (String appid : appidList) { + try { + List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); + if (null == authCorpInfoList || authCorpInfoList.isEmpty()) { + return; + } + for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { + syncDepartmentInfo(appid, authCorpInfo); + } + } catch (Exception e) { + log.error("syncDepartmentInfoTask error appid: " + appid, e); } - for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { - syncDepartmentInfo(appid2, authCorpInfo); - } - } catch (Exception e) { - log.error("syncDepartmentInfoTask error appid: " + appid2, e); } } @@ -382,16 +385,19 @@ public class QywxScheduleJob { log.error("syncUserInfoTask error appid: " + appid, e); }*/ - try { - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid2); - if (null == authCorpInfoList || authCorpInfoList.isEmpty()) { - return; + List appidList = templateApplicationService.getTemplateAppidList(); + for (String appid : appidList) { + try { + List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); + if (null == authCorpInfoList || authCorpInfoList.isEmpty()) { + return; + } + for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { + syncUserInfo(appid, authCorpInfo); + } + } catch (Exception e) { + log.error("syncUserInfoTask error appid: " + appid, e); } - for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { - syncUserInfo(appid2, authCorpInfo); - } - } catch (Exception e) { - log.error("syncUserInfoTask error appid: " + appid2, e); } } @@ -613,10 +619,14 @@ public class QywxScheduleJob { */ @Scheduled(cron = "0 45 * * * *") public void getAuthInfoTask() { - try { - getAuthInfo(appid2); - } catch (Exception e) { - log.error("getAuthInfoTask error appid: " + appid2, e); + + List appidList = templateApplicationService.getTemplateAppidList(); + for (String appid : appidList) { + try { + getAuthInfo(appid); + } catch (Exception e) { + log.error("getAuthInfoTask error appid: " + appid, e); + } } } @@ -687,7 +697,7 @@ public class QywxScheduleJob { try { syncUserBindings(); } catch (Exception e) { - log.error("syncUserBindingsTask error appid: " + appid2, e); + log.error("syncUserBindingsTask error: ", e); } } diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/DeadlineOrderJob.java b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/DeadlineOrderJob.java index 9e84ab6..c9f841c 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/DeadlineOrderJob.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/DeadlineOrderJob.java @@ -151,12 +151,8 @@ public class DeadlineOrderJob { // 发送审核消息 try { - String appid = "QWTONG_YS_WXSHOP"; - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); - QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream() - .filter(a -> order.getCorpid().equals(a.getCorpid())) - .findFirst().orElse(null); - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid()); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(order.getCorpid()); + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), authCorpInfo.getCorpid()); sendReviewNotification(order, orderGoods, authCorpInfo, accessToken, returnDeadlineDays, deadlineDate); } catch (Exception e) { log.error("发送逾期未归还通知失败", e); diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/QywxMessageJob.java b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/QywxMessageJob.java index 230dc3e..b86a376 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/QywxMessageJob.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/job/QywxMessageJob.java @@ -58,13 +58,6 @@ public class QywxMessageJob { private final CabinetCellService cabinetCellService; private final SmartCabinetService smartCabinetService; -// private static final String appid = "QYTONG_YS_WXSHOP"; - /** - * 企业微信应用ID常量 - * 用于标识当前集成的第三方应用,对应企业微信服务商后台配置的应用凭证 - */ - private static final String appid2 = "QWTONG_YS_WXSHOP"; - /** * 每天向逾期未归还商品的用户发送提醒消息 * 执行时间:每天10点 @@ -72,16 +65,23 @@ public class QywxMessageJob { @Scheduled(cron = "0 0 10 * * *") public void sendOverdueGoodsReminderTask() { try { - // 1. 获取所有已授权企业信息 - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid2); - if (CollectionUtils.isEmpty(authCorpInfoList)) { - log.info("没有找到已授权的企业信息"); + List appidList = templateApplicationService.getTemplateAppidList(); + if (CollectionUtils.isEmpty(appidList)) { + log.info("没有找到已授权的应用ID"); return; } + for (String appid : appidList) { + // 1. 获取所有已授权企业信息 + List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); + if (CollectionUtils.isEmpty(authCorpInfoList)) { + log.info("没有找到已授权的企业信息"); + continue; + } - // 2. 遍历企业处理 - for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { - sendOverdueReminderForCorp(appid2, authCorpInfo); + // 2. 遍历企业处理 + for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { + sendOverdueReminderForCorp(appid, authCorpInfo); + } } } catch (Exception e) { log.error("发送逾期商品提醒任务失败", e); diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/login/LoginService.java b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/login/LoginService.java index 166d2b6..aa99f58 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/login/LoginService.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/customize/service/login/LoginService.java @@ -25,6 +25,8 @@ import com.agileboot.domain.common.cache.RedisCacheService; import com.agileboot.admin.customize.async.AsyncTaskFactory; import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService; import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity; +import com.agileboot.domain.qywx.authCorpInfo.AuthCorpInfoApplicationService; +import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoEntity; import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService; import com.agileboot.infrastructure.thread.ThreadPoolManager; import com.agileboot.admin.customize.service.login.dto.CaptchaDTO; @@ -75,6 +77,7 @@ public class LoginService { private final FakeUserDetailsServiceImpl fakeUserDetailsService; private final SysUserQyUserApplicationService sysUserQyUserApplicationService; + private final AuthCorpInfoApplicationService authCorpInfoApplicationService; @Resource(name = "captchaProducer") private Producer captchaProducer; @@ -258,7 +261,11 @@ public class LoginService { private String getQyUserid(String corpid, String code) { try { - QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(corpid); + if (authCorpInfo == null) { + throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "corpid不存在"); + } + QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); String url = String.format( "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s", qyAccessToken.getAccessToken(), code); diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java index d18cf77..9dca742 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java @@ -181,7 +181,8 @@ public class PaymentController { @GetMapping("/login/qy") public ResponseDTO qyLogin(String corpid, String code, String state) { try { - QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(corpid); + QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); // 通过企业微信code获取用户ID String userid = QywxApiUtil.getQyUserid(qyAccessToken.getAccessToken(), code); // 根据企业微信用户ID查询系统用户名 @@ -225,7 +226,8 @@ public class PaymentController { @GetMapping("/login/qy/fake") public ResponseDTO fakeQyLogin(String corpid, String userid) { try { - QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", corpid); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(corpid); + QyAccessTokenEntity qyAccessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); // 通过企业微信code获取用户ID // 根据企业微信用户ID查询系统用户名 SysUserEntity sysUserEntity = sysUserQyUserApplicationService.getSysUserByQyUserid(userid); @@ -294,9 +296,8 @@ public class PaymentController { */ @GetMapping("/getBalance") public ResponseDTO getBalance(@RequestParam String corpid, @RequestParam String openid) { - String appid = "QWTONG_YS_WXSHOP"; - - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, corpid); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(corpid); + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), corpid); UserIdResponse userIdResponse = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), openid); QyUserEntity qyUser = qyUserApplicationService.getUserByUserIdAndCorpid(userIdResponse.getUserid(), corpid); if (qyUser == null) { diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java index 6ef9c6c..888767b 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java @@ -5,6 +5,7 @@ import com.agileboot.api.customize.async.QyAsyncTaskFactory; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.common.utils.weixin.aes.WXBizMsgCrypt; +import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService; import com.agileboot.domain.qywx.api.QywxApiUtil; import com.agileboot.domain.qywx.api.response.GetAuthInfoResult; import com.agileboot.domain.qywx.auth.AuthApplicationService; @@ -23,6 +24,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; @@ -47,6 +49,7 @@ public class QywxController { private final TemplateApplicationService templateApplicationService; private final AuthApplicationService authApplicationService; private final AuthCorpInfoApplicationService authCorpInfoApplicationService; + private final AccessTokenApplicationService accessTokenApplicationService; @GetMapping("/getPermanentCode") public String getPermanentCode( @@ -105,6 +108,7 @@ public class QywxController { String token = template.getToken(); String encodingAesKey = template.getEncodingAESKey(); String corpId = template.getCorpid(); + log.info("validateDataCallback, token: {}, encodingAesKey: {}, corpId: {}", token, encodingAesKey, corpId); WXBizMsgCrypt wxCrypt = new WXBizMsgCrypt(token, encodingAesKey, corpId); return wxCrypt.VerifyURL(msg_signature, timestamp, nonce, echostr); } catch (Exception e) { @@ -162,7 +166,18 @@ public class QywxController { @RequestParam String nonce, @RequestParam String echostr, @RequestParam String appid) { - return validateDataCallback(msg_signature, timestamp, nonce, echostr, appid); + try { + QyTemplateEntity template = templateApplicationService.getByAppid(appid); + String token = template.getToken(); + String encodingAesKey = template.getEncodingAESKey(); + String corpId = template.getCorpid(); + log.info("validateCommandCallback, token: {}, encodingAesKey: {}, corpId: {}", token, encodingAesKey, corpId); + WXBizMsgCrypt wxCrypt = new WXBizMsgCrypt(token, encodingAesKey, corpId); + return wxCrypt.VerifyURL(msg_signature, timestamp, nonce, echostr); + } catch (Exception e) { + log.error("验证失败", e); + throw new ApiException(ErrorCode.FAILED, "验证失败", e); + } } @PostMapping("/callback/command") @@ -197,6 +212,8 @@ public class QywxController { authCommand.setSuiteTicket(SuiteTicket); authApplicationService.addAuth(authCommand); + + templateApplicationService.checkAndRefreshSuiteAccessToken(appid); } break; case "create_auth": @@ -218,6 +235,13 @@ public class QywxController { // 提交异步任务 // ThreadPoolManager.execute(QyAsyncTaskFactory.getPermanentCodeTask(suiteAccessToken, AuthCode)); QyAsyncTaskFactory.getPermanentCode(suiteAccessToken, AuthCode, appid); + + List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); + if (CollectionUtils.isNotEmpty(authCorpInfoList)) { + for (QyAuthCorpInfoEntity authCorpInfo : authCorpInfoList) { + accessTokenApplicationService.getAccessToken(authCorpInfo.getCorpid(), authCorpInfo.getPermanentCode(), appid); + } + } } break; default: diff --git a/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java b/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java index 8d8571f..61166c8 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java +++ b/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java @@ -66,6 +66,8 @@ public class QyAsyncTaskFactory { AuthCorpInfoApplicationService authCorpInfoApplicationService = SpringUtil.getBean(AuthCorpInfoApplicationService.class); authCorpInfoApplicationService.addAuthCorpInfo(command); + + // UpdateAuthCorpInfoCommand updateAuthCorpInfoCommand = new UpdateAuthCorpInfoCommand(); // BeanUtils.copyProperties(command, updateAuthCorpInfoCommand); /*try { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java index f766936..cf695fc 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java @@ -179,12 +179,8 @@ public class AssetApplicationService { ShopGoodsEntity firstGoods = shopGoodsService.getGoodsByExternalGoodsId(postAssetApprovalCommand.getCorpid(), postAssetApprovalCommand.getGoodsInfoList().get(0).getExternalGoodsId()); // 发送审核消息 try { - String appid = "QWTONG_YS_WXSHOP"; - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); - QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream() - .filter(a -> postAssetApprovalCommand.getCorpid().equals(a.getCorpid())) - .findFirst().orElse(null); - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, postAssetApprovalCommand.getCorpid()); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(postAssetApprovalCommand.getCorpid()); + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), postAssetApprovalCommand.getCorpid()); // 获取用户ID List adminUserIds = qyUserService.selectAdminUserIds(postAssetApprovalCommand.getCorpid()); String toUser = String.join("|", adminUserIds); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/accessToken/AccessTokenApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/accessToken/AccessTokenApplicationService.java index 47f5452..6027e27 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/accessToken/AccessTokenApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/accessToken/AccessTokenApplicationService.java @@ -60,6 +60,25 @@ public class AccessTokenApplicationService { return accessTokenService.getByAppid(appid, corpid); } + public void checkAndRefreshAccessToken(String appid, String corpid, String corpsecret) { + QyAccessTokenEntity accessToken = accessTokenService.getByAppid(appid, corpid); + if (null == accessToken) { + getAccessToken(corpid, corpsecret, appid); + } else { + // 计算令牌是否已经过期或即将过期(提前10分钟刷新) + Date now = new Date(); + long getTokenTime = accessToken.getGettokenTime().getTime(); + long currentTime = now.getTime(); + long elapsedTime = (currentTime - getTokenTime) / 1000; // 转换为秒 + + // 如果已经过期或剩余时间少于30分钟(1800秒),则刷新令牌 + if (elapsedTime >= accessToken.getExpiresIn() || + (accessToken.getExpiresIn() - elapsedTime) < 1800) { + getAccessToken(corpid, corpsecret, appid); + } + } + } + public void getAccessToken(String corpid, String corpsecret, String appid) { String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/AuthCorpInfoApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/AuthCorpInfoApplicationService.java index 1a38e00..c96a69c 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/AuthCorpInfoApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/AuthCorpInfoApplicationService.java @@ -58,4 +58,8 @@ public class AuthCorpInfoApplicationService { public QyAuthCorpInfoEntity selectByAppidAndCorpid(String appid, String corpid) { return authCorpInfoService.selectByAppidAndCorpid(appid, corpid); } + + public QyAuthCorpInfoEntity selectByCorpid(String corpid) { + return authCorpInfoService.selectByCorpid(corpid); + } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoMapper.java index a67270b..a3acae3 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoMapper.java @@ -38,4 +38,7 @@ public interface QyAuthCorpInfoMapper extends BaseMapper { @Select("SELECT * FROM qy_auth_corp_info WHERE appid = #{appid} AND corpid = #{corpid} LIMIT 1") QyAuthCorpInfoEntity selectByAppidAndCorpid(@Param("appid")String appid, @Param("corpid")String corpid); + + @Select("SELECT * FROM qy_auth_corp_info WHERE corpid = #{corpid} LIMIT 1") + QyAuthCorpInfoEntity selectByCorpid(@Param("corpid")String corpid); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoService.java index dbb1bde..9e39cfd 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoService.java @@ -24,4 +24,6 @@ public interface QyAuthCorpInfoService extends IService { List getByAppid(String appid); QyAuthCorpInfoEntity selectByAppidAndCorpid(String appid, String corpid); + + QyAuthCorpInfoEntity selectByCorpid(String corpid); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoServiceImpl.java index 9db29f0..5b5f34b 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/authCorpInfo/db/QyAuthCorpInfoServiceImpl.java @@ -38,4 +38,9 @@ public class QyAuthCorpInfoServiceImpl extends ServiceImpl= template.getExpiresIn() || + (template.getExpiresIn() - elapsedTime) < 1800) { + + String suiteAccessToken = getSuiteAccessToken(template.getSuiteId(), template.getSecret(), template.getSuiteTicket()); + + if (StringUtils.isNotBlank(suiteAccessToken)) { + template.setSuiteAccessToken(suiteAccessToken); + template.setGettokenTime(now); + templateService.updateById(template); + } else { + log.error("checkAndRefreshSuiteAccessToken getSuiteAccessToken failed, appid: {}", appid); + } + } + } + + public List getTemplateAppidList() { + return templateService.getTemplateAppidList(); + } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateMapper.java index 2ec72fe..85a8c27 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateMapper.java @@ -43,4 +43,7 @@ public interface QyTemplateMapper extends BaseMapper { @Select("SELECT * FROM qy_template WHERE appid = #{appid} LIMIT 1") QyTemplateEntity selectByAppid(String appid); + + @Select("SELECT DISTINCT appid FROM qy_template WHERE enable = '1'") + List getTemplateAppidList(); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateService.java index 23d4d12..7964e9c 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateService.java @@ -23,4 +23,6 @@ public interface QyTemplateService extends IService { QyTemplateEntity getBySuiteId(String suiteId); public QyTemplateEntity getByAppid(String appid); + + public List getTemplateAppidList(); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateServiceImpl.java index c5f2517..4e6bb8c 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/template/db/QyTemplateServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; +import java.util.stream.Collectors; + import org.springframework.stereotype.Service; @Service @@ -37,4 +39,11 @@ public class QyTemplateServiceImpl extends ServiceImpl getTemplateAppidList() { + return baseMapper.getTemplateAppidList().stream().distinct().collect(Collectors.toList()); + } + + } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java index 3077eeb..762a04d 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java @@ -253,7 +253,8 @@ public class ReturnApprovalApplicationService { } else if (Objects.equals(orderModel.getPaymentMethod(), "balance")) { // 余额退款 try { - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", model.getCorpid()); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(model.getCorpid()); + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), model.getCorpid()); String userid = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), orderModel.getOpenid()).getUserid(); QyUserEntity qyUser = userService.getUserByUserIdAndCorpid(userid, model.getCorpid()); if (null != qyUser) { @@ -795,12 +796,8 @@ public class ReturnApprovalApplicationService { // 发送审核消息 try { - String appid = "QWTONG_YS_WXSHOP"; - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); - QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream() - .filter(a -> command.getCorpid().equals(a.getCorpid())) - .findFirst().orElse(null); - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid()); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(command.getCorpid()); + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), command.getCorpid()); // 获取用户ID List adminUserIds = qyUserService.selectAdminUserIds(command.getCorpid()); String toUser = String.join("|", adminUserIds); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java index 03ee18b..39979a8 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java @@ -260,12 +260,11 @@ public class OrderApplicationService { // 发送审核消息 try { - String appid = "QWTONG_YS_WXSHOP"; - List authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid); - QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream() - .filter(a -> command.getCorpid().equals(a.getCorpid())) - .findFirst().orElse(null); - QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid()); + QyAuthCorpInfoEntity authCorpInfo = authCorpInfoApplicationService.selectByCorpid(command.getCorpid()); + if (authCorpInfo == null) { + throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "corpid不存在"); + } + QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(authCorpInfo.getAppid(), authCorpInfo.getCorpid()); // 获取用户ID List adminUserIds = qyUserService.selectAdminUserIds(submitOrderCommand.getCorpid()); String toUser = String.join("|", adminUserIds);