关键信息
- 小程序 AppID:wx279137ac641a2674
- offerId:1450482034
- 环境:env=0(测试/沙箱)
- mode:short_series_goods
- 商品:productId=aa_aa,goodsPrice=100(分),buyQuantity=1,currencyType=CNY
- app_key:虚拟支付测试环境密钥,长度 32,前缀 X03y...(出于安全不提供全量)
复现订单(可选其一)
- outTradeNo:VP17726320951078892
signData(原文,与小程序端 wx.requestVirtualPayment 的 signData 完全一致)
{"env":0,"offerId":"1450482034","buyQuantity":1,"currencyType":"CNY","productId":"aa_aa","goodsPrice":100,"outTradeNo":"VP17726320951078892","attach":"{\"vipGrade\":2,\"pricePayType\":\"payMonthly\",\"functiontype\":4}"}
signature 说明(已通过)
- signature 使用 HMAC_SHA256(session_key, signData原文),提交 64 位 HEX
- 若改成 Base64 会立刻返回 SIGNATURE_INVALID,因此可确认当前 signature 已被微信侧正确验签(严格按 signData 原文)
我方 paySig 计算与尝试(均返回 PAY_SIG_INVALID)
我们已在服务端输出每种 need_sign_msg 原文与对应 paySig(HEX 小写/大写/Base64),并在小程序端逐一尝试,结果均为:
requestVirtualPayment:fail PAY_SIG_INVALID
已尝试的 need_sign_msg 口径包括(以下为原文示例):
- JSON 原文拼接(URI + '&' + post_body)
requestVirtualPayment&{signData_json原文}
- 换行分隔
requestVirtualPayment\n{signData_json原文}
- mode 作为额外参数(不进入 signData,以避免影响 signature)
requestVirtualPayment&{signData_json原文}&mode=short_series_goods
- 字段展开 querystring(解析 signData 后按 key 字典序拼接)
requestVirtualPayment&attach=...&buyQuantity=1¤cyType=CNY&env=0&goodsPrice=100&mode=short_series_goods&offerId=1450482034&outTradeNo=VP...&productId=aa_aa
(含对 value rawurlencode 的版本也试过)
需要微信侧协助确认的问题
- 请微信侧针对 outTradeNo=VP17726320951078892 在后台核验并说明:PAY_SIG_INVALID 的精确原因(例如 app_key 不匹配、环境/能力未开通、路由到其他 offerId/appid、账号策略/灰度等)。
- 请明确:微信侧验签实际使用的 need_sign_msg 原文(或等价拼接规则/参与字段),与我方上述哪一种不同?是否存在文档未披露的隐含字段参与 paySig 验签?

算法有问题吗?什么语言写的?
最后什么结果