django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...
一、前言
本文主要針對 Python for Django 在對接支付寶電腦網站、手機網站、App支付過程中具體實現步驟進行詳解;
相信大家支付功能也寫了不少,但時間一長,再次用到的時候有些細節難免會忘記,此篇文章就為方便后續快速實現支付寶各支付功能集成而作。
二、支付寶開發者相關文檔
支付寶開發文檔:?https://openhome.alipay.com/developmentDocument.htm
支付快速接入文檔:?https://docs.open.alipay.com/270/105899/
官方SDK地址:?https://docs.open.alipay.com/270/106291/
非官方支付寶SDK地址:?https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
開發幫助中心:?https://opensupport.alipay.com/support/helpcenter/192
對接過程中如果遇到難題,可以在幫助中心尋找答案
三、各支付功能支付流程圖
支付流程文字敘述如下,以電腦網站支付為例
用戶點擊下單,生成訂單信息,前端攜帶后端生成返回的訂單id,調取獲取支付寶支付鏈接口,接口返回支付鏈接(包含訂單編號,總金額,return_url,notify_url 等參數);前端獲取到支付寶支付鏈接后,構建form表單,向支付寶服務器發起支付請求;進入支付寶支付頁面,登錄支付寶,登錄成功后輸入支付密碼,進行支付;支付成功后跳轉到支付成功頁面,支付寶攜帶支付結果數據重定向到商戶指定的 return_url 頁面;前端攜帶支付成功結果數據,向同步回調通知接口發起請求,后端驗簽成功后返回支付成功業務邏輯響應;同時支付寶服務器也會根據提供的 notify_url 異步請求異步通知接口,后端驗簽成功,保存支付結果,并返回 success 字符給支付寶服務器;到此支付流程結束
四、支付寶接入前準備
4.1 創建應用
安裝SDK:?pip install python-alipay-sdk==1.7.1
創建項目:?django-admin startproject alipay_demo
創建應用:?python manage.py startapp payment
本Demo目錄結構
4.2 配置公私鑰
此步主要完成兩個配置文件,即:應用私鑰:app_private_key.pem,支付寶公鑰:alipay_public_key.pem
生成應用的私鑰和公鑰,Windows用戶請下載簽名工具# 打開終端,輸入openssl回車,一次執行以下命令生成應用公私鑰 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 #退出OpenSSL程序
保存應用私鑰文件在 payment 應用中新建 keys 目錄,用來保存秘鑰文件。將應用私鑰文件 app_private_key.pem 復制到 payment/keys 目錄下, 內容如下。
-----BEGIN RSA PRIVATE KEY-----此處為上面生成的應用私鑰
-----BEGIN RSA PRIVATE KEY-----
查看公鑰
cat app_publict_key.pem將應用公鑰內容復制粘貼到支付寶控制臺進行配置,會得到支付寶公鑰;如圖,第一次應該是設置應用公鑰
注意:對應加密方式進行配置,推薦RSA2。
保存支付寶公鑰在 payment/keys 目錄下新建 alipay_public_key.pem 文件,用于保存支付寶的公鑰文件。將上一步生成的支付寶的公鑰內容復制到 alipay_public_key.pem 文件中,格式如下:
注意:還需要在公鑰文件中補充開始與結束標志,格式如下:
-----BEGIN PUBLIC KEY-----此處是公鑰內容
-----END PUBLIC KEY-----
五、支付視圖接口實現
5.0 封裝支付寶支付對象
代碼如下:?寫到 payment 應用里的 utils.py 工具里
# -*- coding: utf-8 -*-import os
from alipay import AliPay # python-alipay-sdk
from django.conf import settings
def my_ali_pay(notify_url=None):
"""
支付寶支付對象
:param notify_url:
支付成功支付寶服務器異步通知默認回調url,會向這個地址發送POST請求,接口實現校驗是否支付已經完成,注意:此地址需要能在公網進行訪問
:return: 支付對象
"""
ali_pay_obj = AliPay(
appid=settings.ALI_PAY_APP_ID,
app_notify_url=notify_url, # 支付成功支付寶服務器異步通知默認回調url, 即會向這個地址發送POST請求
app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"),
# 支付寶的公鑰,驗證支付寶回傳消息使用
alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"),
sign_type="RSA2", # RSA 或者 RSA2
debug=settings.ALI_PAY_DEBUG # 是否是沙箱環境, 默認False
)
return ali_pay_obj
5.1 獲取支付鏈接接口實現
代碼如下:?以下為視圖,寫在 payment 應用的 views.py 文件里
import randomfrom urllib import parse
from django.conf import settings
from django.db.transaction import atomic
from django.http import JsonResponse, HttpResponse
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from apps.payment.utils import my_ali_pay, is_app_pay
from utils.common import get_domain
@csrf_exempt
def get_pay_url(request):
"""
獲取支付寶支付鏈接
:return: 支付鏈接ali_pay_url
"""
if request.method == "GET":
order_id = request.GET.get('order_id', 0) # 前端傳回的訂單id
money = request.GET.get('price') # 前端傳回的金額數據
if not all([order_id, money]):
return JsonResponse(dict(message="參數錯誤"))
# 此處可增加根據訂單id查詢判斷該訂單是否存在相關業務邏輯
# 組織訂單編號:當前時間字符串 + 6位隨機數 ---> 20200808154711123456
out_trade_no = timezone.now().strftime('%Y%m%d%H%M%S') + ''.join(map(str, random.sample(range(0, 9), 6)))
# 生成支付寶支付鏈接地址
domain_name = get_domain(request)
notify_url = domain_name + '/payment/update_order/'
ali_pay = my_ali_pay(notify_url)
order_string = ali_pay.api_alipay_trade_page_pay(
out_trade_no=out_trade_no, # 訂單編號
total_amount=str(money), # 交易金額(單位: 元 保留倆位小數) 這里一般是從前端傳過來的數據
subject=f"產品名稱-{out_trade_no}", # 商品名稱或產品名稱
return_url=domain_name + "/payment/get_result/", # 支付成功后跳轉的頁面,App支付此參數無效,集成支付寶SDK自帶跳轉
)
# 拼接支付鏈接,注意:App支付不需要返回支付寶網關
ali_pay_url = order_string if is_app_pay(order_string) else settings.ALI_PAY_URL + "?" + order_string
return JsonResponse(dict(ali_pay_url=ali_pay_url))
return JsonResponse(dict(ali_pay_url=""))
5.2 支付成功同步回調通知接口實現代碼如下:
@csrf_exemptdef pay_result(request):
"""
前端同步回調通知(支付完成后,前端url會接收支付寶支付完成后回傳的form參數,將其全部傳給該接口進行驗簽),參數示例如下:
?charset=utf-8&out_trade_no=20200808154711123456&method=alipay.trade.page.pay.return&total_amount=0.01&sign=FtDkDtsDE9dW3RB18BfiAeFqkSQAK......E1wE9tgsoUi50%2B0IH7w%3D%3D&trade_no=2020080622001460481436975535&auth_app_id=2016101000655892&version=1.0&app_id=2016101000655892&sign_type=RSA2&seller_id=2087811328364696×tamp=2020-08-06+12%3A44%3A44
:return: 根據業務需求自定義返回信息
"""
if request.method == "GET":
data = request.GET.dict()
ali_pay = my_ali_pay()
sign = data.pop('sign', None)
success = ali_pay.verify(data, sign)
print("同步回調驗簽狀態: ", success)
if success:
# 此處寫支付驗簽成功的相關業務邏輯
return JsonResponse(dict(message="支付成功"))
return JsonResponse(dict(message="支付失敗"))
return JsonResponse(dict(message="支付失敗"))
5.3 支付成功異步通知接口實現
代碼如下:
@csrf_exempt@atomic()
def update_order(request):
"""
支付成功后,支付寶服務器異步通知回調(用于修改訂單狀態)
:return: success or fail
"""
if request.method == "POST":
body_str = request.body.decode('utf-8')
data = parse.parse_qs(body_str)
# data = parse.parse_qs(parse.unquote(body)) # 前端回傳的url如果被編碼,這里需要用unquote解碼再轉換成字典
data = {k: v[0] for k, v in data.items()}
ali_pay = my_ali_pay()
sign = data.pop('sign', None)
success = ali_pay.verify(data, sign) # 返回驗簽結果, True/False
print("異步通知驗證狀態: ", success)
if success:
# 此處寫支付驗簽成功修改訂單狀態相關業務邏輯
return HttpResponse('success') # 返回success給支付寶服務器, 若支付寶收不到success字符會重復發送通知
return HttpResponse('fail')
return HttpResponse('fail')
六、區別總結
是不是非常強大,需要項目源碼獲取加群“1136192749”
轉載于網絡,如有侵權聯系刪除
總結
以上是生活随笔為你收集整理的django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码 直接调节显示设备亮度_投影仪太暗怎
- 下一篇: hls fifo_【正点原子FPGA连载