fzlee/alipay

证书方式如何安装

beimusky opened this issue · 30 comments

证书方式的,没有key.pem,只有crt。申请完一共有6个文件
alipayCertPublicKey_RSA2.crt
alipayRootCert.crt
appCertPublicKey_XXXXXXXX.crt
CSR文件.csr
应用公钥RSA2048.txt
应用私钥RSA2048-敏感数据,请妥善保管.txt

对于新手,怎么用,哪个文件,太难了,能否在安装说明里指定下文件

fzlee commented

csr是证书申请文件。
alipayCertPublicKey_RSA2.crt
alipayRootCert.crt
应该是支付宝的公钥。 我猜你要用到的是alipayCertPublicKey_RSA2.crt

应用公钥RSA2048.txt
应用私钥RSA2048-敏感数据,请妥善保管.txt
这是你自己的公钥私钥

app_private_key_string = open("/path/to/your/private/key.pem").read()
alipay_public_key_string = open("/path/to/alipay/public/key.pem").read()

app_private_key_string == """
-----BEGIN RSA PRIVATE KEY-----
base64 encoded content
-----END RSA PRIVATE KEY-----
"""

alipay_public_key_string == """
-----BEGIN PUBLIC KEY-----
base64 encoded content
-----END PUBLIC KEY-----
"""

所以,像这些,根本没有对应的文件,能否出个教程,要怎么配置?

fzlee commented

随着时间的推移, 似乎支付宝给大家提供公钥私钥的方式一直在变, 但是只要了解了公钥私钥的原理, 那么接入应该还算比较方便的

app_private_key_string = open("/path/to/your/private/key.pem").read()
alipay_public_key_string = open("/path/to/alipay/public/key.pem").read()

app_private_key_string == """
-----BEGIN RSA PRIVATE KEY-----
base64 encoded content
-----END RSA PRIVATE KEY-----
"""

alipay_public_key_string == """
-----BEGIN PUBLIC KEY-----
base64 encoded content
-----END PUBLIC KEY-----
"""

那这个初始化要怎么改?

fzlee commented

读入证书文件即可

我上面提供了6个文件,不知道读取哪个

fzlee commented

app开头的指的是你自己的公钥或私钥
,alipay开头的指的是支付宝的

app_public_key_cert_string=app_public_key_cert_string,

NameError: name 'app_public_key_cert_string' is not defined

提示这个错误,app_public_key_cert_string在哪里配置的?

fzlee commented

string是从本地文件读取的。或者测试目的写死在代码里

from alipay import AliPay
from alipay.utils import AliPayConfig

app_private_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\alipayRootCert.crt").read()
alipay_public_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\appCertPublicKey_2021003183690727.crt").read()
alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调 url
app_private_key_string=app_private_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA", # RSA 或者 RSA2
debug=False, # 默认 False
verbose=False, # 输出调试数据
config=AliPayConfig(timeout=15) # 可选,请求超时时间
)

以上是代码,我现在一共拿到支付宝提供的6个文件
alipayCertPublicKey_RSA2.crt
alipayRootCert.crt
appCertPublicKey_XXXXXXXX.crt
CSR文件.csr
应用公钥RSA2048.txt
应用私钥RSA2048-敏感数据,请妥善保管.txt

都试了不行,请问
app_private_key_string
alipay_public_key_string
分别要怎么配置?

