接入支付寶出現交易訂單處理失敗,請稍後再試(ALI64)的錯誤
上次在接入支付寶的時候就碰到了交易訂單處理失敗,請稍後再試(ALI64)這樣的錯誤,後來經過排查和總結,一般來講這種問題都是公鑰和私鑰沒有正確配置造成的。支付寶這邊為了保證資料在傳輸時不被篡改,使用了rsa這種非對稱的加密方式。大概的流程如下:
理解這種流程後,因為支付寶的金鑰我們是看不到,需要檢測我們自己的公鑰和金鑰,還有支付寶的公鑰。
公鑰不是一行
實際中的話,我們下載支付寶的公鑰,可以看到公鑰是一行的。常見的格式都有帶BEGIN PUBLIC KEY、END PUBLIC KEY這樣的字眼:
-----BEGIN PUBLIC KEY—— ...... -----END PUBLIC KEY——
這裡需要把自己的公鑰調整為一行,刪除換行、頭尾begin、end行。
公鑰沒有傳到支付寶伺服器
這個有時會忘記掉,因為支付寶要用我們的公鑰解開我們傳遞到支付寶的資料,所以需要將我們自己的公鑰上傳到支付寶伺服器,記的搞成一行。另外還有一個要注意的是,可以傳公鑰的地方都可以傳一下。如下圖合作伙伴金鑰管理、開放平臺金鑰管理、無線產品金鑰管理都需要傳一下。我估計這三個是用在不同的業務上。
私鑰格式不對
私鑰的格式有多種,如:pem、pkcs、der等格式,不同的程式語言在處理上需要的格式不一樣,php處理用openssl_get_privatekey需要pem格式,java可以處理pkcs格式。這方面稍微注意下。
上面說到公鑰和和私鑰的問題,支付寶有提供一個工具可以用來檢測,上次我們也是通過這個工具才檢測出是私鑰格式不對造成的。
這裡附上生成公鑰,金鑰的方式
用openssl工具生成:
生成私鑰pem
$ openssl genrsa -out rsa_private_key.pem 1024
此時會在當前目錄生成rsa_private_key.pem檔案,php私鑰就是用這個檔案。
生成公鑰
$ openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
此時會在當前目錄生成rsa_public_key.pem檔案,這個就是公鑰檔案,上傳到淘寶的就是這個,注意去除掉換行、頭和尾的begin和end。
如果你需要使用pkcs8格式,可以按照如下生成:
$ openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt