日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇精品无码一区二区三区 | 就是色 | 亚洲av无码精品色午夜 | 国产91精品一区二区 | 精品欧美一区二区精品久久 | 九九九亚洲| 精品国产黄色片 | 亚洲中文字幕一区在线 | 一区二区伦理片 | 92av视频 | 成片免费观看视频大全 | 中文字幕在线观看1 | 国产婷婷色一区二区在线观看 | 香港三级日本三级韩国三级 | 欧美亚洲一区二区在线观看 | 色优久久 | 欧美日韩国产大片 | 777毛片 | 亚洲va国产va天堂va久久 | 黄色网页在线看 | 久草大| 亚洲最大视频网站 | 黄色一级图片 | 国产精彩视频在线观看 | 黄网站免费大全入口 | 国产情侣久久久久aⅴ免费 caoporn成人 | 日本乱子伦 | 天堂欧美城网站 | 日韩最新 | 一区二区高清 | 亚洲一级电影 | 久久蜜臀精品av | 日韩淫| 手机电影在线观看 | 污片在线看| 欧美乱码精品一区二区三区 | 色播99 | 怎么可能高潮了就结束漫画 | 女性向小h片资源在线观看 日本天天操 | 丰满少妇中文字幕 | aaa日韩 | 91精品国产高清一区二区三密臀 | 在线观看av毛片 | 久啪视频 | 亚洲精品视频一区二区三区 | 伊人久久综合视频 | 天天鲁一鲁摸一摸爽一爽 | 中文字幕一区二区人妻在线不卡 | 色妇av| 国产精品麻豆成人av电影艾秋 | 亚洲女人的天堂 | 射综合网 | 先锋影音av在线资源 | jiizzyou性欧美老片 | 喷水av| 亚洲av无一区二区三区怡春院 | 国产ts系列 | 老熟妇仑乱视频一区二区 | 在线观看国产成人 | 爱情岛论坛自拍亚洲品质极速最新章 | 娇小萝被两个黑人用半米长 | 国产第一网站 | 国产毛片久久 | 男女视频久久 | 久久视频一区 | 男女做那个的全过程 | 色老头在线一区二区三区 | 小少妇哺乳喂奶播放 | 国产免费黄色大片 | 成人在线免费观看网站 | 久久精品国产一区 | 日本少妇毛茸茸高潮 | 狼人狠狠干| 亚洲日日夜夜 | 久久靠逼视频 | 免费超碰在线观看 | 欧美丰满美乳xxx高潮www | 91香蕉视频在线观看免费 | 日本黄色小说 | 另一种灿烂生活 | 天天干天天做天天操 | 日韩精品无码一区二区三区久久久 | 国产乱码精品一区二区三区中文 | 高清av一区| 四虎永久免费在线观看 | 日本不卡一区二区三区在线观看 | 一区二区国产精品视频 | 性欧美丰满熟妇xxxx性仙踪林 | 天天色天天看 | 日韩免费视频网站 | 香蕉视频| 日韩av有码 | 天堂av观看 | 日韩欧美一区二区三区视频 | 久久久久久国产精品视频 | 亚洲自拍激情 | 久久激情免费视频 | 夜夜嗨aⅴ一区二区三区 | 亚洲熟女综合色一区二区三区 |