一:瞭解對接支付寶支付沙箱環境過程:
二:準備工作:
1: 創建應用payment:
1:創建應用
python3 ../manage.py startapp payment
2:註冊應用dev.py:
INSTALLED_APPS = [
'apps.payment',
]
3:註冊總路由和子路由:
urlpatterns = [
path("", include('apps.payment.urls')),
]
urlpatterns = [
]
2:安裝alipay第三方包:
pip install python-alipay-sdk==1.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
3:配置RSA2公私密鑰:
3.1:在payment裏面創建keys文件夾專門存儲密鑰:
3.2:生成美多商城公私密鑰:
(django_env) python@ubuntu:~/Desktop/meimei_project/meiduo_mall/apps$ cd payment/keys
(django_env) python@ubuntu:~/Desktop/meimei_project/meiduo_mall/apps/payment/keys$ openssl
OpenSSL> genrsa -out app_private_key.pem 2048
Generating RSA private key, 2048 bit long modulus
........................................................................................................................................................+++
................................................+++
e is 65537 (0x10001)
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem
writing RSA key
OpenSSL> exit
3.3:密鑰交換:
3.4:增加配置信息:
# 對接支付寶
ALIPAY_APPID = '自己的ID' # 應用ID
ALIPAY_DEBUG = True # 調試模式,對接沙箱應用時為True,對接正式應用時為False
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' # 對接支付寶的網關,如果對接沙箱應用就是測試網關
ALIPAY_RETURN_URL = "http://www.meiduo.site:8080/pay_success.html" # 支付成功後的回調地址
三:視圖實現:
1:編輯apps/payment/views.py實現視圖
# 支付接口1:掃碼支付頁面url獲取
import os
from alipay import AliPay
from django.conf import settings
from django.http import JsonResponse
from django.views import View
from apps.orders.models import OrderInfo
class PaymentView(View):
def get(self, request, order_id):
# 1、提取參數
# 2、校驗參數
# 3、業務處理 —— 調用支付寶sdk獲取掃碼支付url
# (1)、構建alipay支付對象
alipay = AliPay(
settings.ALIPAY_APPID, # 支付應用id
app_notify_url=None, # 支付成功之後,支付寶回調地址
app_private_key_path=os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'keys/app_private_key.pem'
),
alipay_public_key_path=os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'keys/alipay_public_key.pem'
),
sign_type='RSA2',
debug=settings.ALIPAY_DEBUG
)
try:
order = OrderInfo.objects.get(pk=order_id)
except OrderInfo.DoesNotExist as e:
print(e)
return JsonResponse({'code': 400, 'errmsg': '訂單不存在'})
# (2)、找對象裏面的方法獲取支付參數
# api_alipay_trade_page_pay:獲取網頁端支付頁面url參數
query_params = alipay.api_alipay_trade_page_pay(
subject='美多商城支付%s' % order_id,
out_trade_no=order_id,
total_amount=float(order.total_amount),
return_url=settings.ALIPAY_RETURN_URL, # 用户支付成功,請求美多的頁面
)
# 掃碼支付要麼鏈接是:'https://openapi.alipaydev.com/gateway.do?<支付參數>'
# (3)、拼接支付掃碼頁面url
alipay_url = settings.ALIPAY_URL + '?' + query_params
# 4、構建響應
return JsonResponse({'code': 0, 'errmsg': 'ok', 'alipay_url': alipay_url})
2:路由:
from django.urls import re_path
from . import views
urlpatterns = [
# 支付接口1:獲取掃碼支付頁面url
re_path(r'^payment/(?P<order_id>\d+)/$', views.PaymentView.as_view()),
]
3:編輯apps/payment/models.py新建模型類遷移建表
from django.db import models
from apps.orders.models import OrderInfo
from meiduo_mall.utils.models import BaseModel
class Payment(BaseModel):
"""支付信息"""
order = models.ForeignKey(OrderInfo, on_delete=models.CASCADE, verbose_name='訂單')
trade_id = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name="支付編號")
class Meta:
db_table = 'tb_payment'
4:遷移建表:
python3 manage.py makemigrations
python3 manage.py migrate
5:編輯apps/payment/views.py實現視圖
# 接口二:支付成功,訂單號綁定
class PaymentStatusView(View):
def get(self, request):
alipay = AliPay(
settings.ALIPAY_APPID, # 支付應用id
app_notify_url=None, # 支付成功之後,支付寶回調地址
app_private_key_path=os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'keys/app_private_key.pem'
),
alipay_public_key_path=os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'keys/alipay_public_key.pem'
),
sign_type='RSA2',
debug=settings.ALIPAY_DEBUG
)
# 1、校驗支付寶參數
data = request.GET # Django查詢字符串參數,類型是QueryDict
data = data.dict() # QueryDict 轉化成 dict
sign = data.get('sign') # 簽名 --> 使用該簽名參數校驗支付數據的有效性
if not alipay.verify(data, signature=sign):
# 校驗失敗,參數有誤
return JsonResponse({'code': 400, 'errmsg': '支付有誤'})
out_trade_no = data.get('out_trade_no') # 接口1中傳遞的order_id
trade_no = data.get('trade_no') # 支付寶訂單流水號
try:
Payment.objects.create(
order_id=out_trade_no, # 美多訂單號
trade_id=trade_no # 支付寶訂單流水號
)
except Exception as e:
print(e)
return JsonResponse({'code': 500, 'errmsg': '新建支付訂單失敗'})
order = OrderInfo.objects.get(pk=out_trade_no)
order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
order.save()
# 2、綁定美多商城訂單
return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_no})
6:配置路由:
from django.urls import re_path
from . import views
urlpatterns = [
# 支付接口2:綁定支付訂單
re_path(r'^payment/status/$', views.PaymentStatusView.as_view()),
]
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。