自写网站,第一次接触支付,准备对接最容易的支付宝。网上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的密钥是可以匹配成功的。