Files
mp-java/test_payment_fix.md
赵忠林 797cfdf6c2 fix(payment): 修复微信 Native支付参数错误问题
- 添加获取 Native 支付配置的方法- 在构建预支付请求时设置必填字段:appId、mchId 和 notifyUrl
- 实现微信支付状态查询功能
-优化日志输出,增加支付配置信息
2025-08-30 17:17:58 +08:00

100 lines
3.1 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.

# 微信Native支付修复验证
## 🔧 修复内容
### 问题描述
微信支付API调用失败错误信息
1. **第一个错误**
```
PARAM_ERROR: "输入源"/body/appid"映射到字段"公众号ID"必填性规则校验失败,此字段为必填项"
```
2. **第二个错误**修复appid后出现
```
PARAM_ERROR: "输入源"/body/notify_url"映射到字段"通知地址"必填性规则校验失败,此字段为必填项"
```
### 根本原因
`WechatNativeStrategy.buildPrepayRequest()` 方法中缺少设置必填字段:
1. 缺少 `appId``mchId` 字段
2. 缺少 `notify_url` 字段的正确处理
### 修复方案
1. **添加PaymentService注入**获取Native支付配置
2. **新增getNativePaymentConfig方法**专门获取type=102的Native支付配置
3. **修改buildPrepayRequest方法**
- 添加appId和mchId设置
- 完善notify_url的处理逻辑
### 修复后的关键代码
```java
// 1. 获取Native支付配置
Payment paymentConfig = getNativePaymentConfig(request.getTenantId());
// 2. 构建预支付请求时设置必填字段
prepayRequest.setAppid(paymentConfig.getAppId());
prepayRequest.setMchid(paymentConfig.getMchId());
// 3. 设置回调URL必填字段
String notifyUrl = null;
if (StringUtils.hasText(request.getNotifyUrl())) {
notifyUrl = request.getNotifyUrl();
} else if (StringUtils.hasText(paymentConfig.getNotifyUrl())) {
notifyUrl = paymentConfig.getNotifyUrl();
} else {
throw new RuntimeException("回调通知地址不能为空");
}
prepayRequest.setNotifyUrl(notifyUrl);
```
## 🎯 支付类型区分
### 数据库配置
- **type = 1**: 微信小程序支付使用小程序appid
- **type = 102**: 微信Native支付使用开放平台appid
### 使用场景
- **小程序支付**: 在微信小程序内调用支付
- **Native支付**: PC端扫码支付生成二维码
## ✅ 验证步骤
1. **确保数据库配置**
```sql
SELECT * FROM sys_payment WHERE type = 102 AND tenant_id = ?;
```
确保有Native支付配置且appId不为空
2. **测试支付调用**
- 调用Native支付接口
- 检查日志中是否包含AppID和商户号信息
- 验证微信API不再返回PARAM_ERROR
3. **检查日志输出**
```
构建微信预支付请求完成, 订单号: xxx, 金额: xxx分, AppID: wxXXX, 商户号: xxx, 回调URL: xxx
```
## ⚠️ 常见问题
### APPID_MCHID_NOT_MATCH 错误
如果出现 "appid和mch_id不匹配" 错误,请检查:
1. **确保appid和mchid是绑定关系**
```sql
SELECT app_id, mch_id FROM sys_payment WHERE type = 102 AND tenant_id = ?;
```
2. **验证微信支付配置**
- appid必须是微信开放平台的网站应用appid用于Native支付
- mchid必须是与该appid绑定的微信支付商户号
3. **检查微信支付后台**
- 登录微信支付商户平台
- 确认该商户号下绑定了正确的appid
- 确认产品权限已开通Native支付
## 🚀 预期结果
修复后微信Native支付应该能够正常调用不再出现参数错误。