大話 AliPay踩的坑
傳送門->大話微信支付踩的坑
做三方集成的時候按照官方的步驟進行集成基本不會出現太多問題。最近在做App集成支付,主要就是微信支付、支付寶。在集成支付寶支付的時候還是遇到一些坑,簡單分享一下:
RSA和RSA2簽名算法
開始對這兩個簽名算法不是很瞭解,混淆了兩種算法。Alipay提供的工具沒有進行區分RSA和RSA2,我誤認爲密鑰長度2048的是RSA2。導致密鑰使用錯誤。
現在簡單介紹一下:
關於簽名算法的區別:
開放平臺簽名算法名稱 | 標準簽名算法名稱 | 備註 |
---|---|---|
RSA2 | SHA256WithRSA | 強制要求RSA密鑰的長度至少爲2048 |
RSA | SHA1WithRSA | 對RSA密鑰的長度不限制,推薦使用2048位以上是 |
如下是使用OpenSSL工具生成的密鑰(MAC下應該有內置的OpenSSL):
OpenSSL> genrsa -out app_private_key.pem 2048 #生成私鑰
OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem #Java開發者需要將私鑰轉換成PKCS8格式
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #生成公鑰
OpenSSL> exit #退出OpenSSL程序
在Finder中查看:
目前生成RSA2的方法貌似只能通過代碼PHP或者JAVA。
注意:Alipay提供的工具產生的密鑰是txt
格式的,使用OpenSSL
生成的是pem
格式的(據瞭解之前版本的工具生成的也是pem
格式)。官方建議使用提供的工具生成,但是從實踐上看還是直接生成pem
格式的文件(我們後臺使用的是PHP)。當然目前提供的方案還是隻能使用OpenSSL
生成。
關於數字簽名推薦兩篇文章:
What is a Digital Signature?.
中文翻譯的可以參考:數字簽名是什麼?
AlipayDemo 密鑰使用錯誤
在賬號配置完成之後,爲了測試賬號是否可以正常的支付,使用官方Demo進行賬號測試。官方的Demo只要設置appID
和privateKey
(真實App裏,privateKey等數據嚴禁放在客戶端,加簽過程務必要放在服務端完成;防止商戶私密數據泄露,造成不必要的資金損失,及面臨各種安全風險;)就可以使用。
在Alipay提供的工具和OpenSSL
生成中都可以看到PKCS8
格式(wiiki-PKCS8、wiiki-PKCS)。JAVA需PKCS8
格式,其他語言直接使用生成的私鑰就可以了。
但是,在Demo中直接使用生成的密鑰,簽名時簽名結果爲nil
。但是換成PKCS8
時可以成功。但是後臺(PHP)還是需要使用直接生成的密鑰。在Demo上可以簽名成功併成功支付之後,就可以通過後臺簽名,基本就可以跑通了,但是又遇到坑了…………
簽名數據出錯
爲了快速驗證後臺加簽是否正確,和後臺的同學商議,可以先拿到簽名結果,在App裏直接進行測試,通過之後直接就可以走接口了。結果還是出了問題:
顯示:
系統繁忙,請稍後再試。(ALI40247)
。
最後的最後發現發現了問題。我們的後臺可以直接使用瀏覽器進行接口的數據請求,爲了快速驗證加簽結果,就直接通過瀏覽器請求從頁面上copy出加簽結果進行調試。問題是:瀏覽器把加簽後的數據進行了部分轉義,導致的結果就是App最後拿到的結果是錯誤的。
一個道理;別懶~
PHP、SDK版本問題
驚喜的是在調試通過之後,放到仿真環境上的時候又有問題了。。。。。。後臺驗籤失敗
後臺童鞋的PHP版本是PHP7,仿真環境的PHP使用的PHP5.6版本。
在本地test環境調試時,Alipay的公鑰直接在Alipay的網站上直接copy到pem
文件中。PHP7可以直接讀的到。但是PHP5.6不支持複製生成的pem公鑰格式,導致驗籤失敗。
基於目前的後臺開發環境,PHP端的異步回調必須使用ali-php-sdk中自帶的阿里公鑰,不能使用開放平臺中獲取的公鑰。