支付宝开放平台 Python SDK 下的一些坑

2023-02-19
#python #支付宝开放平台

前言

最近因为业务原因,需要使用支付宝开放平台的一些 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'

alipay.aop.api.exception.Exception.RequestException
截图来自参考文章

问题原因说很简单也很简单,就是签名错误,但是私钥都是直接下载的,理论上不会错误。但是因为用的是 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

这个问题就是签名错误,显然易见。出现这个问题的原因是把 公钥 和 支付宝公钥 混淆了(文档里也没有提到!!!)

NVALID_SIGN: Alipay Sign Verify FAILED
截图来自参考文章

参考文章