由于同步通知和異步通知都可以作為支付完成的憑證,且異步通知支付寶一定會確定發送給商戶服務端。為了簡化內建流程,商戶可以将同步結果僅僅作為一個支付結束的通知(忽略執行校驗),實際支付是否成功,完全依賴服務端異步通知。
以下來介紹下同步驗簽和異步驗簽;
為了快速接入并避免接入過程中的簽名驗簽問題,強烈建議您先下載下傳對應語言版本的SDK并引入您的開發工程。
自行實作驗簽
如果未使用支付寶開放平台SDK,需要自行實作驗簽過程。 其中同步傳回和異步通知封包格式及驗簽方法有所差別,詳見以下說明:
同步傳回驗簽
開發者隻對支付寶傳回的json中xxx_response的值做驗簽(xxx代表接口名)。
xxx_response的json值内容需要包含首尾的“{”和“}”兩個尖括号,雙引号也需要參與驗簽,如果字元串中包含https的正斜杠,需要先将正斜杠做轉義,預設列印出來的字元串是已經做過轉義的。建議驗簽不通過時将正斜杠轉義一次後再做一次驗簽。 如當面付掃碼支付擷取二維碼的傳回内容為:
則待驗簽字段為:
調用驗簽函數:
使用各自語言對應的SHA256WithRSA(對應sign_type為RSA2)或SHA1WithRSA(對應sign_type為RSA)簽名驗證函數,傳入待驗簽字段、支付寶公鑰、簽名内容(sign),驗簽方法(signType)進行驗簽,根據傳回結果判定是否驗簽通過。
異步通知驗簽
某些情況下(比如掃碼支付成功時),支付寶會給商戶發送異步通知。 如果某商戶設定的通知位址為
https://api.xx.com/receive_notify.htm,對應接收到通知的示例如下:
驗簽流程:
1.在通知傳回參數清單中,除去sign、sign_type兩個參數外,凡是通知傳回回來的參數皆是待驗簽的參數。
2.将剩下參數進行url_decode, 然後進行字典排序,組成字元串,得到待簽名字元串:
3.将簽名參數(sign)使用base64解碼為位元組碼串。
4.使用RSA的驗簽方法,通過簽名字元串、簽名參數(經過base64解碼)及支付寶公鑰驗證簽名,根據傳回結果判定是否驗簽通過。
可以參考
開放平台SDK源碼中的AlipaySignature.rsaCheckV1方法,示例如下: