博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue + Django 2.0.6 学习笔记 10.11 支付宝支付接口实现
阅读量:4126 次
发布时间:2019-05-25

本文共 4395 字,大约阅读时间需要 14 分钟。

在代码中说明吧

以下代码为商家对接支付宝的支付接口以及支付成功后跳转的页面

# encoding:utf-8__date__ = '2019-07-05 13:06'from datetime import datetime# 以下3个为加密的库,直接拿来用就好了from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256# base64编码解码库from base64 import b64encode, b64decodefrom base64 import decodebytes, encodebytes# WEB请求响应数据解析库from urllib.parse import quote_plusfrom urllib.parse import urlparse, parse_qsfrom urllib.request import urlopenimport jsonclass AliPay(object):    """    支付宝支付接口    """    def __init__(self, appid, app_notify_url, app_private_key_path,                 alipay_public_key_path, return_url, debug=False):"""    接收公共参数数据。"""        self.appid = appid        self.app_notify_url = app_notify_url        self.app_private_key_path = app_private_key_path        self.app_private_key = None        self.return_url = return_url    # 从私钥文件中获取私钥        with open(self.app_private_key_path) as fp:            self.app_private_key = RSA.importKey(fp.read())    # 公钥一般没什么用。我们这里是要做支付宝是否支付成功时做比对的        self.alipay_public_path = alipay_public_key_path        with open(self.alipay_public_path) as fp:            self.alipay_public = RSA.import_key(fp.read())    # 测试环境与开发环境的请求地址切换        if debug is True:            self.__gateway = "https://openapi.alipaydev.com/gateway.do"        else:            self.__gateway = "https://openapi.alipay.com/gateway.do"# 商户自己的请求参数    def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):        biz_content = {    # 订单标题            'subject': subject,            'out_trade_no': out_trade_no,            'total_amount': total_amount,    # 固定内容            'product_code': "FAST_INSTANT_TRADE_PAY",        }    # 其他选填内容添加值biz_content中        biz_content.update(kwargs)    # 生成公共请求参数        data = self.build_body("alipay.trade.page.pay", biz_content, return_url)    #签名        return self.sign_data(data)#公共请求参数 生成消息格式    def build_body(self, method, biz_content, return_url=None):        data = {            "app_id": self.appid,            "method": method,            "charset": "utf-8",            "sign_type": "RSA2",            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),            "version": "1.0",            "biz_content": biz_content        }        if return_url is not None:            data["notify_url"] = self.app_notify_url            data["return_url"] = self.return_url        return data# 生成相应格式的字符串    def sign_data(self, data):    #预先清除data中的sign字段        data.pop('sign', None)    #排序        unsigned_items = self.ordered_data(data)    #将格式数据格式统一切换成通过‘&’连接        unsigned_string = '&'.join("{0}={1}".format(k, v) for k, v in unsigned_items)    #对biz_content进行签名        sign = self.sign(unsigned_string.encode('utf-8'))        # quote_plus 对url字符串的预处理 跟上面那种没啥太大区别。 一般最后生成字符串要发情请求的时候再做预处理        quoted_string = '&'.join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)        # 将签名加入到参数中        signed_string = quoted_string + "&sign=" + quote_plus(sign)        return signed_string#排序    def ordered_data(self, data):    # 通过过滤list元素类型是否是dict。来进行迭代        complex_keys = []        for key, value in data.items():            if isinstance(value, dict):                complex_keys.append(key)    #将字典转换为json separators 是将,号和:号作为分隔符        for key in complex_keys:            data[key] = json.dumps(data[key], separators=(',', ':'))        return sorted([(k, v) for k, v in data.items()])#签名(加密+编码)    def sign(self, unsigned_string):        key = self.app_private_key        signer = PKCS1_v1_5.new(key)        signature = signer.sign(SHA256.new(unsigned_string))        sign_ = encodebytes(signature).decode("utf-8").replace("\n", "")        return sign_if __name__ == "__main__":# 测试(随便写的URL)    return_url = "http://47.92.87.172:8000/?total_amount=0.01    alipay = AliPay(        appid="2016156453446", #沙箱id        # 用来用户在订单支付页面关闭后通过其他途径跳转到该订单并进行支付后,支付宝将数据传递给系统应用的接口        app_notify_url= "http://projectsedus.com/",        app_private_key_path= "../trade/keys/private_2048.txt",        alipay_public_key_path="../trade/keys/alipay_key_2048.txt",        debug=True    )    url = alipay.direct_pay(        subject="测试订单",        out_trade_no="201901010103",        total_amount=0.01,# 用来给指出完成后的返回界面        return_url=return_url    )#拼接成完整的支付页面url    re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(data=url)    print(re_url)

效果

转载地址:http://hsepi.baihongyu.com/

你可能感兴趣的文章
Pascal's Triangle II 生成杨辉三角中的某行
查看>>
Minimum Depth of Binary Tree -- 二叉树的最小深度 DFS 加剪枝
查看>>
Climbing Stairs 爬楼梯方法 动态规划
查看>>
Merge Two Sorted Lists 合并两个有序链表
查看>>
pow(x,n) 为什么错这么多次
查看>>
Jump Game 动态规划
查看>>
Subsets 深搜
查看>>
Subsets II
查看>>
Edit Distance 字符串距离(重重)
查看>>
Gray Code 格雷码
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>
web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
查看>>
web.py 0.3 新手指南 - 多数据库使用
查看>>
一步步开发 Spring MVC 应用
查看>>
python: extend (扩展) 与 append (追加) 的差别
查看>>
「译」在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?...
查看>>
浅谈JavaScript的语言特性
查看>>
LeetCode第39题思悟——组合总和(combination-sum)
查看>>