生成微信支付签名的方法
很多学员不太理解微信的签名是什么,实际上签名是微信的安全校验机制,就拿微信支付的扫码支付模式一来说,从开始生成二维码到支付成功,中间经过大大小小十几次的请求,如果没有签名验证机制很可能某一步操作就会被恶意篡改,进而导致商户的资金损失。
在微信扫码支付的模式一中,通过一个链接来生成支付二维码,我们先看看这个链接:
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
上面的这个链接实际就是我们扫描的用来付款的二维码的本来面目,为了用户方便支付和使用才将这个链接转换成二维码用于扫描支付的,我们同时可以看到这链接有很多参数,比如appid公众号ID、mch_id商户号、product_id商品ID等参数,其中也有我们今天要分析的主角:sign 签名
这个签名并不是一个普通的加密串,它是通过固定的算法得来的,算法并不难,而且在微信的各种支付场景下签名都是非常重要的校验机制。
我们来看一下,签名到底是怎么得来的:
1、接受客户端的发送的参数,比如:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
2、对接受到的上面的参数进行二次处理,参照key = value的格式拼装成一个新的字符串,但是这个个字符串中的key也就是我们的参数名称比如appid、mch_id等,必须按照字母表的顺序从小到大排列,上面有appid,mch_id,device_ifno,body,nonce_str那么根据首字母按照字母表的顺序排列应该就是这样:
stringA=”appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA”;
我们把排序后的结果赋值给了一个变量
3、在上面的字符串的最后拼装我们微信支付后台提供的key值也就是api秘钥:
stringSignTemp=stringA+”&key=192006250b4c09247ec02edce69f6a2d”
4、对上面的数据进行md5加密,并将加密后的32为的字符串转换为大写:
sign=MD5(stringSignTemp).toUpperCase()=”9A0A8659F005D6984697E2CA0A9CF3B7″
以上就是前面的生成方式。