該錯誤的引起因素有好幾點:
1、傳遞的參數有空值。在支付寶的支付請求url中,某個參數是空值。這樣空值在經過md5簽名以後,比對會報錯,所以請注意您傳遞過來的url中無空值。建議檢查您購物車的支付寶代碼,例如:subject="shop"而非subject= ""
2、程序中安全校驗碼填寫錯誤(請務必保存好該碼,泄漏出去有可能被人僞造消息)。在您拿到不同測試中都有一個key的參數,該參數代表支付寶的安全校驗碼。從賬戶內複製過來的時候,會多餘空格,請消息檢查。例如某一個用戶的key是kXXXXXXXXXXXXXXXXXXXXXXXXXXXati,複製到程序中key=” kXXXXXXXXXXXXXXXXXXXXXXXXXXXati ”多了空格的。
3、中文編碼的問題。不同網站採用不同的中文編碼。有utf-8.gbk,iso-8859-1等,而程序中md5對中文簽名會不一樣,造成顯示該錯誤。現asp的程序沒有直接utf-8編碼的md5。Php和jsp。Net程序都是支持該編碼的,您可以通過支付接口的 _input_charset = “utf-8” 參數設置制定的字符集,並且我們返回通知也會使用該字符集,解決亂碼的問題。
4私鑰沒有轉換爲pkcs8格式
解決方法:
將私鑰轉成PKCS8替換一下原私鑰即可
1、生成私鑰pem, 執行命令openssl genrsa -out rsa_private_key.pem 1024
2、生成公鑰,執行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
3、將RSA私鑰轉換成PKCS8格式,命令執行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt PHP服務端語言讀取私鑰不需要PKCS8轉換。