python編程快速上手(持續更新中…)
python實戰專案(Django技術點)
1. 創建應用和沙箱環境
沙箱應用:https://openhome.alipay.com/platform/appDaily.htm?tab=info
掃碼注冊


沙箱賬號:https://openhome.alipay.com/platform/appDaily.htm?tab=account
額度可以自行修改

2. 支付寶開發檔案
檔案主頁: https://openhome.alipay.com/developmentDocument.htm
電腦網站支付產品介紹: https://docs.open.alipay.com/270
電腦網站支付快速接入: https://docs.open.alipay.com/270/105899/
API串列: https://docs.open.alipay.com/270/105900/
SDK檔案: https://docs.open.alipay.com/270/106291/
Python支付寶SDK: https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
3. 電腦網站支付流程

4. 配置RSA2公私鑰
提示:
美多商城私鑰加密資料,美多商城公鑰解密資料,
支付寶私鑰加密資料,支付寶公鑰解密資料,

生成RSA2密鑰
1.Linux中生成公私鑰
$ openssl
$ OpenSSL> genrsa -out app_private_key.pem 2048 # 制作私鑰RSA2
$ OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 匯出公鑰
$ OpenSSL> exit
2.配置美多商城公私鑰
配置美多商城私鑰
a.新建子應用pay,在該子應用下新建檔案夾keys用于存盤公私鑰
將制作的美多商城私鑰app_private_key.pem拷貝到keys檔案夾中,

b.將payment.keys.app_public_key.pem檔案中內容上傳到支付寶,


3.配置支付寶公鑰
將支付寶公鑰內容拷貝到應用key檔案夾下:payment.keys.alipay_public_key.pem檔案中,
-----BEGIN PUBLIC KEY-----
支付寶公鑰內容
-----END PUBLIC KEY-----

5.訂單支付功能
提示:
訂單支付觸發頁面:《order_success.html》 和 《user_center_order.html》
我們實作訂單支付功能時,只需要向支付寶獲取登錄鏈接即可,進入到支付寶系統后就是用戶向支付寶進行支付的行為,
1.請求方式
| 選項 | 方案 |
|---|---|
| 請求方法 | GET |
| 請求地址 | /payment/(?P<order_id>\d+)/ |
2.請求引數:路徑引數
| 引數名 | 型別 | 是否必傳 | 說明 |
|---|---|---|---|
| order_id | int | 是 | 訂單編號 |
3.回應結果:JSON
| 欄位 | 說明 |
|---|---|
| code | 狀態碼 |
| errmsg | 錯誤資訊 |
| alipay_url | 支付寶登錄鏈接 |
4.后端介面定義和實作
A.創建子應用
django-admin startapp pay
B.添加模塊
INSTALLED_APPS = [
‘apps.pay’,
]
C.配置路由
urlpatterns = [
path(‘payment/<order_id>/’,PayUrlView.as_view()),
]
urlpatterns = [
path(’’,include(‘apps.pay.urls’)),
]
D.業務邏輯
"""
需求:
當用戶點擊去支付按鈕的時候,要后端生成一個跳轉的連接
前端:
axios 請求. 攜帶 訂單id
后端:
請求: 獲取訂單id
業務邏輯: 生成支付寶鏈接(讀取檔案)
讀取應用私鑰和支付寶公鑰
創建支付寶實體,呼叫支付寶的方法
拼接連接
回應:
路由: GET payment/order_id/
步驟:
1. 獲取訂單id
2. 驗證訂單id (根據訂單id查詢訂單資訊)
3. 讀取應用私鑰和支付寶公鑰
4. 創建支付寶實體
5. 呼叫支付寶的支付方法
6. 拼接連接
7. 回傳回應
"""
from django.views import View
from apps.orders.models import OrderInfo
from utils.views import LoginRequiredJSONMixin
from django.http import JsonResponse
from meiduo_mall import settings
from alipay import AliPay, AliPayConfig
class PayUrlView(LoginRequiredJSONMixin, View):
def get(self, request, order_id):
user = request.user
# 1. 獲取訂單id
# 2. 驗證訂單id (根據訂單id查詢訂單資訊)
try:
# 為了業務邏輯的準確性,
# 查詢待支付的訂單
order = OrderInfo.objects.get(order_id=order_id,
status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'],
user=user)
except OrderInfo.DoesNotExist:
return JsonResponse({'code': 400, 'errmsg': '沒有此訂單'})
# 3. 讀取應用私鑰和支付寶公鑰
app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()
# 4. 創建支付寶實體
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,
sign_type="RSA2", # RSA 或者 RSA2
debug=settings.ALIPAY_DEBUG, # 默認False
config=AliPayConfig(timeout=15) # 可選, 請求超時時間
)
# 5. 呼叫支付寶的支付方法
# 如果你是 Python 3的用戶,使用默認的字串即可
subject = "多多商城測驗訂單"
# 電腦網站支付,需要跳轉到https://openapi.alipay.com/gateway.do? + order_string
# https://openapi.alipay.com/gateway.do 這個是線上的
# 'https://openapi.alipaydev.com/gateway.do' 這個是沙箱的
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(order.total_amount), # 一定要進行型別轉換,因為decimal不是基本資料型別
subject=subject,
return_url=settings.ALIPAY_RETURN_URL, # 支付成功之后,跳轉的頁面
notify_url="https://example.com/notify" # 可選, 不填則使用默認notify url
)
# 6. 拼接連接
pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
# 7. 回傳回應
return JsonResponse({'code': 0, 'errmsg': 'ok', 'alipay_url': pay_url})
E.我的測驗


例外:Crtl+Shift+delete,清空瀏覽器快取

5.添加交易記錄
添加模型
# Create your models here.
from django.db import models
from apps.orders.models import OrderInfo
from 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'
verbose_name = '支付資訊'
verbose_name_plural = verbose_name
代碼實作
"""
前端:
當用戶支付完成之后,會跳轉到 指定商品頁面
頁面中的請求 查詢字串中有 支付相關資訊
前端把這些資料提交給后端就可以了
后端:
請求: 接收資料
業務邏輯: 查詢字串轉換為字典,驗證資料,驗證沒有問題獲取支付寶交易流水號
改變訂單狀態
回應:
路由: PUT payment/status/
步驟:
1. 接收資料
2. 查詢字串轉換為字典 驗證資料
3. 驗證沒有問題獲取支付寶交易流水號
4. 改變訂單狀態
5. 回傳回應
買家賬號eghulw5253@sandbox.com
登錄密碼111111
支付密碼111111
"""
from apps.pay.models import Payment
class PaymentStatusView(View):
def put(self, request):
# 1. 接收資料
data = request.GET
# 2. 查詢字串轉換為字典 驗證資料
data = data.dict()
# 3. 驗證沒有問題獲取支付寶交易流水號
signature = data.pop("sign")
app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).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,
sign_type="RSA2", # RSA 或者 RSA2
debug=settings.ALIPAY_DEBUG, # 默認False
config=AliPayConfig(timeout=15) # 可選, 請求超時時間
)
success = alipay.verify(data, signature)
if success:
# 獲取 trade_no String 必填 64 支付寶交易號
trade_no = data.get('trade_no')
order_id = data.get('out_trade_no')
Payment.objects.create(
trade_id=trade_no,
order_id=order_id
)
# 4. 改變訂單狀態
OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_no})
else:
return JsonResponse({'code': 400, 'errmsg': '請到個人中心的訂單中查詢訂單狀態'})
展示鮮果

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/345747.html
標籤:python
