大話 AliPay踩的坑

大話 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只要設置appIDprivateKey(真實App裏,privateKey等數據嚴禁放在客戶端,加簽過程務必要放在服務端完成;防止商戶私密數據泄露,造成不必要的資金損失,及面臨各種安全風險;)就可以使用。

      在Alipay提供的工具和OpenSSL生成中都可以看到PKCS8格式(wiiki-PKCS8wiiki-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中自帶的阿里公鑰,不能使用開放平臺中獲取的公鑰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章