提示错误
Traceback (most recent call last):
File "D:\code\hgcm_sso\pay_alipay\alipay_core1.py", line 6, in
alipay = AliPay(
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 93, in init
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 98, in _load_key
File "D:\Program Files\python3810\lib\site-packages\Cryptodome\PublicKey\RSA.py", line 804, in import_key
return _import_keyDER(der, passphrase)
File "D:\Program Files\python3810\lib\site-packages\Cryptodome\PublicKey\RSA.py", line 719, in _import_keyDER
raise ValueError("RSA key format is not supported")
ValueError: RSA key format is not supported

fzlee commented

alipay_public_key_string这个是支付宝的公钥
app_private_key_string 这个是你的私钥

fzlee commented

我觉得应该分别是alipayCertPublicKey_RSA2.crt
应用私钥RSA2048-敏感数据,请妥善保管.txt

app_private_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\appkey.txt").read()
alipay_public_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\alipayCertPublicKey_RSA2.crt").read()

Traceback (most recent call last):
File "D:\code\hgcm_sso\pay_alipay\alipay_core1.py", line 6, in
alipay = AliPay(
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 93, in init
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 98, in _load_key
File "D:\Program Files\python3810\lib\site-packages\Cryptodome\PublicKey\RSA.py", line 822, in import_key
raise ValueError("RSA key format is not supported")
ValueError: RSA key format is not supported

fzlee commented

https://github.com/fzlee/alipay/tree/master/tests/certs

这里有示例的证书文件。你先用这个初始化一下库。再比对自己的证书内容

刚咨询了官方,给的解释是官方SDK Python只有RSA2密钥加签方式,证书加签需要解析支付宝证书后去加签,具体可以参考https://blog.csdn.net/weixin_42656632/article/details/108584919
官方说证书的官方SDK都没有签名,不知道[fzleealipay是不是解决了。如果没解决,我就放弃了

fzlee commented

sign_type 传rsa2试试

app_private_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\appkey.txt").read()
alipay_public_key_string = open(r"D:\code\hgcm_sso\pay_alipay\key\web_app\alipayCertPublicKey_RSA2.crt").read()
alipay = AliPay(
appid="",
app_notify_url=None, # 默认回调 url
app_private_key_string=app_private_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA2", # RSA 或者 RSA2
debug=False, # 默认 False
verbose=False, # 输出调试数据
config=AliPayConfig(timeout=15) # 可选,请求超时时间

File "D:\code\hgcm_sso\pay_alipay\alipay_core1.py", line 6, in
alipay = AliPay(
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 93, in init
File "D:\Program Files\python3810\lib\site-packages\python_alipay_sdk-3.2.0-py3.8.egg\alipay_init_.py", line 98, in _load_key
File "D:\Program Files\python3810\lib\site-packages\Cryptodome\PublicKey\RSA.py", line 822, in import_key
raise ValueError("RSA key format is not supported")
ValueError: RSA key format is not supported

我可否发东西发您邮箱,您来测试一下。是一个纯新账号,里面没数据,也没有上线。这样测试沟通成本在太高了。

fzlee commented

你可以注册一个支付宝沙箱,在里面测试

这没啥区别啊,我这个是注册的就是新号,里面没任何数据

https://blog.csdn.net/weixin_42656632/article/details/108584919
在网站使用支付宝python sdk接入支付后成功后,需要实现用户提现功能,在支付宝沙箱环境下使用sdk顺利实现提现,结果转成正式环境后报错,咨询支付宝客服后告知python sdk不支持提现,原因是提现接口需要证书签名,当时就傻眼了,感觉被支付宝沙箱玩弄了

fzlee commented

https://github.com/fzlee/alipay/tree/master/tests
你看看这个目录下面的代码

fzlee commented

这下面 的测试代码是可以运行的,你这边的问题一般是公钥或者私钥格式有问题

看了。。不知道怎么用。所以支付宝提供那一堆key您看下怎么配置吧,用完我重置下秘钥就行了。没数据

fzlee commented

你可以尝试了解一下证书的格式,不然就算今天解决了这个问题,以后也会在同样的问题上摔一跤

fzlee commented

打开证书看看格式不对不对。此外可以学一下openssl 命令行,看看怎么查看证书里面的内容

"hi"hi@ifconfiger.com;
我发到这个邮箱了,我主要是确定下alipay包是否支持证书签名模式,谢谢啦

fzlee commented
  1. 请重新生成一下证书密钥, 因为已经发给我了, 不安全
  2. 根据你发的文件, 你的密钥格式是不对的, 不能被这个库读取

你可以看看这里的文档: , 需要有东西包围着支付宝给你的base64 的内容。 https://github.com/fzlee/alipay/blob/master/docs/preparation.md