HTML超文字標記語言
阿新 • • 發佈:2020-11-12
1.syl/settings.py
中配置支付相關引數
# 支付寶配置
ALIPAY_APPID = '2016102600762786' # 沙箱環境中alipay應用ID
ALIPAY_DEBUG = True
# alipay沙箱環境支付寶閘道器
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'
# 支付完成後支付寶回撥我們應用的地址
ALIPAY_RETURN_URL = 'http://127.0.0.1:8888/payment/callback/'
2. 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
3. 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 from .utils import get_order_id, get_pay_url, alipay 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}})
4.goods/urls
中註冊路由
urlpatterns = [
path('getpayurl/', views.PayUrlView.as_view()), # /goods/getpayurl/
]
- 測試
- 請求地址
http://192.168.56.100:8888/goods/getpayurl/
- 攜帶引數
{
"goods_id":1
}
- 返回資料
{ "code":0, "msg":"下單成功", "data":{ "pay_url":"https://openapi.alipaydev.com/gateway.doapp_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=utf8&method=alipay.trade.page.pay&return_url=http%3A%2F%2F127.0.0.1%3A8888%2Fpayment%2Fcallback%2F&sign_type=RSA2×tamp=20201012+16%3A323A21&version=1.0&sign=qIM7yrjYgvqOn2DCYK4rBgtwqDnZ%2BTwf89axXQPMzk67FOOHH18YtnoROi4ml5i5w%2Fd%2FtD2RsYyxU5Jeatxw9Skz%2B9HQCAYfmQriYDo5fz2hOrC6Ydx92z5%2BB5o%2BUIh29EAE8JS5MhUOOO8T3r9NtzmQTOs0kSWpnaXjX4S7l9Z83li76MG83H18jBodpWofgzcTTDdPsBnaHmeeJjGg9LKgSDS37ZKP9GE79asVn8S9w49qVmTPzZGdKIZxyLf2K44EllnGxhlDLFRlGLYJOlE%2Bxo1hr3IKH40WoYh3fkmv2%2FEDnl0OtNXHt5HRUH4uZ2k38BNf1ebrODRqWRg1eQ%3D%3D" } }