上次在接入支付寶的時候就碰到了交易訂單處理失敗,請稍后再試(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