微信支付[签名错误]![CDATA[签名错误]]

问个问题:[关于微信支付]
背景:现有一认证微信服务号,需要在自定义菜单跳转的网页中实现商城支付功能.商城使用PHP,MYSQL,实现
现在在做微信支付功能遇到问题.

1.目前在做微信公众号支付>>统一下单API.
[统一下单APIlink:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1].
需要接上API,并获取SUCCESS状态下的数据[主要是想获取>预支付交易会话标识 (prepay_id) ]
2.现在问题:在向API发送POST请求后,得到的结果是FAILT.
问题提示:[返回的原数据]
<![CDATA[FAIL]]>
<![CDATA[签名错误]]>

3.我做过的事情:
a.使用"在线签名验证工具"验证自己生成的签名,我生成的签名与该工具得出的结果是一样的.
["在线签名验证工具"url:http://mch.weixin.qq.com/wiki/tools/signverify/]
b.我是POST XML字符串过去的.与"在线签名验证工具"中提出的结果是一样的.

4.纠结的地方:微信公众平台后台设置,签名,POST URL,sign,甚至是XML数据,我都检查过了,但API返回结果竟然还是 签名错误 .
我唯一想到的问题可能就是,"在线签名验证工具"不靠谱.但我找不到其它的方式来验证我的签名是否正确.

有哪位网友做过微信公众号支付的朋友帮忙查看一下吗?纠结了好久了.


官方的代码如果一直提示,你可以尝试一下把商户的KEY重新设置一下,我就是这样的,什么都没问题,重新设置了一下KEY就好了

转:http://ask.csdn.net/questions/179076
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在 Node.js 中进行微信支付签名和验签的具体步骤如下: 1. 创建一个对象,包含必要的参数。例如: ```javascript const params = { appid: 'your_appid', mch_id: 'your_mch_id', nonce_str: '随机字符串', body: '商品描述', out_trade_no: '商户订单号', total_fee: '订单总金额,单位为分', spbill_create_ip: '用户端实际ip', notify_url: '接收微信支付异步通知回调地址', trade_type: 'JSAPI', openid: '用户的openid' }; ``` 2. 对参数按照字典序排序,得到一个新的参数对象。 ```javascript const sortedParams = Object.keys(params).sort().reduce((result, key) => { result[key] = params[key]; return result; }, {}); ``` 3. 拼接参数字符串,不包括签名。 ```javascript const paramsString = Object.keys(sortedParams).map(key => `${key}=${sortedParams[key]}`).join('&'); ``` 4. 在拼接的参数字符串末尾加上商户支付密钥,得到一个新的字符串。 ```javascript const apiKey = 'your_api_key'; const signString = `${paramsString}&key=${apiKey}`; ``` 5. 对新的字符串进行 MD5 加密,得到签名值。 ```javascript const crypto = require('crypto'); const sign = crypto.createHash('md5').update(signString, 'utf8').digest('hex').toUpperCase(); ``` 6. 将签名值添加到参数对象中。 ```javascript params.sign = sign; ``` 7. 将参数对象转换成 XML 格式。 ```javascript const xml2js = require('xml2js'); const builder = new xml2js.Builder({rootName: 'xml', cdata: true, headless: true}); const xml = builder.buildObject(params); ``` 8. 发送支付请求或接收微信支付异步通知时,需要对 XML 数据进行验签。具体步骤如下: - 将 XML 数据解析成 JavaScript 对象。 ```javascript const parser = new xml2js.Parser({trim: true, explicitArray: false, explicitRoot: false}); const parsed = await parser.parseStringPromise(xml); ``` - 按照字典序排序,得到一个新的对象。 ```javascript const sorted = Object.keys(parsed).sort().reduce((result, key) => { result[key] = parsed[key]; return result; }, {}); ``` - 拼接参数字符串,不包括签名。 ```javascript const sortedString = Object.keys(sorted).filter(key => key !== 'sign').map(key => `${key}=${sorted[key]}`).join('&'); ``` - 在拼接的参数字符串末尾加上商户支付密钥,得到一个新的字符串。 ```javascript const signCheckString = `${sortedString}&key=${apiKey}`; ``` - 对新的字符串进行 MD5 加密,得到签名值。 ```javascript const signCheck = crypto.createHash('md5').update(signCheckString, 'utf8').digest('hex').toUpperCase(); ``` - 将签名值与 XML 数据中的签名值进行比较,如果相同则验签通过。 ```javascript if (signCheck === parsed.sign) { // 验签通过 } else { // 验签失败 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值