fix(payment): 解决微信支付成功时间解析问题

- 在ShopOrderServiceImpl和WxPayNotifyService中添加OffsetDateTime导入
- 修改支付成功时间处理逻辑,从微信返回的RFC3339格式时间字符串解析本地时间
- 添加异常处理机制,当解析微信支付successTime失败时使用当前时间兜底
- 增加日志记录,便于排查时间解析异常问题
- 关闭MQTT服务启用开关以解决相关配置问题
This commit is contained in:
2026-02-24 11:11:55 +08:00
parent be58a5cada
commit 9590227004
3 changed files with 58 additions and 22 deletions

View File

@@ -17,6 +17,7 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.Map; import java.util.Map;
/** /**
@@ -212,7 +213,24 @@ public class WxPayNotifyService {
// 更新订单状态 // 更新订单状态
order.setPayStatus(true); // 使用Boolean类型 order.setPayStatus(true); // 使用Boolean类型
order.setTransactionId(transaction.getTransactionId()); order.setTransactionId(transaction.getTransactionId());
order.setPayTime(LocalDateTime.parse(transaction.getSuccessTime())); LocalDateTime payTime = null;
String successTime = transaction.getSuccessTime();
if (StringUtils.hasText(successTime)) {
try {
// WeChat returns RFC3339 time with offset, e.g. 2018-06-08T10:34:56+08:00
payTime = OffsetDateTime.parse(successTime).toLocalDateTime();
} catch (Exception ex) {
log.warn("解析微信支付success_time失败使用当前时间兜底 - outTradeNo={}, successTime={}",
order.getOrderNo(), successTime, ex);
}
}
if (payTime == null) {
if (!StringUtils.hasText(successTime)) {
log.warn("微信支付回调trade_state=SUCCESS但success_time为空使用当前时间兜底 - outTradeNo={}", order.getOrderNo());
}
payTime = LocalDateTime.now();
}
order.setPayTime(payTime);
// 使用专门的更新方法,会触发支付成功后的业务逻辑 // 使用专门的更新方法,会触发支付成功后的业务逻辑
shopOrderService.updateByOutTradeNo(order); shopOrderService.updateByOutTradeNo(order);

View File

@@ -41,6 +41,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -773,14 +774,31 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
JsapiServiceExtension service = getWxService(shopOrder); JsapiServiceExtension service = getWxService(shopOrder);
try { try {
Transaction result = service.queryOrderByOutTradeNo(queryRequest); Transaction result = service.queryOrderByOutTradeNo(queryRequest);
if (result.getTradeState().equals(Transaction.TradeStateEnum.SUCCESS)) { if (Transaction.TradeStateEnum.SUCCESS.equals(result.getTradeState())) {
if (Boolean.TRUE.equals(shopOrder.getPayStatus())) { if (Boolean.TRUE.equals(shopOrder.getPayStatus())) {
// 已是支付成功状态,避免重复触发支付成功后的业务逻辑(销量/库存等) // 已是支付成功状态,避免重复触发支付成功后的业务逻辑(销量/库存等)
return true; return true;
} }
shopOrder.setPayStatus(true); shopOrder.setPayStatus(true);
shopOrder.setPayTime(shopOrder.getCreateTime()); LocalDateTime payTime = null;
if(shopOrder.getOrderStatus().equals(2)){ String successTime = result.getSuccessTime();
if (successTime != null && !successTime.isBlank()) {
try {
// WeChat returns RFC3339 time with offset, e.g. 2018-06-08T10:34:56+08:00
payTime = OffsetDateTime.parse(successTime).toLocalDateTime();
} catch (Exception ex) {
log.warn("解析微信支付successTime失败使用当前时间兜底 - outTradeNo={}, successTime={}",
shopOrder.getOrderNo(), successTime, ex);
}
}
if (payTime == null) {
if (successTime == null || successTime.isBlank()) {
log.warn("微信支付查询返回SUCCESS但successTime为空使用当前时间兜底 - outTradeNo={}", shopOrder.getOrderNo());
}
payTime = LocalDateTime.now();
}
shopOrder.setPayTime(payTime);
if (shopOrder.getOrderStatus().equals(2)) {
shopOrder.setOrderStatus(0); shopOrder.setOrderStatus(0);
} }
shopOrder.setTransactionId(result.getTransactionId()); shopOrder.setTransactionId(result.getTransactionId());

View File

@@ -32,7 +32,7 @@ socketio:
# MQTT配置 # MQTT配置
mqtt: mqtt:
enabled: true # 启用MQTT服务 enabled: false # 启用MQTT服务
host: tcp://132.232.214.96:1883 host: tcp://132.232.214.96:1883
username: swdev username: swdev
password: Sw20250523 password: Sw20250523