当你申请接入微信支付的请求被通过后,你就拥有了使用微信收付款的能力。在整个微信支付的流程中,必不可少的一项就是签名,微信服务器通过你发送的签名判断你是不是合法用户,同时也取得了交易对象。那么微信支付的签名算法是怎样的逻辑呢?我们一起来看看微信支付的说明文档,学习下签名算法的构建。声明下,每种语言的函数方法可能不一样,但逻辑都是通用的,我这里使用的是PHP。
签名算法说明文档地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
签名校验工具地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1
我们可以使用官方的签名校验工具生成签名,把它与与我们自己写代码生成的签名进行对比判断,看看算法是否正确。
微信支付签名算法逻辑
第一步
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
注意事项:
- 参数名ASCII码从小到大排序(字典序);
- 如果参数的值为空不参与签名;
- 参数名区分大小写;
- 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
- 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步
在第一步得到的字符串上拼接商户key,拼接方式与第一步一样,使用URL键值对的格式(即key1=value1&key2=value2…)
第三步
将第二步得到的字符串B进行MD5加密(加密方式参考说明文档中微信支付支持的加密)
第四步
将第三步得到的字符串C转换成大写字母,得到最后签名值。
PHP微信支付签名源码
public function GetSign($params,$key){ //升序 ksort($params); //数组转成URL键值对并拼接商户key $str=urldecode( http_build_query($params)."&key=".$key); //MD5加密并转成大写 return strtoupper(md5($str)); }
使用方式:
$Sign=GetSign([ 'appid'=>'appid', 'mch_id'=>'商户ID', 'nonce_str'=>'随机字符串不超过32位' ]); var_dump($Sign);
为了检验我们程序生成的签名值是否与微信支付官方工具生成的签名值是否一致,我们将appid、商户ID、随机字符串复制到官方签名工具中去,生成签名结果如下:
使用浏览器的查找功能,成功查找到我们生成的签名值,说明我们的php微信支付签名算法正确,可以进行下一步开发。
评论 (2)