Django支付寶支付 int() argument must be a string, a bytes-like object or a number, not 'Sequence'錯誤


 自寫網站,第一次接觸支付,准備對接最容易的支付寶。網上django使用支付寶支付的文章也很多,基本都和支付寶官方SDK中的使用示例差不多。於是按照這個套路,復制代碼(執行之前,請先去支付寶開放平台申請應用、配置開發參數、提交審核),跑一下試試。

       毫無意外,錯誤產生了:

alipay.aop.api.exception.Exception.RequestException: [516aa23a-cdfd-11e9-a62d-441ca8249e46]request sign failed. int() argument must be a string, a bytes-like object or a number, not 'Sequence'

 

      把錯誤信息復制,網上搜索,關於int() argument must be a string, a bytes-like object or a number, not 'Sequence'的錯誤不少,但就是沒有和支付寶支付掛鈎的。仔細看錯誤提示,發現錯誤是支付寶SDK中這行代碼signature = rsa.sign(sign_content, rsa.PrivateKey.load_pkcs1(private_key, format='PEM'), 'SHA-256')拋出的,難道SDK有問題?

      不可能!很顯然(實際上花了不少時間,我誤以為是密鑰不匹配,各種更換秘鑰,錯誤依舊),密鑰格式有問題,程序無法解析傳入的私鑰,認為這個參數格式不正確。我的密鑰是用支付寶開放平台RSA簽名驗簽工具生成的,官方的工具怎么會出問題呢?

      經過無盡的折磨,終於弄明白問題出在哪里了:

      也就是說,問題出在私鑰的格式上,Python無法識別PKCS8格式的私鑰,如果你的私鑰是“點擊獲取(CSR)”來的,那么必須轉換格式為PKCS1。

      千萬不要誤以為你上面勾選了“PKCS1”,再點擊“點擊獲取(CSR)”,得到的就是PKCS1格式的密鑰,因為我原本就是這么以為的,然后浪費了一天的時間。PS:公鑰不需要轉換格式,因為PKCS1、PKCS8的密鑰是可以匹配成功的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM