很多人在做微信支付的时候会在生成签名这里遇到困难,主要原因之一是不知道微信签名验证的原理,我这里简单谈一下。
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
这是官方文档,参数可以对照一下。
我们生成的签名字符串是这样子的
appid=appid&attach=attach&body=body&device_info=device_info&mch_id=mch_id&nonce_str=nonce_str¬ify_url=notify_ur&openid=openid&out_trade_no=out_trade_no&total_fee=1&trade_type=JSAPI&key=key
然后根据md5算法得到签名,而这个签名在提交支付的时候往往会提示签名是错误的
网上同质化的内容我就不说了,可以自己去百度,我说一下签名验证的原理。
当你把签名字符串传递到微信后,微信会将appid、key两个参数进行替换,微信是知道那个小程序发起的支付请求,所以微信后台知道是那个appid,其次微信后台会根据mch_id得到key,所以会把key替换掉,然后,微信会根据替换后的签名字符串按照md5自己生成一遍签名,最后将你传入的sign和微信后台生成的sign进行比对,如果相等,签名校验成功,如果不等,则校验失败
同时,微信后台也会校验openid是否属于此appid(也就是appid的这个小程序是否有这个用户),如果openid的用户不属于appid的小程序,会提示openid错误。