zoukankan      html  css  js  c++  java
  • Django实现支付宝支付

    Python支付宝支付(沙箱)

    1.安装python-alipay-sdk

    # cmd中输入
    pip install python-alipay-sdk
    

    2.生成并使用密钥

    进入支付宝开放平台-->登陆-->导航栏开发中心-->研发服务-->沙箱应用-->应用公钥(根据提示下载支付宝提供的windows版本的密钥生成工具)-->将生成的应用公钥复制到应用公钥

    3.新建Django项目

    新建Django项目,然后将刚才生成的应用私钥和支付宝公钥放到项目根目录下新建的keys文件中。

    第一个是你应用的私钥,第二个是支付宝公钥(就在沙箱应用应用公钥的旁边,我忘记改名字了0 0)。由于我当时把这个存成应用公钥,所有在最后的支付页面后端会报错:alipay.exceptions.AliPayValidationError(无法验证 0 0)。存储的时候需要在密钥的头尾加上-----BEGIN PUBLIC KEY-----:

    # app_private_2048.txt
    
    -----BEGIN PUBLIC KEY-----
    应用私钥
    -----BEGIN PUBLIC KEY-----
    
    # app_public_2048
    -----BEGIN PUBLIC KEY-----
    支付宝公钥
    -----BEGIN PUBLIC KEY-----
    

    然后配置settings,在末尾加上下面内容:

    # settings.py
    
    # 支付宝参数配置
    # 在支付宝开放平台的沙箱应用中获取APPID和支付宝网关
    ALIPAY_APPID = '这里是你的APPID'
    ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'  # 支付宝网关
    

    4、代码

    templates-->index.html:

    # index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>支付</title>
        <script src="/static/jquery-3.3.1.js"></script>
        <script>
            $(function () {
                $('#btn').click(function () {
                    var order_id = "2016101400682827";
                    var req_data = {
                        order_id: order_id,
                        csrfmiddlewaretoken: "{{ csrf_token }}"
                    };
                    $.post("/pay/", req_data, function (data) {
                        window.open(data.url)
                    });
                    $.get("/check_pay/?order_id=" + order_id, function (data) {
                        if (0 == data.code) {
                            // 支付成功
                            alert("支付成功");
                            location.reload();
                        } else {
                            alert(data.message)
                        }
                    })
                })
            })
        </script>
    </head>
    <body>
    <input type="button" id="btn" value="支付">
    </body>
    </html>
    

    views.py:

    # views.py
    
    from django.shortcuts import render
    from django.http import JsonResponse
    from alipay import AliPay
    import os
    import time
    from django.conf import settings
    
    
    def index(request):
        return render(request, "index.html", locals())
    
    
    def pay(request):
        order_id = request.POST.get("order_id")
        # 创建用于进行支付宝支付的工具对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(settings.BASE_DIR, r"keysapp_private_2048.txt"),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, r"keysapp_public_2048.txt"),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False  配合沙箱模式使用
        )
    
        # 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=f'xx{time.time()}',  # 生成随时间变动而变动的唯一订单号
            total_amount=str(0.01),  # 将Decimal类型转换为字符串交给支付宝
            subject="测试订单",
            body="Python入门视频",
            return_url="https://example.com",
            notify_url="https://example.com/notify"  # 可选, 不填则使用默认notify url
        )
    
        # 让用户进行支付的支付宝页面网址
        url = settings.ALIPAY_URL + "?" + order_string
    
        return JsonResponse({"code": 0, "message": "请求支付成功", "url": url})
    
    
    def check_pay(request):
        # 创建用于进行支付宝支付的工具对象
        order_id = request.GET.get("order_id")
    
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(settings.BASE_DIR, r"keysapp_private_2048.txt"),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, r"keysapp_public_2048.txt"),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA2,官方推荐,配置公钥的时候能看到
            debug=True  # 默认False  配合沙箱模式使用
        )
    
        while True:
            # 调用alipay工具查询支付结果
            response = alipay.api_alipay_trade_query(order_id)  # response是一个字典
            # 判断支付结果
            code = response.get("code")  # 支付宝接口调用成功或者错误的标志
            trade_status = response.get("trade_status")  # 用户支付的情况
    
            if code == "10000" and trade_status == "TRADE_SUCCESS":
                # 表示用户支付成功
                # 返回前端json,通知支付成功
                return JsonResponse({"code": 0, "message": "支付成功"})
    
            elif code == "40004" or (code == "10000" and trade_status == "WAIT_BUYER_PAY"):
                # 表示支付宝接口调用暂时失败,(支付宝的支付订单还未生成) 后者 等待用户支付
                # 继续查询
                print(code)
                print(trade_status)
                continue
            else:
                # 支付失败
                # 返回支付失败的通知
                return JsonResponse({"code": 1, "message": "支付失败"})
    
    

    urls.py:

    # urls.py
    
    from django.conf.urls import url
    from django.contrib import admin
    from pay import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^$', views.index, name='index'),
        url(r"^pay/$", views.pay, name='pay'),
        url(r"^check_pay/$", views.check_pay, name='check_pay'),
    ]
    
    
  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/17vv/p/11468964.html
Copyright © 2011-2022 走看看