本文实例为大家分享了python银联支付和支付宝支付接入的具体代码,供大家参考,具体内容如下

前置条件:需要安装Python的OpenSSL模块,我使用的版本是16.1.0,可以使用pip install pyopenssl来安装

一、支付宝支付

1. 使用RSA公钥加密系统进行签名和签名验证,需要自己生成一个RSA私钥和对应的一个RSA公钥(在Linux下可以使用ssh-keygen命令来生成),公钥需要上传至支付宝,供支付宝对开发者发送的请求做签名验证使用;而同时支付宝会提供一个RSA公钥给开发者,开发者使用这个公钥来验证支付宝的回调请求的合法性。

2. 整个接入过程最核心的工作就是构建一个合法的请求报文,这个可以参考支付宝的相关文档;其次是对请求报文的内容进行RSA签名,并将签名随请求报文一并发送。

核心的签名和报文构建代码如下:

import OpenSSL

import json

import time

import urllib

import base64

from django.conf import settings

def build_sign(param_map, sign_type="RSA"):

'''

Doc: https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105351&docType=1

'''

# 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

sort_param = sorted([(key, unicode(value, settings.ALIPAY_CHARSET).encode(settings.ALIPAY_CHARSET)) for key, value in param_map.iteritems()], key=lambda x: x[0])

# 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。SDK中已封装签名方法,开发者可直接调用,详见SDK说明。

# 如自己开发,则需将待签名字符串和私钥放入SHA1 RSA算法中得出签名(sign)的值。

content = '&'.join(['='.join(x) for x in sort_param])

return base64.encodestring(OpenSSL.crypto.sign(settings.ALIPAY_APP_PRIVATE_KEY_OBJ, content, 'sha1'))

def build_params(out_trade_no, subject, body, total_amount):

'''

Doc:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.MVkRGo&treeId=193&articleId=105465&docType=1

将参数按照支付宝规定组织并签名之后,返回

'''

params = {}

# 获取配置文件

params['app_id'] = settings.ALIPAY_APPID

params['method'] = settings.ALIPAY_METHOD

params['format'] = settings.ALIPAY_FORMAT

params['charset'] = settings.ALIPAY_CHARSET

params['sign_type'] = settings.ALIPAY_SIGN_TYPE

params['sign_type'] = settings.ALIPAY_SIGN_TYPE

params['timestamp'] = time.strftime('%Y-%m-%d %H:%M:%S')

params['version'] = settings.ALIPAY_VERSION

params['notify_url'] = settings.ALIPAY_NOTIFY_URL

# 业务参数

params['biz_content'] = {}

params['biz_content']['body'] = body # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里

params['biz_content']['subject'] = subject # 商品的标题/交易标题/订单标题/订单关键字等。

params['biz_content']['out_trade_no'] = out_trade_no # 商户网站唯一订单号

params['biz_content']['total_amount'] = '%.2f' % (float(total_amount) / 100) # 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]

params['biz_content']['product_code'] = settings.ALIPAY_APP_PRODUCT_CODE

params['biz_content'] = json.dumps(params['biz_content'], separators=(',', ':'))

params['sign'] = build_sign(params)

return urllib.urlencode(params)

def check_sign(message, sign):

'''Doc: https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.dDRpeK&treeId=204&articleId=105301&docType=1'''

try:

OpenSSL.crypto.verify(settings.ALIPAY_PUBLIC_KEY_OBJ, sign, message, 'SHA1')

return True

except Exception as _:

return False

在读取支付宝公钥的时候,由于OpenSSL模块使用的是X509格式的证书,所以需要做以下的处理(用于对发起支付报文进行签名):

# 支付宝开发者公钥(支付宝生成)

ALIPAY_PUBLIC_KEY = os.path.join(BASE_DIR, 'utils/paycenter/alipay/certs/alipay_public_key')

_ALIPAY_PUBLIC_KEY_OBJ_PUB = OpenSSL.crypto.load_publickey(OpenSSL.crypto.FILETYPE_PEM, open(ALIPAY_PUBLIC_KEY).read())

_ALIPAY_PUBLIC_KEY_OBJ_X509 = OpenSSL.crypto.X509()

_ALIPAY_PUBLIC_KEY_OBJ_X509.set_pubkey(_ALIPAY_PUBLIC_KEY_OBJ_PUB)

ALIPAY_PUBLIC_KEY_OBJ = _ALIPAY_PUBLIC_KEY_OBJ_X509

载入开发者生成的私钥的代码为(用于验证支付宝回调请求的合法性):

# 支付宝开发者应用私钥(接入方生成)

ALIPAY_APP_PRIVATE_KEY = os.path.join(BASE_DIR, 'utils/paycenter/alipay/certs/alipay_app_private_key')

