django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...
一、前言
本文主要針對 Python for Django 在對接支付寶電腦網(wǎng)站、手機網(wǎng)站、App支付過程中具體實現(xiàn)步驟進行詳解;
相信大家支付功能也寫了不少,但時間一長,再次用到的時候有些細(xì)節(jié)難免會忘記,此篇文章就為方便后續(xù)快速實現(xiàn)支付寶各支付功能集成而作。
二、支付寶開發(fā)者相關(guān)文檔
支付寶開發(fā)文檔:?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
開發(fā)幫助中心:?https://opensupport.alipay.com/support/helpcenter/192
對接過程中如果遇到難題,可以在幫助中心尋找答案
三、各支付功能支付流程圖
支付流程文字?jǐn)⑹鋈缦?/strong>,以電腦網(wǎng)站支付為例
用戶點擊下單,生成訂單信息,前端攜帶后端生成返回的訂單id,調(diào)取獲取支付寶支付鏈接口,接口返回支付鏈接(包含訂單編號,總金額,return_url,notify_url 等參數(shù));前端獲取到支付寶支付鏈接后,構(gòu)建form表單,向支付寶服務(wù)器發(fā)起支付請求;進入支付寶支付頁面,登錄支付寶,登錄成功后輸入支付密碼,進行支付;支付成功后跳轉(zhuǎn)到支付成功頁面,支付寶攜帶支付結(jié)果數(shù)據(jù)重定向到商戶指定的 return_url 頁面;前端攜帶支付成功結(jié)果數(shù)據(jù),向同步回調(diào)通知接口發(fā)起請求,后端驗簽成功后返回支付成功業(yè)務(wù)邏輯響應(yīng);同時支付寶服務(wù)器也會根據(jù)提供的 notify_url 異步請求異步通知接口,后端驗簽成功,保存支付結(jié)果,并返回 success 字符給支付寶服務(wù)器;到此支付流程結(jié)束
四、支付寶接入前準(zhǔn)備
4.1 創(chuàng)建應(yīng)用
安裝SDK:?pip install python-alipay-sdk==1.7.1
創(chuàng)建項目:?django-admin startproject alipay_demo
創(chuàng)建應(yīng)用:?python manage.py startapp payment
本Demo目錄結(jié)構(gòu)
4.2 配置公私鑰
此步主要完成兩個配置文件,即:應(yīng)用私鑰:app_private_key.pem,支付寶公鑰:alipay_public_key.pem
生成應(yīng)用的私鑰和公鑰,Windows用戶請下載簽名工具# 打開終端,輸入openssl回車,一次執(zhí)行以下命令生成應(yīng)用公私鑰 openssl OpenSSL> genrsa -out app_private_key.pem 2048 # 私鑰RSA2 OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 導(dǎo)出公鑰 OpenSSL> exit #退出OpenSSL程序
保存應(yīng)用私鑰文件在 payment 應(yīng)用中新建 keys 目錄,用來保存秘鑰文件。將應(yīng)用私鑰文件 app_private_key.pem 復(fù)制到 payment/keys 目錄下, 內(nèi)容如下。
-----BEGIN RSA PRIVATE KEY-----此處為上面生成的應(yīng)用私鑰
-----BEGIN RSA PRIVATE KEY-----
查看公鑰
cat app_publict_key.pem將應(yīng)用公鑰內(nèi)容復(fù)制粘貼到支付寶控制臺進行配置,會得到支付寶公鑰;如圖,第一次應(yīng)該是設(shè)置應(yīng)用公鑰
注意:對應(yīng)加密方式進行配置,推薦RSA2。
保存支付寶公鑰在 payment/keys 目錄下新建 alipay_public_key.pem 文件,用于保存支付寶的公鑰文件。將上一步生成的支付寶的公鑰內(nèi)容復(fù)制到 alipay_public_key.pem 文件中,格式如下:
注意:還需要在公鑰文件中補充開始與結(jié)束標(biāo)志,格式如下:
-----BEGIN PUBLIC KEY-----此處是公鑰內(nèi)容
-----END PUBLIC KEY-----
五、支付視圖接口實現(xiàn)
5.0 封裝支付寶支付對象
代碼如下:?寫到 payment 應(yīng)用里的 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:
支付成功支付寶服務(wù)器異步通知默認(rèn)回調(diào)url,會向這個地址發(fā)送POST請求,接口實現(xiàn)校驗是否支付已經(jīng)完成,注意:此地址需要能在公網(wǎng)進行訪問
:return: 支付對象
"""
ali_pay_obj = AliPay(
appid=settings.ALI_PAY_APP_ID,
app_notify_url=notify_url, # 支付成功支付寶服務(wù)器異步通知默認(rèn)回調(diào)url, 即會向這個地址發(fā)送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 # 是否是沙箱環(huán)境, 默認(rèn)False
)
return ali_pay_obj
5.1 獲取支付鏈接接口實現(xiàn)
代碼如下:?以下為視圖,寫在 payment 應(yīng)用的 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') # 前端傳回的金額數(shù)據(jù)
if not all([order_id, money]):
return JsonResponse(dict(message="參數(shù)錯誤"))
# 此處可增加根據(jù)訂單id查詢判斷該訂單是否存在相關(guān)業(yè)務(wù)邏輯
# 組織訂單編號:當(dāng)前時間字符串 + 6位隨機數(shù) ---> 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), # 交易金額(單位: 元 保留倆位小數(shù)) 這里一般是從前端傳過來的數(shù)據(jù)
subject=f"產(chǎn)品名稱-{out_trade_no}", # 商品名稱或產(chǎn)品名稱
return_url=domain_name + "/payment/get_result/", # 支付成功后跳轉(zhuǎn)的頁面,App支付此參數(shù)無效,集成支付寶SDK自帶跳轉(zhuǎn)
)
# 拼接支付鏈接,注意:App支付不需要返回支付寶網(wǎng)關(guān)
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 支付成功同步回調(diào)通知接口實現(xiàn)代碼如下:
@csrf_exemptdef pay_result(request):
"""
前端同步回調(diào)通知(支付完成后,前端url會接收支付寶支付完成后回傳的form參數(shù),將其全部傳給該接口進行驗簽),參數(shù)示例如下:
?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: 根據(jù)業(yè)務(wù)需求自定義返回信息
"""
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("同步回調(diào)驗簽狀態(tài): ", success)
if success:
# 此處寫支付驗簽成功的相關(guān)業(yè)務(wù)邏輯
return JsonResponse(dict(message="支付成功"))
return JsonResponse(dict(message="支付失敗"))
return JsonResponse(dict(message="支付失敗"))
5.3 支付成功異步通知接口實現(xiàn)
代碼如下:
@csrf_exempt@atomic()
def update_order(request):
"""
支付成功后,支付寶服務(wù)器異步通知回調(diào)(用于修改訂單狀態(tài))
: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解碼再轉(zhuǎn)換成字典
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) # 返回驗簽結(jié)果, True/False
print("異步通知驗證狀態(tài): ", success)
if success:
# 此處寫支付驗簽成功修改訂單狀態(tài)相關(guān)業(yè)務(wù)邏輯
return HttpResponse('success') # 返回success給支付寶服務(wù)器, 若支付寶收不到success字符會重復(fù)發(fā)送通知
return HttpResponse('fail')
return HttpResponse('fail')
六、區(qū)別總結(jié)
是不是非常強大,需要項目源碼獲取加群“1136192749”
轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系刪除
總結(jié)
以上是生活随笔為你收集整理的django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码 直接调节显示设备亮度_投影仪太暗怎
- 下一篇: hls fifo_【正点原子FPGA连载