早就听说微信支付文档写的不是很好,奈何没想到签名这一块整整折磨了我2天时间。
网上招了一些资料但不是特别全面,因为2018年的微信支付跟之前的不太一样。所以自己慢慢踩坑借鉴,终于做完了两次签名的过程。
其实很早的时候,就想写技术blog了,之前因为懒和菜的原因,现在希望自己能一步一个脚印把这件事干好。
话题扯远了,我们正式开始说明一下微信支付的两次签名
第一次签名应该是后台做的,因为项目的实际情况,要求前端自己进行签名。
因为要请求统一下单接口才能获得调起微信支付功能所需要的prepay_id
而请求这个接口又需要签名,我调试支付时大多数时间都卡在了第一次签名,因为文档写的太简单了。
很明显的是,你首先要把算法写对。算法如下:
这里的signParams的字典里放的是加密必须要的字段。注意,这里所需的字段是请求统一下单的接口里面的所有的字段(除开要生成的sign),很多人都因为被官方文档误导了,少了一些字段去生成签名,然后请求统一下单的接口,会报签名失败的错误。
算法是首先字典转成字符串,然后按照首字母顺序排序,再加上密钥的key
然后你会遇到第二个坑,这个密钥key不是appSecret,而是API密钥,需要在商户平台设置
最后再进行MD5加密就行了
拿到正确的sign之后,就可以请求接口啦~
请求接口时,需要注意两点:
1、需要对字典转xml
转xml有两种方式,第一种可以自己组装,第二种可以用XMLDictionary
2、请求的字段必须和签名的字段一样(除sign外)
不一样铁定报签名失败的错
我这边用的是官方方法请求的,注意要使用POST请求,并且加上UTF-8
请求成功后,返回值会是这样的:
如果你的result_code为FAIL,请根据错误码来寻找哪里的问题
这样你就拿到了prepay_id,可以进行调起微信支付的操作了。
首先,接口的返回值格式是xml的,你需要将他转成字典格式。我用的是开源库XMLDictionary
返回值里有用的几个字段分别是:
appid、prepay_id、mch_id、nonce_str
都是跟自己传的一一对应的
其他要传的字段
packge必须写为Sign=WXPay
timeStamp必须是10位的时间戳
要传sign不是返回值里的sign,而是第二次签名需要生成的sign
还是老规矩,排序然后MD5加密最后加上API商户密钥
这样你就可以成功调起微信支付啦~