ALIPAY_APP_PRIVATE_KEY_OBJ = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open(ALIPAY_APP_PRIVATE_KEY).read(), None)

二、银联支付

1. 银联支付(网关支付)与支付宝支付基本上遵循了同样的流程,但是在发起支付的请求报文和签名、验证签名等方面存在细微的差别,特别是在签名和验证签名时,支付宝是直接对报文内容进行了RSA加密,但是银联却是首先对签名内容取SHA1的摘要,继而对此摘要做RSA加密,这点在build_sign函数中就可以很明显地看出来。

2. 银联支付的证书文件申请流程比较繁琐,并且其格式也和支付宝使用的不同,我们申请到的私钥证书文件是以PKCS12的格式保存的,并且需要注意在从指定位置下载此证书后,导出证书时一定要将密码设置为6位的整数数字,之后,还需要将PKCS12格式的证书文件上传至指定位置并启用才可以正常使用此证书。

核心的签名和报文构建代码如下:

import time

import hashlib

import urllib, urllib2

import base64

import OpenSSL

from django.conf import settings

def build_sign(param_map, sign_type="RSA"):

'''构建签名'''

# 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

sort_param = sorted([(key, unicode(value, settings.UNIONPAY_ENCODING).encode(settings.UNIONPAY_ENCODING)) for key, value in param_map.iteritems()], key=lambda x: x[0])

content = '&'.join(['='.join(x) for x in sort_param])

message = hashlib.sha1(content).hexdigest()

return base64.b64encode(OpenSSL.crypto.sign(settings.UNIONPAY_PRIVATE_KEY_OBJ, message, 'sha1'))

def build_params(out_trade_no, total_amount):

params = {}

# 获取配置信息

params['accType'] = settings.UNIONPAY_ACC_TYPE

params['accessType'] = settings.UNIONPAY_ACCESS_TYPE

params['backUrl'] = settings.UNIONPAY_BACK_URL

params['frontUrl'] = settings.UNIONPAY_FRONT_URL

params['bizType'] = settings.UNIONPAY_BIZ_TYPE

params['certId'] = settings.UNIONPAY_CERT_ID

params['channelType'] = settings.UNIONPAY_CHANNEL_TYPE

params['currencyCode'] = settings.UNIONPAY_CURRENCY_CODE

params['encoding'] = settings.UNIONPAY_ENCODING

params['merId'] = settings.UNIONPAY_MER_ID

params['signMethod'] = settings.UNIONPAY_SIGN_METHOD

params['txnType'] = settings.UNIONPAY_TXN_TYPE

params['txnSubType'] = settings.UNIONPAY_TXN_SUBTYPE

params['version'] = settings.UNIONPAY_VERSION

params['orderId'] = out_trade_no

params['txnAmt'] = '%d' % int(total_amount) # 单位为分

params['txnTime'] = time.strftime('%Y%m%d%H%M%S') #

params['signature'] = build_sign(params)

# return params

return urllib.urlencode(params)

def check_sign(message, sign):

try:

OpenSSL.crypto.verify(settings.UNIONPAY_PUBLIC_KEY_OBJ, sign, message, 'SHA1')

return True

except Exception as _:

return False

商户私钥证书的载入方法(用户对发起支付的报文进行签名):

# 商户私钥证书

UNIONPAY_APP_PRIVATE_KEY_CERT = os.path.join(UNIONPAY_CERTS_PATH, UNIONPAY_APP_PRIVATE_KEY_CERT_FILENAME) # PKCS12 format

UNIONPAY_PRIVATE_KEYSTORE = OpenSSL.crypto.load_pkcs12(open(UNIONPAY_APP_PRIVATE_KEY_CERT).read(), UNIONPAY_APP_PRIVATE_KEY_CERT_PASSWORD)

UNIONPAY_PRIVATE_KEY_OBJ = UNIONPAY_PRIVATE_KEYSTORE.get_privatekey()

银联公钥证书的载入方法(用于验证银联回调的合法性):

# 银联公钥证书

UNIONPAY_PUBLIC_KEY_CERT = os.path.join(UNIONPAY_CERTS_PATH, UNIONPAY_PUBLIC_KEY_CERT_FILENAME)

UNIONPAY_PUBLIC_KEY_OBJ = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(UNIONPAY_PUBLIC_KEY_CERT).read())

