fix(payment): 解决微信支付成功时间解析问题
- 在ShopOrderServiceImpl和WxPayNotifyService中添加OffsetDateTime导入 - 修改支付成功时间处理逻辑,从微信返回的RFC3339格式时间字符串解析本地时间 - 添加异常处理机制,当解析微信支付successTime失败时使用当前时间兜底 - 增加日志记录,便于排查时间解析异常问题 - 关闭MQTT服务启用开关以解决相关配置问题
This commit is contained in:
@@ -17,6 +17,7 @@ import org.springframework.util.StringUtils;
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -212,7 +213,24 @@ public class WxPayNotifyService {
|
||||
// 更新订单状态
|
||||
order.setPayStatus(true); // 使用Boolean类型
|
||||
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);
|
||||
|
||||
@@ -41,6 +41,7 @@ import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -769,26 +770,43 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
|
||||
QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest();
|
||||
queryRequest.setMchid(payment.getMchId());
|
||||
queryRequest.setOutTradeNo(shopOrder.getOrderNo());
|
||||
// 构建service
|
||||
JsapiServiceExtension service = getWxService(shopOrder);
|
||||
try {
|
||||
Transaction result = service.queryOrderByOutTradeNo(queryRequest);
|
||||
if (result.getTradeState().equals(Transaction.TradeStateEnum.SUCCESS)) {
|
||||
if (Boolean.TRUE.equals(shopOrder.getPayStatus())) {
|
||||
// 已是支付成功状态,避免重复触发支付成功后的业务逻辑(销量/库存等)
|
||||
return true;
|
||||
}
|
||||
shopOrder.setPayStatus(true);
|
||||
shopOrder.setPayTime(shopOrder.getCreateTime());
|
||||
if(shopOrder.getOrderStatus().equals(2)){
|
||||
shopOrder.setOrderStatus(0);
|
||||
}
|
||||
shopOrder.setTransactionId(result.getTransactionId());
|
||||
updateById(shopOrder);
|
||||
handlePaymentSuccess(shopOrder);
|
||||
return true;
|
||||
}
|
||||
} catch (ServiceException e) {
|
||||
// 构建service
|
||||
JsapiServiceExtension service = getWxService(shopOrder);
|
||||
try {
|
||||
Transaction result = service.queryOrderByOutTradeNo(queryRequest);
|
||||
if (Transaction.TradeStateEnum.SUCCESS.equals(result.getTradeState())) {
|
||||
if (Boolean.TRUE.equals(shopOrder.getPayStatus())) {
|
||||
// 已是支付成功状态,避免重复触发支付成功后的业务逻辑(销量/库存等)
|
||||
return true;
|
||||
}
|
||||
shopOrder.setPayStatus(true);
|
||||
LocalDateTime payTime = null;
|
||||
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.setTransactionId(result.getTransactionId());
|
||||
updateById(shopOrder);
|
||||
handlePaymentSuccess(shopOrder);
|
||||
return true;
|
||||
}
|
||||
} catch (ServiceException e) {
|
||||
// API返回失败, 例如ORDER_NOT_EXISTS
|
||||
System.out.printf("code=[%s], message=[%s]\n", e.getErrorCode(), e.getErrorMessage());
|
||||
System.out.printf("reponse body=[%s]\n", e.getResponseBody());
|
||||
|
||||
@@ -32,7 +32,7 @@ socketio:
|
||||
|
||||
# MQTT配置
|
||||
mqtt:
|
||||
enabled: true # 启用MQTT服务
|
||||
enabled: false # 启用MQTT服务
|
||||
host: tcp://132.232.214.96:1883
|
||||
username: swdev
|
||||
password: Sw20250523
|
||||
|
||||
Reference in New Issue
Block a user