## 签名及验签
(1)请求签名
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对(不进行urlencode转码,原值拼装)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步,在stringA最后拼接上ticket得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
举例:
假设传送的参数如下:
appid: ZF000000000000000001
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接 ticket:
stringSignTemp=stringA+"&ticket=123”
MD5签名方式
sign= strtoupper (md5 (stringSignTemp));
(2)回调签名
签名规则 与 请求签名规则相同,只是将上述第二步中 拼接 ticket 变为应用appSecret。
举例:
假设传送的参数如下:
payTime: 1587878343
amount: 100
buyerId: ajsdfkdshfksdjhfj
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="amount=100&buyerId=ajsdfkdshfksdjhfj&nonce_str=ibuaiVcKdpRxkhJA&payTime=1587878343";
第二步:拼接 商户secret:假设应用appSecret = 2sajhd
stringSignTemp=stringA+"&ticket=2sajhd”
注意: 按 key=value 格式,此处ticket使用appScrect的值,而不改变key;
MD5签名方式
sign= strtoupper (md5 (stringSignTemp));