python接入支付宝现金红包(公钥证书模式)

在使用python接入支付宝现金红包时,遇到了很多坑。不同于Java、php等语言,支付宝未提供python现金红包相关SDK,所以要自行实现签名。

首先,要设置应用接口加签方式为公钥证书模式。
参照文档:https://docs.open.alipay.com/291/105971

然后就是自行验签的难点了,下面是支付宝给的文档:
https://docs.open.alipay.com/291/106118

image.png

关键在于获取app_cert_sn和alipay_root_cert_sn的值,其它值根据实际调用的接口传就行了。


image.png

由文档可以知道,app_cert_sn和alipay_root_cert_sn的值是固定的,所以这里有一个简单的获取方法:
因为Java提供了获取这两个参数的SDK,所以我们可以通过java去解析出来这两个值,拿过来用就行。

那么,为什么用python提取就麻烦了呢?文档不是写的很清楚吗?
从文档表面看我们只需解析出机构名name和序列号serialNumber,所有问题就迎刃而解了。事实也是这样。
但是问题在于这两个参数多数人会解析错误。这就是用python自行验签最大的坑。
网上可以搜索到X.509证书解析方法:
参考:https://www.cnblogs.com/qq874455953/p/10264428.html

import OpenSSL


cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open("test.cer").read())
certIssue = cert.get_issuer()

print ("证书序列号:", str(cert.get_serial_number()))
print ("颁发者:", certIssue.commonName)

print("主体信息:")
print("CN : 通用名称  OU : 机构单元名称")
print("O  : 机构名    L  : 地理位置")
print("S  : 州/省名   C  : 国名")

for item in certIssue.get_components():
    print(item[0].decode("utf-8"), "  ——  ",item[1].decode("utf-8"))

print(cert.get_extension_count())

解析出来心花怒放,心想机构名不就是这个O表示的值吗,序列号为cert.get_serial_number()。尝试以后并不对,然后拿颁发者certIssue.commonName的值去试。还是不对。(序列号的获取没有问题)

原来:机构名称是主体信息的集合!

了解后知道,name是主体信息按一定的格式拼接的:
CN=CN值,OU=OU值,O=O值

organization_name = ','.join([i[0].decode('utf-8') + '=' + i[1].decode('utf-8')
                                   for i in cert_issue.get_components()])

结果为:
C=CN,O=Ant Financial,OU=Certification Authority,CN=Ant Financial
看似没问题了,但是仍然不行。原来:组织名是有顺序的,调整为:
CN=Ant Financial,OU=Certification Authority,O=Ant Financial,C=CN
然后再MD5加密:

sn_string = 'CN=' + certIssue.CN + ',' + 'O=' + certIssue.O + ',' + 'C=' + certIssue.C + str(root_cert.get_serial_number())
alipay_root_cert_sn = hashlib.md5(sn_string.encode('utf-8')).hexdigest()
这样总该没问题了吧?

然而,了解后知道,支付宝根证书里有多套证书,要解析出来拼接成下面的形式:

alipay_root_cert_sn  = alipay_root_cert_sn1 + '_' + alipay_root_cert_sn2

这样一个完整的python自签名就完成了,支付,现金红包都可以使用了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 6- 章的翻译见:https://www.jianshu.com/p/835c2db4a1c4 说明 该文档根据官...
    耳边的火阅读 9,951评论 2 15
  • 愿你一切平安,事事顺遂 愿你容颜常驻,笑口常开 愿你历经苦难仍是我记忆里那个温柔明媚的人 愿你世事沧桑不改当初伸出...
    温凉色阅读 331评论 2 1
  • 最近社工考试告了一段落,霎那间觉得有点懈怠,最近复习也确实比较耗元气,也感觉自己的灵魂走的太快了,自己身体有点跟不...
    张国意阅读 186评论 0 0
  • 小学二年级的时候,老师问大家,长大以后想当什么?小女孩举手回答:长大以后要当作家。老师笑着摸摸她的头,鼓励说:“真...
    静思_362e阅读 293评论 0 1
  • “他回来了吗?”躺在病床上的妻子悄悄问。 “回来了。”丈夫悄悄地回答她。 “还来得及吗?”妻子又问。 “来得及的。...
    马小熊sl阅读 1,417评论 0 5

友情链接更多精彩内容