1. 程式人生 > >接入支付寶出現交易訂單處理失敗,請稍後再試(ALI64)的錯誤

接入支付寶出現交易訂單處理失敗,請稍後再試(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