## 簽名及驗簽
(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));