• 支付宝app支付和h5支付 python代码实现


    支付宝app支付和h5支付

    使用模块 pip install python-alipay-sdk==1.10.1
    
    from alipay import AliPay
    
    def ali():
        ali_pay = AliPay(
            appid=settings.ALI_APP_ID,
            app_notify_url=settings.ALI_NOTIFY_URL,  # 默认回调url
            app_private_key_string=settings.APP_PRIVATE_KEY_STRING,
            alipay_public_key_string=settings.ALI_PAY_PUBLIC_KEY_STRING,
            sign_type="RSA2",
            debug=False,
        )
        return ali_pay
    
    
    class AliPayViewSet(viewsets.ViewSet):
        permission_classes = (IsAuthenticated,)
    	
        #app支付超简单,返回order_string给前端就ok了
        @list_route(methods=["POST"])
        def app_pay(self, request, *args, **kwargs):
            try:
                order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
                                       random.randint(1, 99))
                ali_pay = ali()
                order_string = ali_pay.api_alipay_trade_app_pay(
                    out_trade_no=order_sn,
                    total_amount=0.01,
                    subject="测试", # 商品说明
                )
                return Response({"status": 1, "data": {"orderstring": order_string}})
            except Exception as e:
                return Response({"status": 0, "errormsg": e})
    
            
        #h5支付,官方文档https://docs.open.alipay.com/203/105285
        #需要转成form表单
        #如上图所示,用户在商户的H5网站下单支付后,商户系统按照手机网站支付接口alipay.trade.wap.payAPI的参数规范生成订单数据,然后在前端页面通过Form表单的形式请求到支付宝。
        @list_route(methods=["POST"])
        def h5_pay(self, request, *args, **kwargs):
            try:
                order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
                                       random.randint(1, 99))
                ali_pay = ali()
                order_string = ali_pay.api_alipay_trade_wap_pay(
                    out_trade_no=order_sn,
                    total_amount=0.01,
                    subject="测试",  # 商品说明
                    body="123",
                    timeout_express="90m",
                    product_code="QUICK_WAP_WAY",
                )
                pay_url = "https://openapi.alipay.com/gateway.do?{}".format(order_string)
                params = dict()
                str_list = order_string.split("&")
                for s in str_list:
                    k, v = s.split("=")
                    params[k] = v
                form = build_form(pay_url, params)
                return Response({"status": 1, "data": {"form": form}})
            except Exception as e:
                return Response({"status": 0, "errormsg": e})
    
    	#转换form表单的方法
       def build_form(url, params):
        form = "<form name="punchout_form" method="post" action=""
        form += url
        form += "">
    "
        if params:
            for k, v in params.items():
                if not v:
                    continue
                form += "<input type="hidden" name=""
                form += k
                form += "" value=""
                form += v.replace(""", "&quot;")
                form += "">
    "
        form += "<input type="submit" value="立即支付" style="display:none" >
    "
        form += "</form>
    "
        form += "<script>document.forms[0].submit();</script>"
        return form
    

    前端代码

        $('.js-order-pay').click(function () {
            var _msg = $(this).attr('data-message')
            var auth = 'JWT ' + localStorage.getItem('token')
            if (_msg == '1') {
                console.log(1111111111)
                //支付宝
                var formData = {
                    total_fee: 0.01,
                }
                $.ajax({
                    type: "POST",
                    url: '/api/pay/ali_pay/h5_pay/',
                    data: JSON.stringify(formData),
                    dataType: "json",
                    contentType: "application/json",
                    processData: false,
                    headers: {"X-CSRFToken": getCookie("csrftoken")},
                    beforeSend: function (xhr) {
                        xhr.setRequestHeader("Authorization", auth);
                    },
                    success: function (data) {
                        if (data.status == 1) {
                            var div = document.createElement('div');
                            div.innerHTML = data.data.form
                            document.body.appendChild(div);
                            var subForm = document.getElementsByTagName("form")[0];
                            subForm.submit();
                        } else {
                            alert(data.errormsg)
                        }
                    },
                })
    
  • 相关阅读:
    Mysql数据库的使用总结之ERROR 1146 (42S02)
    正在连接 cn.archive.ubuntu.com (91.189.91.39)] [正在连接 security.ubuntu.co.....问题的解决
    如何设定用F12进入bios
    thinkphp volist用法
    array_flip() 函数,一维数组,键名和键值交换..
    shell 备份数据库
    shell 备份数据库,并移动到备份数据库
    shell脚本实现取当前时间
    获取某日是否是工作日
    showModalDialog is not defined 的解决方案
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/12050760.html
Copyright © 2020-2023  润新知