創建訂單並生成支付鏈接接口


1.創建訂單並生成支付鏈接接口

1.1 goods/urls.py 中注冊路由

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

 

 

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.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)
1.4 syl/setings.py中配置支付相關參數
2.測試
請求地址
攜帶參數
返回數據
rand_num = str(random.randint(10000, 99999))
return base + time_str + rand_num

1.4syl/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/' # 支付完成后支
付寶回調我們應用的地址

2.測試

  • 請求地址
http://192.168.56.100:8888/goods/getpayurl/
  • 攜帶參數
{
"goods_id":1
}
  • 返回數據
{
"code":0,
"msg":"下單成功",
"data":{
"pay_url":"https://openapi.alipaydev.com/gateway.do?
app_id=2016101800716047&biz_content=%7B%22subject%22%3A%22%5Cu5b9e%5Cu9a8c%5Cu697
c%5Cu8ba2%5Cu5355%3ASYL2020101216322149584%2C+%5Cu4ef7%5Cu683c%3A99.00%22%2C%22ou
t_trade_no%22%3A%22SYL2020101216322149584%22%2C%22total_amount%22%3A%2299.00%22%2
C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=utf8&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%2BTwf89axXQPMzk67FO
OHH18YtnoROi4ml5i5w%2Fd%2FtD2RsYyxU5Jeatxw9Skz%2B9HQCAYfmQriYDo5fz2hOrC6Ydx92z5%2
BB5o%2BUIh29EAE8JS5MhUOOO8T3r9NtzmQTOs0kSWpnaXjX4S7l9Z83li76MG83H18jBodpWofgzcTTD
dPsBnaHmeeJjGg9LKgSDS37ZKP9GE79asVn8S9w49qVmTPzZGdKIZxyLf2K44EllnGxhlDLFRlGLYJOlE
%2Bxo1hr3IKH40WoYh3fkmv2%2FEDnl0OtNXHt5HRUH4uZ2k38BNf1ebrODRqWRg1eQ%3D%3D"
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM