小程序开发-服务端
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

微信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支付应该能够正常调用,不再出现参数错误。