You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.1 KiB
3.1 KiB
微信Native支付修复验证
🔧 修复内容
问题描述
微信支付API调用失败,错误信息:
- 第一个错误:
PARAM_ERROR: "输入源"/body/appid"映射到字段"公众号ID"必填性规则校验失败,此字段为必填项"
- 第二个错误(修复appid后出现):
PARAM_ERROR: "输入源"/body/notify_url"映射到字段"通知地址"必填性规则校验失败,此字段为必填项"
根本原因
在 WechatNativeStrategy.buildPrepayRequest()
方法中缺少设置必填字段:
- 缺少
appId
和mchId
字段 - 缺少
notify_url
字段的正确处理
修复方案
- 添加PaymentService注入:获取Native支付配置
- 新增getNativePaymentConfig方法:专门获取type=102的Native支付配置
- 修改buildPrepayRequest方法:
- 添加appId和mchId设置
- 完善notify_url的处理逻辑
修复后的关键代码
// 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端扫码支付,生成二维码
✅ 验证步骤
-
确保数据库配置:
SELECT * FROM sys_payment WHERE type = 102 AND tenant_id = ?;
确保有Native支付配置且appId不为空
-
测试支付调用:
- 调用Native支付接口
- 检查日志中是否包含AppID和商户号信息
- 验证微信API不再返回PARAM_ERROR
-
检查日志输出:
构建微信预支付请求完成, 订单号: xxx, 金额: xxx分, AppID: wxXXX, 商户号: xxx, 回调URL: xxx
⚠️ 常见问题
APPID_MCHID_NOT_MATCH 错误
如果出现 "appid和mch_id不匹配" 错误,请检查:
-
确保appid和mchid是绑定关系:
SELECT app_id, mch_id FROM sys_payment WHERE type = 102 AND tenant_id = ?;
-
验证微信支付配置:
- appid:必须是微信开放平台的网站应用appid(用于Native支付)
- mchid:必须是与该appid绑定的微信支付商户号
-
检查微信支付后台:
- 登录微信支付商户平台
- 确认该商户号下绑定了正确的appid
- 确认产品权限已开通(Native支付)
🚀 预期结果
修复后,微信Native支付应该能够正常调用,不再出现参数错误。