Commit 258b4c3d60cb2ed0ff927e5df4e6ad5af75fbf7e
1 parent
76477bbb
fix:【system】解决支付回调与订单信息上传之间的时间差导致 uploadWxaOrderShippingInfo 报错
Showing
1 changed file
with
38 additions
and
7 deletions
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
| @@ -102,6 +102,19 @@ public class SocialClientServiceImpl implements SocialClientService { | @@ -102,6 +102,19 @@ public class SocialClientServiceImpl implements SocialClientService { | ||
| 102 | @Value("${yudao.wxa-subscribe-message.miniprogram-state:formal}") | 102 | @Value("${yudao.wxa-subscribe-message.miniprogram-state:formal}") |
| 103 | public String miniprogramState; | 103 | public String miniprogramState; |
| 104 | 104 | ||
| 105 | + /** | ||
| 106 | + * 上传发货信息重试次数 | ||
| 107 | + */ | ||
| 108 | + private static final int UPLOAD_SHIPPING_INFO_MAX_RETRIES = 5; | ||
| 109 | + /** | ||
| 110 | + * 上传发货信息重试间隔 | ||
| 111 | + */ | ||
| 112 | + private static final Duration UPLOAD_SHIPPING_INFO_RETRY_INTERVAL = Duration.ofMillis(500L); | ||
| 113 | + /** | ||
| 114 | + * 微信错误码:支付单不存在 | ||
| 115 | + */ | ||
| 116 | + private static final int WX_ERR_CODE_PAY_ORDER_NOT_EXIST = 10060001; | ||
| 117 | + | ||
| 105 | @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") | 118 | @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") |
| 106 | @Autowired(required = false) // 由于 justauth.enable 配置项,可以关闭 AuthRequestFactory 的功能,所以这里只能不强制注入 | 119 | @Autowired(required = false) // 由于 justauth.enable 配置项,可以关闭 AuthRequestFactory 的功能,所以这里只能不强制注入 |
| 107 | private AuthRequestFactory authRequestFactory; | 120 | private AuthRequestFactory authRequestFactory; |
| @@ -368,16 +381,34 @@ public class SocialClientServiceImpl implements SocialClientService { | @@ -368,16 +381,34 @@ public class SocialClientServiceImpl implements SocialClientService { | ||
| 368 | .payer(PayerBean.builder().openid(reqDTO.getOpenid()).build()) | 381 | .payer(PayerBean.builder().openid(reqDTO.getOpenid()).build()) |
| 369 | .uploadTime(ZonedDateTime.now().format(UTC_MS_WITH_XXX_OFFSET_FORMATTER)) | 382 | .uploadTime(ZonedDateTime.now().format(UTC_MS_WITH_XXX_OFFSET_FORMATTER)) |
| 370 | .build(); | 383 | .build(); |
| 371 | - try { | ||
| 372 | - WxMaOrderShippingInfoBaseResponse response = service.getWxMaOrderShippingService().upload(request); | ||
| 373 | - if (response.getErrCode() != 0) { | 384 | + // 重试机制:解决支付回调与订单信息上传之间的时间差导致的 10060001 错误 |
| 385 | + // 对应 ISSUE:https://gitee.com/zhijiantianya/yudao-cloud/pulls/230 | ||
| 386 | + for (int attempt = 1; attempt <= UPLOAD_SHIPPING_INFO_MAX_RETRIES; attempt++) { | ||
| 387 | + try { | ||
| 388 | + WxMaOrderShippingInfoBaseResponse response = service.getWxMaOrderShippingService().upload(request); | ||
| 389 | + // 成功,直接返回 | ||
| 390 | + if (response.getErrCode() == 0) { | ||
| 391 | + log.info("[uploadWxaOrderShippingInfo][上传微信小程序发货信息成功:request({}) response({})]", request, response); | ||
| 392 | + return; | ||
| 393 | + } | ||
| 394 | + // 如果是 10060001 错误(支付单不存在)且还有重试次数,则等待后重试 | ||
| 395 | + if (response.getErrCode() == WX_ERR_CODE_PAY_ORDER_NOT_EXIST && attempt < UPLOAD_SHIPPING_INFO_MAX_RETRIES) { | ||
| 396 | + log.warn("[uploadWxaOrderShippingInfo][第 {} 次尝试失败,支付单不存在,{} 后重试:request({}) response({})]", | ||
| 397 | + attempt, UPLOAD_SHIPPING_INFO_RETRY_INTERVAL, request, response); | ||
| 398 | + Thread.sleep(UPLOAD_SHIPPING_INFO_RETRY_INTERVAL.toMillis()); | ||
| 399 | + continue; | ||
| 400 | + } | ||
| 401 | + // 其他错误或重试次数用尽,抛出异常 | ||
| 374 | log.error("[uploadWxaOrderShippingInfo][上传微信小程序发货信息失败:request({}) response({})]", request, response); | 402 | log.error("[uploadWxaOrderShippingInfo][上传微信小程序发货信息失败:request({}) response({})]", request, response); |
| 375 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR, response.getErrMsg()); | 403 | throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR, response.getErrMsg()); |
| 404 | + } catch (WxErrorException ex) { | ||
| 405 | + log.error("[uploadWxaOrderShippingInfo][上传微信小程序发货信息失败:request({})]", request, ex); | ||
| 406 | + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR, ex.getError().getErrorMsg()); | ||
| 407 | + } catch (InterruptedException ex) { | ||
| 408 | + Thread.currentThread().interrupt(); | ||
| 409 | + log.error("[uploadWxaOrderShippingInfo][重试等待被中断:request({})]", request, ex); | ||
| 410 | + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR, "重试等待被中断"); | ||
| 376 | } | 411 | } |
| 377 | - log.info("[uploadWxaOrderShippingInfo][上传微信小程序发货信息成功:request({}) response({})]", request, response); | ||
| 378 | - } catch (WxErrorException ex) { | ||
| 379 | - log.error("[uploadWxaOrderShippingInfo][上传微信小程序发货信息失败:request({})]", request, ex); | ||
| 380 | - throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR, ex.getError().getErrorMsg()); | ||
| 381 | } | 412 | } |
| 382 | } | 413 | } |
| 383 | 414 |