Files
java-10584/.workbuddy/memory/2026-04-16.md
赵忠林 0c4bdc3031 fix(shop-order): 修复支付回调签名验证失败及状态更新问题
- 修正导入 Transaction 类为直连商户模式路径,解决签名验证失败
- 新增按 mchId 缓存 NotificationConfig,避免重复拉取平台证书和重复初始化
- 更新 ShopOrderMapper.xml,增加 update_time 和 expiration_time 字段更新
- 删除 ShopOrderServiceImpl.updateByOutTradeNo 中重置 expirationTime 的代码,确保回调传递值生效
- 补充日志,完善异步通知证书配置流程监控
2026-04-16 00:33:20 +08:00

46 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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避免重复初始化。