- 添加获取 Native 支付配置的方法- 在构建预支付请求时设置必填字段:appId、mchId 和 notifyUrl - 实现微信支付状态查询功能 -优化日志输出,增加支付配置信息
100 lines
3.1 KiB
Markdown
100 lines
3.1 KiB
Markdown
# 微信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支付应该能够正常调用,不再出现参数错误。
|