后记:银联支付接入过程中,参考过其官方提供的一个Python实现的接口,里面同时使用了python的rsa模块和OpenSSL模块,并且对证书的格式做了各种处理,但是这些似乎是没有什么必要,只使用OpenSSL模块就完全可以完成相关的工作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python 支付宝支付 无效根证书_python实现银联支付和支付宝支付接入相关推荐

  1. python 支付宝支付 无效根证书_Python-支付宝SDK的使用与注意事项,pythonalipaysdk,及,点...

    一. 在 点击跳转 这里拿到自己的 appid  和  支付宝公钥 , 如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 : 应用私钥和支付宝公钥 获取 和 配置 过程: 1. 下载后 ...

  2. 微信企业支付 服务器根证书,微信支付服务器证书根ca证书有什么用

    随着现如今网络的不断发展,我们的生活跟网络密不可分,现在到处充斥着手机消费,只要你手机上有微信.支付宝不管到哪里都可以买你想买的东西,钱包已经在家里闲置多时.手机支付给我们的生活带来便利的同时也会伴随 ...

  3. 微信企业支付 服务器根证书,微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法-蜘蛛网博客...

    微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法我们在通过微信第三方平台制作微信活动的时候,很多情况下都需要用到微信支付接口,例如商城类的微信功能,微砍价.微助力.微秒杀.微拼团 ...

  4. 微信企业支付 服务器根证书,微信支付证书获取与上传流程的说明_根证书rootca.pem...

    小伙伴们,有少许正在使用微信支付交易功能的用户向我们反馈,在某些功能里需要使用到微信支付证书,比如在拼团购.高级酒店.微信红包.高级H5游戏里涉及到金额退款. 有部分需要使用到微信支付证书上传的用户不 ...

  5. 支付宝转账-提取根证书失败 AlipayRootCert Is Invalid

    问题解决:缺少jar包 转账相关代码 /*** 支付宝单笔转账* @param payee_account 收款方账户(支付宝账户)* @param payee_name 收款方真实姓名* @para ...

  6. python牛顿迭代法求根例题_python求根算法

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! scipy官网:https:www.scipy.org这个库是python科学计 ...

  7. alipay 证书 java_支付宝转账-提取根证书失败 AlipayRootCert Is Invalid

    /** * 支付宝单笔转账 * @param payee_account 收款方账户(支付宝账户) * @param payee_name 收款方真实姓名 * @param amount 金额(单位: ...

  8. python目录名称无效怎么处理_python目录名无效错误怎么解决?

    python目录名无效错误的解决方法是:1.利用os.getcwd()获取当前文件路径path:2.检查传入的path是否为当前目录位置:3.若不是,将获取的path替换即可. 解决方案: 这个目录名 ...

  9. python目录名称无效怎么处理_Python目录和文件处理总结详解

    1.判断目录是否存在.判断文件是否存在.创建目录.重命名目录或文件 import os #获取当前目录路径: E:\Work\Projects\python print(os.getcwd()) #判 ...

最新文章

  1. Go基础编程:延迟调用defer
  2. C#: static关键字的作用
  3. Spring AOP中pointcut expression表达式解析
  4. Oracle监听器Server端与Client端配置实例
  5. 香帅的北大金融学课笔记2 -- 银行
  6. 实验四:用一维数组实现杨辉三角
  7. xstat博客主题php,WordPress博客主题:Diaspora 简约文艺范主题
  8. 文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算...
  9. 正高职称 程序员_我985毕业33岁正高,职称评审哪里难?轻轻松松过职称
  10. 【ENVI预处理】辐射校正、影像配准、图像融合、图像镶嵌 、图像裁剪、图像增强
  11. JavaScript 函数看代码写结果
  12. c语言知识点总结大全(史上最全)
  13. 可能是史上最全的权限系统设计
  14. [UPC] 2021秋组队17
  15. 红米K30升级鸿蒙系统,Redmi K30 Pro变焦版相机免费升级,DxOMark版本马上到
  16. 人工智能会取代艺术家?
  17. Method类的使用
  18. IDEA+Java控制台实现医院管理系统
  19. toLocalString与toString方法比较
  20. 5岁儿童自学python编程-少儿python编程启蒙培训班-小孩学习编程去哪里好

热门文章

  1. 基于Socket编程下 实现Linux-Linux、Linux-Windows tcp通信
  2. 程序员快乐手绘(1)
  3. 地面沉降数值模拟应用与案例分析
  4. linux如何安装卸载.bin文件
  5. 对5G的强烈讽刺,4G手机销量大幅反弹
  6. HTML textarea中的内容如何换行?
  7. Olympiad (奥林匹克信息赛) Visual Judge (Set3)
  8. 安卓(华为)安装Charles信任证书显示【暂不支持打开此类文件】解决方法
  9. COMSOL建模操作2:提示:CAD内核出现内部错误
  10. 【乐绘派】Audition专业音频后期制作教程 | 5-自定义工作区