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

3.1 KiB
Raw Blame History

微信Native支付修复验证

🔧 修复内容

问题描述

微信支付API调用失败错误信息

  1. 第一个错误
PARAM_ERROR: "输入源"/body/appid"映射到字段"公众号ID"必填性规则校验失败,此字段为必填项"
  1. 第二个错误修复appid后出现
PARAM_ERROR: "输入源"/body/notify_url"映射到字段"通知地址"必填性规则校验失败,此字段为必填项"

根本原因

WechatNativeStrategy.buildPrepayRequest() 方法中缺少设置必填字段:

  1. 缺少 appIdmchId 字段
  2. 缺少 notify_url 字段的正确处理

修复方案

  1. 添加PaymentService注入获取Native支付配置
  2. 新增getNativePaymentConfig方法专门获取type=102的Native支付配置
  3. 修改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端扫码支付生成二维码

验证步骤

  1. 确保数据库配置

    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是绑定关系

    SELECT app_id, mch_id FROM sys_payment WHERE type = 102 AND tenant_id = ?;
    
  2. 验证微信支付配置

    • appid必须是微信开放平台的网站应用appid用于Native支付
    • mchid必须是与该appid绑定的微信支付商户号
  3. 检查微信支付后台

    • 登录微信支付商户平台
    • 确认该商户号下绑定了正确的appid
    • 确认产品权限已开通Native支付

🚀 预期结果

修复后微信Native支付应该能够正常调用不再出现参数错误。