fix(shop-order): 修复支付回调签名验证失败及状态更新问题
- 修正导入 Transaction 类为直连商户模式路径,解决签名验证失败 - 新增按 mchId 缓存 NotificationConfig,避免重复拉取平台证书和重复初始化 - 更新 ShopOrderMapper.xml,增加 update_time 和 expiration_time 字段更新 - 删除 ShopOrderServiceImpl.updateByOutTradeNo 中重置 expirationTime 的代码,确保回调传递值生效 - 补充日志,完善异步通知证书配置流程监控
This commit is contained in:
45
.workbuddy/memory/2026-04-16.md
Normal file
45
.workbuddy/memory/2026-04-16.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 2026-04-16 工作记录
|
||||
|
||||
## 支付回调状态不更新问题诊断与修复
|
||||
|
||||
**问题接口**: `POST /api/shop/shop-order/notify/{tenantId}`
|
||||
|
||||
### 发现的 Bug
|
||||
|
||||
1. **根因 Bug**:`ShopOrderServiceImpl.updateByOutTradeNo()` 第837行有 `order.setExpirationTime(null)`,强制覆盖了 Controller 中设置的 `expirationTime`(`LocalDateTime.now().plusYears(10)`),导致 XML 中 expirationTime 条件不生效。**已修复**:删除了该行。
|
||||
|
||||
2. **XML 缺少 `update_time`**:`ShopOrderMapper.xml` 的 `updateByOutTradeNo` SQL 的 `<set>` 块中没有 `update_time = NOW()` 和 `expiration_time` 字段。**已修复**:新增了这两个字段更新。
|
||||
|
||||
3. **回调地址路由问题**:Controller 路由为 `/notify/{tenantId}`,但测试访问的 `/notify`(无 tenantId)不存在,返回 fail。正确回调地址格式为 `https://glt-api.websoft.top/api/shop/shop-order/notify/{tenantId}`(需带租户ID)。**待检查**:数据库 Payment 表的 `notify_url` 字段是否正确配置了带 tenantId 的完整路径。
|
||||
|
||||
### 修复文件
|
||||
- `src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java`
|
||||
- `src/main/java/com/gxwebsoft/shop/mapper/xml/ShopOrderMapper.xml`
|
||||
|
||||
---
|
||||
|
||||
## 支付回调签名验证失败:Transaction 类错误(00:29修复)
|
||||
|
||||
**错误日志关键信息**:
|
||||
```
|
||||
signature verification failed, signType[WECHATPAY2-SHA256-RSA2048]
|
||||
serial[test] message[test\ntest\n{"test":"test"}] sign[test]
|
||||
```
|
||||
|
||||
### 根本原因(最致命)
|
||||
|
||||
`ShopOrderController.java` 导入了 **服务商模式** 的 Transaction 类:
|
||||
```java
|
||||
// 错误(服务商模式)
|
||||
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
|
||||
```
|
||||
而 `ShopOrderServiceImpl.java` 下单时用的是**直连商户模式**:
|
||||
```java
|
||||
// 正确(直连商户模式)
|
||||
import com.wechat.pay.java.service.payments.model.Transaction;
|
||||
```
|
||||
两个 Transaction 包路径不同,字段结构有差异(服务商 Transaction 有 spAppid/spMchid 等字段),用错误的类解析回调会导致字段映射失败,交易状态无法正确读取。**已修复**:改为正确的直连商户模式 Transaction。
|
||||
|
||||
### 次要原因
|
||||
|
||||
`RSAAutoCertificateConfig` 每次回调都重新 `build()`,SDK 内部会发一次 `serial=test` 的探测验签,网络问题或并发场景下可能导致首次回调失败。**已优化**:添加 `notifyConfigCache`(ConcurrentHashMap)按 mchId 缓存 config,避免重复初始化。
|
||||
5
.workbuddy/settings.local.json
Normal file
5
.workbuddy/settings.local.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"enabledPlugins": {
|
||||
"modern-webapp@cb_teams_marketplace": true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user