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 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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user