本文实例为大家分享了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
当前名称:python实现银联支付和支付宝支付接入-创新互联
当前路径:https://www.cdcxhl.com/article2/epeoc.html
成都网站建设公司_创新互联,为您提供网站排名、小程序开发、云服务器、域名注册、虚拟主机、网站设计
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联