微信支付细节说明(服务商版本)
官方文档
统一下单: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_1
查单: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_2
签名: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=4_3
工具: https://pay.weixin.qq.com/wiki/tools/signverify/
统一下单
根据上面列出的统一下单
文档,将必填的参数准备就绪后,计算出一个签名sign
,就可以发送到微信服务器了。
计算签名sign
就开始有些坑了,请先参考签名
文档。如下是一些注意点:
- 字段排序是靠key的ascii编码来排序的
- 没有值的字段不参与签名,比如拼接后的字符串为
xxx=&yyy=1&qqq=2
,那么应该将xxx
字段去掉。 - 计算签名用的是二进制,而且是经过utf8编码的(如果不含中文、特殊字符,一般没编码问题)
- 参与计算的key应该看好是哪个(我使用小程序支付,所以用的小程序的密钥)
- 支付类型
trade_type
别选错,小程序就是JSAPI
- 每个字段要看好别填错了,特别是
appid
、mch_id
、sub_mch_id
查单
根据上面列出的查单
文档,将必填的参数准备就绪后,计算出一个签名sign
,就可以发送到微信服务器了。
请求的数据中,sign
的计算方式和统一下单
的请求是一样的。但是响应报文在校验签名时有些注意点:
- 响应报文中的数据编码是
ISO-8859-1
,所以签名的时候要用这种编码来计算(别用utf8
了,巨坑) - 微信发的
nonce_str
和你发过去的'nonce_str'是不一致的,不要混淆了 - 微信响应的xml中已经含有
sign
字段,得先去掉,再计算签名 - 微信响应的xml中有些字段的值是空的,要去掉这些字段后才能计算签名(巨坑)