前言
最近因为业务原因,需要使用支付宝开放平台的一些 Api 写一些脚本,所以选择了 Python,然后就遇到坑了,不是一个坑,而是好几个
问题 alipay.aop.api.exception.Exception.RequestException
具体错误信息如下:
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'
问题原因说很简单也很简单,就是签名错误,但是私钥都是直接下载的,理论上不会错误。但是因为用的是 Python 版本,直接下来的私钥其实只能仅 Java 可用,是 PKCS8,而非 Java 的应该用 PKCS1
所以解决办法也很简单,就是将 PKCS8 转成 PKCS1
PKCS8 转 PKCS1
使用下面这个函数解决问题
from Crypto.PublicKey import RSA
def pkcs8_to_pkcs1(self, pkcs8_key:str) -> str:
"""
将 pkcs8 的密钥转换为 pkcs1
"""
if not pkcs8_key.startswith("-----BEGIN RSA PRIVATE KEY-----"):
pkcs8_key = f'-----BEGIN RSA PRIVATE KEY-----\n{pkcs8_key}\n-----END RSA PRIVATE KEY-----'
return RSA.importKey(pkcs8_key).exportKey().decode()
问题 INVALID_SIGN: Alipay Sign Verify FAILED
这个问题就是签名错误,显然易见。出现这个问题的原因是把 公钥 和 支付宝公钥 混淆了(文档里也没有提到!!!)