问题描述
调用虚拟支付接口 wx.requestVirtualPayment 返回错误:
{errMsg: "requestVirtualPayment:fail PAY_SIG_INVALID", errno: -15006, errCode: -15006}
尽管云函数生成的签名(paySig)经本地工具验证正确,且前端参数传递无误。
基本信息
- 小程序 AppID:
wx55d13d49328e0f4a - OfferID:
1450493928 - 道具ID:
unit_1(1元道具,已发布线上版本) - 支付环境:正式环境(
env=0)
已进行的排查
- 道具发布状态:
unit_1已在虚拟支付后台发布为“线上版本”。 - 云函数签名生成:
- 使用正式的 AppKey 。
- 严格按照微信文档进行字段排序、类型转换。
- 打印的
signDataStr和paySig如下(示例): - text
signDataStr: {"attach":"test","buyQuantity":1,"currencyType":"CNY","env":0,"goodsPrice":100,"offerId":"1450493928","outTradeNo":"B41658151581","productId":"unit_1","zoneId":"1"}
paySig: fb84c62b1f331fc0d1c03859b05d05930a19915cc3686ea0e6353bb8391677ee
- 使用相同字符串和 AppKey 在本地 HMAC-SHA256 工具计算,结果与云函数一致。
- 前端调用:
mode明确为'short_series_goods'。signData、paySig、signature直接使用云函数返回的字符串,未做额外处理。- 控制台打印的
virtualPayParams与云函数返回一致。
附件材料
- 云函数完整日志(包含签名生成和返回结果)
- 前端控制台输出(包含
orderRes和virtualPayParams内容) - 道具
unit_1后台截图(显示“线上版本”)
请求帮助
希望微信后台协助查询该次签名校验失败的具体原因,可能是:
zoneId字段类型要求(字符串 vs 数字)在正式环境有特殊校验。- 订单号
outTradeNo是否因之前测试被标记为异常。 - 正式环境 AppKey 与后台记录是否完全一致(尽管已核对)。
- 其他未知的签名校验细节。
如有需要,可提供测试用的 outTradeNo 供后台跟踪。
联系方式
18810969734
请将以上信息连同附件一并提交,以便快速解决。

调用云函数传递的参数代码发出来看看
function generateVirtualPayParams(offerId, appKey, sessionKey, outTradeNo, productId, goodsPrice, buyQuantity, attach, env = 0) {
const signDataObj = {
attach: typeof attach === 'string' ? attach : JSON.stringify(attach),
buyQuantity: Number(buyQuantity),
currencyType: 'CNY',
env: Number(env),
goodsPrice: Number(goodsPrice),
offerId: String(offerId),
outTradeNo: String(outTradeNo),
productId: String(productId),
zoneId: '1' // 也尝试过数字1,问题依旧
};
const sortedKeys = Object.keys(signDataObj).sort();
const sortedSignData = {};
sortedKeys.forEach(key => { sortedSignData[key] = signDataObj[key]; });
const signDataStr = JSON.stringify(sortedSignData);
const paySig = crypto.createHmac('sha256', appKey).update(signDataStr).digest('hex');
const signature = crypto.createHmac('sha256', sessionKey).update(signDataStr).digest('hex');
return { signData: signDataStr, paySig, signature };
}
前端调用虚拟支付的代码(直接使用云函数返回的参数):
javascript
wx.requestVirtualPayment({
mode: 'short_series_goods',
signData: signData, // 云函数返回的字符串
paySig: paySig,
signature: signature,
success: ...,
fail: ...
});
text
paySig = to_hex(hmac_sha256(appKey, signData))
其中 signData 是包含支付相关字段的 JSON 字符串(已排序),不包含 uri 部分。我们已严格按照此规则实现,且本地验证签名与云函数生成一致。
key 和环境 用对了么?
正式环境 env = 0 沙盒环境也试过 一样的问题
使用的 AppKey 是从虚拟支付后台复制的现网
道具 unit_1 已发布为“线上版本”,
能不能有个真人回复啊 这AI回的没用啊