不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • python基础

  • python模块

  • django

  • flask

  • SYL

    • day01

    • day02

    • day03

    • day04

    • day05

    • day06

    • day07

    • day08

      • 00.作业
      • 01.商品模块表结构分析
      • 02.创建商品APP
      • 03.通过课程查询商品信息
      • 04.支付宝支付原理
      • 05.创建订单并生成支付链接接口
        • 06.订单支付回调接口
      • day09

      • day10

      • day11

      • day12

    • Celery

    • 微服务

    • python
    • SYL
    • day08
    xiaonaiqiang
    2021-03-10
    目录

    05.创建订单并生成支付链接接口

    # 1.创建订单并生成支付链接接口

    # 1.1 goods/urls.py中注册路由

    urlpatterns = [
        path('getpayurl/', views.PayUrlView.as_view()),  # /goods/getpayurl/
    ]
    
    1
    2
    3

    # 1.2 goods/views.py 中写视图函数

    from rest_framework.views import APIView
    from rest_framework.permissions import AllowAny, IsAuthenticated
    from rest_framework.response import Response
    from .models import Goods,Orders,GoodsCourse
    from goods.utils import get_order_id, get_pay_url, alipay
    
    
    from decimal import Decimal
    class PayUrlView(APIView):
        permission_classes = (IsAuthenticated,)
    
        def post(self, request):
            # 1. 获取课程id,获取购买途径(普通购买, 促销购买) 获取用户
            goods_id = request.data.get('goods_id')
            goods = Goods.objects.get(id=goods_id)
            user = request.user
            # 2. 下定单
            order_id = get_order_id()
            if user.vip.vip_type == '1':  # 普通会员
                goods_price = goods.price * Decimal('0.80').quantize(Decimal('0.00'))
            elif user.vip.vip_type == '2':  # 高级会员
                goods_price = goods.price * Decimal('0.60').quantize(Decimal('0.00'))
            else:  # 普通用户
                goods_price = goods.price
            goods_price = Decimal(goods_price).quantize(Decimal('0.00'))
            order = Orders(user=user, goods=goods, order_id=order_id, pay_method=1, status=1,
                           total_amount=goods_price)
            order.save()
            print(order.total_amount,type(order.total_amount))
            # 3. 根据订单 生成支付链接
            subject = "实验楼订单:%s, 价格:%s" % (order.order_id, order.total_amount)
            pay_url = get_pay_url(order.order_id, order.total_amount, subject)
    
            # 4. 返回链接
            return Response({"code": 0, "msg": "下单成功", "data": {"pay_url": pay_url}})
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

    # 1.3 goods/utils.py中生成随机订单函数和生成支付URL函数

    # -*- coding: utf-8 -*-
    import datetime
    import os
    import random
    
    from alipay import AliPay
    from syl import settings
    
    # 获取文件路径
    app_private_key_path = os.path.join(settings.BASE_DIR, "apps/goods/keys/app_private_key.pem")
    alipay_public_key_path = os.path.join(settings.BASE_DIR, "apps/goods/keys/alipay_public_key.pem")
    
    with open(app_private_key_path) as f:
        app_private_key_string = f.read()
    
    with open(alipay_public_key_path) as f:
        alipay_public_key_string = f.read()
    
    
    # 创建支付宝支付对象
    alipay = AliPay(
        appid=settings.ALIPAY_APPID,
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        alipay_public_key_string=alipay_public_key_string,
        # app_private_key_path=app_private_key_path,
        # alipay_public_key_path=alipay_public_key_path,
        sign_type="RSA2",
        debug=settings.ALIPAY_DEBUG
    )
    
    
    def get_pay_url(out_trade_no, total_amount, subject):
        # 生成登录支付宝连接
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=out_trade_no,
            total_amount=str(total_amount),
            subject=subject,
            return_url=settings.ALIPAY_RETURN_URL,
        )
    
        # 响应登录支付宝连接
        # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string
        # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string
        alipay_url = settings.ALIPAY_URL + "?" + order_string
        return alipay_url
    
    
    def get_order_id():
        """
        SYL202008241212121200005/24
        生成订单号: 格式: SYL + 年月日时分秒 + 5位随机数
        :return:
        """
        d = datetime.datetime.now()
        base = 'SYL'
        time_str = '%04d%02d%02d%02d%02d%02d' % (d.year, d.month, d.day, d.hour, d.minute, d.second)
        rand_num = str(random.randint(10000, 99999))
        return base + time_str + rand_num
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59

    # 1.4 syl/setings.py中配置支付相关参数

    # 支付宝配置
    ALIPAY_APPID = '2016101800716047'   # 沙箱环境中alipay应用ID
    ALIPAY_DEBUG = True
    ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'             # alipay沙箱环境支付宝网管
    ALIPAY_RETURN_URL = 'http://127.0.0.1:8888/payment/callback/'       # 支付完成后支付宝回调我们应用的地址
    
    1
    2
    3
    4
    5

    # 2.测试

    • 请求地址
    http://192.168.56.100:8888/goods/getpayurl/
    
    1
    • 携带参数
    {
        "goods_id":1
    }
    
    1
    2
    3
    • 返回数据
    {
        "code":0,
        "msg":"下单成功",
        "data":{
            "pay_url":"https://openapi.alipaydev.com/gateway.do?app_id=2016101800716047&biz_content=%7B%22subject%22%3A%22%5Cu5b9e%5Cu9a8c%5Cu697c%5Cu8ba2%5Cu5355%3ASYL2020101216322149584%2C+%5Cu4ef7%5Cu683c%3A99.00%22%2C%22out_trade_no%22%3A%22SYL2020101216322149584%22%2C%22total_amount%22%3A%2299.00%22%2C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=utf-8&method=alipay.trade.page.pay&return_url=http%3A%2F%2F127.0.0.1%3A8888%2Fpayment%2Fcallback%2F&sign_type=RSA2×tamp=2020-10-12+16%3A32%3A21&version=1.0&sign=qIM7yrjYgvqOn2DCYK4rBgtwqDnZ%2BTwf89axXQPMzk67FOOHH18YtnoROi4ml5i5w%2Fd%2FtD2RsYyxU5Jeatxw9Skz%2B9HQCAYfmQriYDo5fz2hOrC6Ydx92z5%2BB5o%2BUIh29EAE8JS5MhUOOO8T3r9NtzmQTOs0kSWpnaXjX4S7l9Z83li76MG83H18jBodpWofgzcTTDdPsBnaHmeeJjGg9LKgSDS37ZKP9GE79asVn8S9w49qVmTPzZGdKIZxyLf2K44EllnGxhlDLFRlGLYJOlE%2Bxo1hr3IKH40WoYh3fkmv2%2FEDnl0OtNXHt5HRUH4uZ2k38BNf1ebrODRqWRg1eQ%3D%3D"
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    • 支付宝回调接口
    http://127.0.0.1:8888/payment/callback/?
    charset=utf-8&
    out_trade_no=SYL2020101506280949732&
    method=alipay.trade.page.pay.return&
    total_amount=44.00&
    sign=bzLju9A5Ax4jjWTKrmCs1Z4J%2BWhbayaYDAdWONWbKFeWmyRWk%2Fxd3QwsfaHqnwPEo8mtCR4n3OCGHI410aD10LdwAZ%2FRmWfh3t4ATL7UOiTqrMH0x0gOpAGll2HSN4Nq2sVdiPbiK1RAaY%2B83F5%2FgTUNa7i20cJ8kXcXhQRDE5t5f4WNBtscgF661mvjQjgCw4pqK3MiivAnOGCeJ4PKO0qHDOPfXLrZEfvtHqLexTEsgSko%2Bb9W%2BQukvcmaxp%2BOnB%2F6XbDL7aH0swVtUQvvF%2F6jOMXr23AHg6QnzAYbZhJhvaLBP6BFjVwK%2B1xgNYOEvQa0Ukxwp%2FWLXwSPsamK%2Bg%3D%3D&
    trade_no=2020101522001428980501059961&
    auth_app_id=2016101800716047&
    version=1.0&
    app_id=2016101800716047&
    sign_type=RSA2&
    seller_id=2088102180143385&
    timestamp=2020-10-15%2014%3A28%3A49
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    上次更新: 2024/3/13 15:35:10
    04.支付宝支付原理
    06.订单支付回调接口

    ← 04.支付宝支付原理 06.订单支付回调接口→

    最近更新
    01
    05.快递Agent智能体
    06-04
    02
    200.AI Agent核心概念
    06-04
    03
    105.Agent智能体梳理
    06-04
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式