uniapp微信app支付签名失败怎么办

在uniapp中调用微信APP支付时遇到签名失败的问题,错误提示是"sign invalid"。已经按照官方文档配置了appid、partnerid、prepayid、package和noncestr等参数,时间戳也做了处理,签名算法用的是MD5。检查了好几遍参数顺序和拼接方式都没发现问题,但就是一直报签名错误。请问可能是什么原因导致的?有没有具体的排查步骤?

2 回复

检查参数是否正确,特别是appId、timeStamp、nonceStr、package、signType是否与后端返回一致。确保签名算法正确,使用MD5或HMAC-SHA256。检查商户密钥是否正确,时间戳是否为秒级。


在UniApp中微信App支付签名失败通常由以下原因导致,可按步骤排查:

1. 检查签名参数

确保所有参与签名的参数(如appid、partnerid、prepayid、package、noncestr、timestamp)与服务端返回完全一致,特别注意:

  • 参数名大小写必须严格匹配
  • 参数顺序需按字典序排序后签名
  • 空值参数不参与签名

2. 验证签名算法

微信支付要求使用MD5HMAC-SHA256

// 示例签名步骤(以MD5为例)
const crypto = require('crypto');

function sign(params, key) {
  const sortedParams = Object.keys(params)
    .filter(k => params[k] && k !== 'sign') // 过滤空值和sign
    .sort()
    .map(k => `${k}=${params[k]}`)
    .join('&');
  const signStr = `${sortedParams}&key=${key}`;
  return crypto.createHash('md5').update(signStr).digest('hex').toUpperCase();
}

3. 核对商户密钥

  • 登录微信商户平台检查API密钥(32位)
  • 确认服务端使用的密钥与商户平台设置一致
  • 切勿在客户端存储密钥,签名应在服务端完成

4. 检查时间戳

  • 时间戳需为10位Unix时间戳(秒级)
  • 与服务端时间差不超过5分钟

5. 排查常见错误

  • package值格式错误:应为Sign=WXPay
  • 重复支付:同一订单号重复发起支付
  • 网络延迟:预支付会话标识(prepayid)过期(有效期2小时)

6. 调试建议

  1. 在服务端打印完整的签名字符串
  2. 使用微信支付签名验证工具核对
  3. 检查UniApp manifest.json中已配置App支付权限

示例代码结构

// 服务端返回支付参数示例
{
  "appid": "wx1234567890",
  "partnerid": "1900000109",
  "prepayid": "wx201410272009395522657a690389285100",
  "package": "Sign=WXPay",
  "noncestr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
  "timestamp": "1412000000",
  "sign": "A842B45937F6EFF60DEC9R52A31A8B77"
}

通过以上步骤逐步排查,通常能解决签名失败问题。重点确保服务端签名逻辑与微信要求完全一致。

回到顶部