日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...

發(fā)布時間:2024/10/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

本文主要針對 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 random
from 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_exempt
def 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&timestamp=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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。