uniapp app微信支付签名认证失败如何解决

在使用uniapp开发APP时,调用微信支付出现签名认证失败的问题,错误提示是"sign invalid"。已经按照文档生成了签名,参数也核对过多次,但依然报错。具体配置如下:

  • 使用的是uniapp官方支付API
  • 后端返回的prepay_id和签名参数都正确
  • 包名、应用ID、商户号均已核对无误
    想请教可能的原因和解决方案?是否有特殊的签名规则或常见配置遗漏?
2 回复

检查签名参数是否正确,确保appid、商户号、时间戳、随机字符串等参数与后台一致。注意参数名大小写和排序,按微信支付文档要求生成签名。可对比后台日志排查差异。


在UniApp中进行微信支付时,签名认证失败通常由以下原因引起。请按步骤排查:

1. 检查参数顺序和大小写

微信支付要求参数按ASCII码字典序排序,且严格区分大小写。确保服务端生成签名时:

  • 参数名按字母顺序排序
  • 使用正确的键名(如appIdtimeStampnonceStrpackagesignType
  • 值为空时不参与签名

示例代码(服务端):

// 按参数名ASCII字典序排序
const sortedKeys = Object.keys(params).sort();
let signString = '';
sortedKeys.forEach(key => {
  if(params[key] !== '' && key !== 'sign') {
    signString += `${key}=${params[key]}&`;
  }
});
signString += `key=${YOUR_WECHAT_PAY_KEY}`; // 商户API密钥
const sign = md5(signString).toUpperCase(); // MD5加密并转大写

2. 验证商户密钥和配置

  • 商户API密钥:登录微信支付商户平台,确认使用的密钥与配置一致(32位字符)
  • AppID和商户号:检查UniApp项目manifest.json中配置的AppID与商户平台绑定的AppID一致

3. 时间戳格式

确保timeStamp字符串类型的10位秒级时间戳:

const timeStamp = Math.floor(Date.now() / 1000).toString();

4. package参数格式

package参数应为prepay_id=xxx格式,且需确认预支付订单生成成功:

// 正确格式示例
const package = `prepay_id=${response.prepay_id}`;

5. 签名类型和加密方式

  • 设置signType: 'MD5'(默认)
  • 使用MD5加密,结果转为大写

6. 网络请求和预支付订单

  • 检查统一下单接口是否返回成功的prepay_id
  • 确认网络请求未因跨域或证书问题被拦截

7. 客户端调用支付API

UniApp中调用方式:

uni.requestPayment({
  provider: 'wxpay',
  timeStamp: timeStamp,
  nonceStr: nonceStr,
  package: package,
  signType: 'MD5',
  paySign: sign, // 最终签名
  success: (res) => { /* 支付成功 */ },
  fail: (err) => { 
    console.error('支付失败:', err); 
    // 具体错误信息可在err中查看
  }
});

8. 常见错误排查

  • 签名错误:对比服务端与微信支付签名校验工具的结果
  • 订单重复:同一预支付订单号不可重复发起支付
  • 金额不符:确认支付金额与下单时一致(单位为分)

9. 调试建议

  • 在服务端打印签名字符串,与微信官方签名工具对比
  • 检查请求参数是否多出空格或特殊字符
  • 确认证书和域名配置正确(仅Android)

按照以上步骤逐一检查,通常能解决签名认证失败的问题。如果问题持续,建议在微信支付商户平台查看详细错误日志。

回到顶部