詳解基于python-django框架的支付寶支付案例
一. 開(kāi)發(fā)前的準(zhǔn)備
1. 必須了解的知識(shí)
- SDK:軟件開(kāi)發(fā)工具包,可以為開(kāi)發(fā)者提供快速開(kāi)發(fā)的工具
- 沙箱環(huán)境:也就是測(cè)試環(huán)境
- 支付寶支付金額的精度:小數(shù)點(diǎn)后兩位(面試)
支付寶用的什么加密方式:RSA
2. 沙箱環(huán)境的配置
① 登錄支付寶開(kāi)放平臺(tái)
② 進(jìn)入管理中心后選擇研【研發(fā)服務(wù)】

③ 生成RSA密鑰
選擇【查看應(yīng)用公鑰】
選擇【查看應(yīng)用公鑰生成方法】
下載秘鑰生成工具
鏈接已經(jīng)找好了,windows的用戶直接下載: https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB
安裝后打開(kāi)工具直接選擇【生成秘鑰】

④ 將生成的 應(yīng)用公鑰 輸入表單中,選擇【保存】,系統(tǒng)會(huì)根據(jù)輸入的 應(yīng)用公鑰 自動(dòng)生成 支付寶公鑰 ,可以選擇【設(shè)置/查看】

⑤下載沙箱錢(qián)包APP,用于 支付測(cè)試

注意:生成秘鑰工具生成的 應(yīng)用公鑰 是用來(lái)生成 支付寶公鑰 ,剩下一個(gè) 應(yīng)用私鑰 注意保存。
3. 開(kāi)發(fā)環(huán)境介紹
- 操作系統(tǒng):Win10
- 編輯器:PyCharm 2019.2
- 調(diào)試:Chrome 77.0.3865.75
- Python版本:Python 3.7.x
- Django版本:Django 2.2.5
4. 支付寶支付流程
用戶點(diǎn)擊支付時(shí),網(wǎng)站根據(jù)支付寶的 APPID / 網(wǎng)關(guān) / 支付寶公鑰私鑰 / SDK生成地址,再根據(jù)生成的地址,讓用戶跳轉(zhuǎn)到支付寶進(jìn)行支付。用戶支付完成后,支付寶會(huì)給網(wǎng)站發(fā)送兩個(gè)請(qǐng)求,分別是get和post請(qǐng)求。get請(qǐng)求是從支付寶網(wǎng)站跳轉(zhuǎn)到自己的網(wǎng)站,post請(qǐng)求是向自己的網(wǎng)站發(fā)送支付相關(guān)的信息,網(wǎng)站可以憑借這些信息去修改網(wǎng)站訂單的狀態(tài)。
二. 開(kāi)發(fā)實(shí)施流程
1. 商品數(shù)據(jù)表的創(chuàng)建
model.py
from django.db import models # Create your models here. class Goods(models.Model): goods_name = models.CharField(max_length=32) goods_price = models.FloatField() class Order(models.Model): order_number = models.CharField(max_length=64) status_choices = ((0, '未支付'), (1, '已支付')) order_status = models.IntegerField(choices=status_choices, default=0) goods = models.ForeignKey(to='Goods', on_delete=models.CASCADE)
在Terminal中執(zhí)行 python manage.py makemigrations 和 python manage.py migrate ,或者到工程目錄下執(zhí)行這兩條指令,完成建表。
C:\Users\thanlon\PycharmProjects\alipay_django>python manage.py makemigrations
C:\Users\thanlon\PycharmProjects\alipay_django>python manage.py migrate

2. 購(gòu)物車(chē)視圖的構(gòu)建
向商品表插入數(shù)據(jù)

構(gòu)建商品信息頁(yè)面
urls.py :
from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('goods/', views.goods),
]
views.py :
from django.shortcuts import render
from app import models
# Create your views here.
def goods(request):
goods_list = models.Goods.objects.all()
# print(goods_list)
# <QuerySet [<Goods: Goods object (1)>, <Goods: Goods object (2)>, <Goods: Goods object (3)>, <Goods: Goods object (4)>]>
return render(request, 'goods.html', {'goods_list': goods_list})
goods.html :
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>商品信息</title>
<link rel="stylesheet"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 10px">
<h4 style="text-align: center;font-weight: bold">Django支付寶支付案例</h4>
</div>
<div class="row" style="margin-top: 10px">
<div class="col-md-4 col-md-offset-4">
<table class="table table-bordered">
{% for row in goods_list %}
<tr style="text-align: center">
<td>{{ row.id }}</td>
<td>{{ row.goods_name }}</td>
<td>{{ row.goods_price }}</td>
<td><a href="/purchase/{{ row.id }}">購(gòu)買(mǎi)</a></td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
<div class="container-fluid" style="color: #b2bcc5;margin-top: 20px;margin-bottom: 2px">
<div class="row">
<div class="col-md-12 text-center" style="padding: 40px">
Copyright © 2019-2020 藍(lán)色旗幟 版權(quán)所有
<a target="_blank_" style="color:#b2bcc5;">豫ICP備19014367號(hào)-1</a>
</div>
</div>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
</html>

3. 訂單支付
① 把生成好的應(yīng)用私鑰和支付寶公鑰以及支付寶網(wǎng)站支付接口 pay.py 也放在項(xiàng)目根目錄下,如下圖所示:

② 安裝pycryptodome模塊
pip install pycryptodome ,接口依賴于該加密模塊。
③ 添加路由
urls.py :
from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('goods/', views.goods),
path('purchase/<goods_id>/', views.purchase),
]
④ 編寫(xiě)訂單支付邏輯
views.py :
from django.shortcuts import render, redirect
from app import models
import uuid
from utils.pay import AliPay
# Create your views here.
def goods(request):
goods_list = models.Goods.objects.all()
# print(goods_list)
# <QuerySet [<Goods: Goods object (1)>, <Goods: Goods object (2)>, <Goods: Goods object (3)>, <Goods: Goods object (4)>]>
return render(request, 'goods.html', {'goods_list': goods_list})
def purchase(request, goods_id):
'''
訂單支付
:param request:
:param goods_id:傳過(guò)來(lái)的商品id
:return:跳轉(zhuǎn)到支付寶支付頁(yè)面
'''
# 獲取商品信息,因?yàn)橄蛑Ц秾毥涌诎l(fā)送請(qǐng)求的時(shí)候需要攜帶該商品相關(guān)信息
obj_goods = models.Goods.objects.get(pk=goods_id) # pk就是商品的標(biāo)識(shí),等價(jià)于使用id
'''
生成訂單
'''
order_number = str(uuid.uuid4())
# print(order_number) # bd9ee7fe-aca5-449d-acd1-63bcd8e30cde
models.Order.objects.create(
order_number=order_number,
goods=obj_goods, # 或者goods_id=obj_goods.id
)
'''
跳轉(zhuǎn)到支付寶支付頁(yè)面
'''
# 實(shí)例化對(duì)象
alipay = AliPay(
appid='2016101200668044',
app_notify_url=' ', # 支付寶發(fā)送支付狀態(tài)信息的地址,支付寶會(huì)向這個(gè)地址發(fā)送post請(qǐng)求,可以先不寫(xiě)但是必須有內(nèi)容(我這里用的是空格)
return_url=' ', # 將用戶瀏覽器地址重定向回原來(lái)的地址,支付寶會(huì)向這個(gè)地址發(fā)送get請(qǐng)求,可以先不寫(xiě)但是必須有內(nèi)容
alipay_public_key_path='keys/alipay_public_2048.txt', # 支付寶公鑰
app_private_key_path='keys/app_private_2048.txt', # 應(yīng)用私鑰
debug=True, # 默認(rèn)是True代表測(cè)試環(huán)境,F(xiàn)alse代表正式環(huán)境
)
# 定義請(qǐng)求地址傳入的參數(shù)
query_params = alipay.direct_pay(
subject=obj_goods.goods_name, # 商品的簡(jiǎn)單描述
out_trade_no=order_number, # 商品訂單號(hào)
total_amount=obj_goods.goods_price, # 交易金額(單位是元,保留兩位小數(shù))
)
# 需要跳轉(zhuǎn)到支付寶的支付頁(yè)面,所以需要生成跳轉(zhuǎn)的url
pay_url = 'https://openapi.alipaydev.com/gateway.do?{0}'.format(query_params)
return redirect(pay_url)
成功跳轉(zhuǎn)到支付頁(yè)面:

訂單表生成數(shù)據(jù):
4. 訂單狀態(tài)的更新
① 編寫(xiě)視圖函數(shù)show_msg來(lái)接收支付寶的發(fā)送過(guò)來(lái)的get請(qǐng)求
支付成功后,支付寶向我們指定的地址發(fā)送get請(qǐng)求,也就從支付寶回到我們自己的網(wǎng)站。我們需要根據(jù)請(qǐng)求附帶的信息,如:
http://106.12.115.136:5000/show_msg/?charset=utf-8&out_trade_no=fc4252b0-b0a4-480a-bd83-aaaca3745378&method=alipay.trade.page.pay.return&total_amount=369.00&sign=Is%2FhB%2FmO2c64JerilFTYTwk%2BlR%2FHoCE1E5EOdzZ0DIotykMBuXB0023z0XpmsNq3kKutAF%2FbVusrsrdqUwPeRX%2F4nYphZOWHdrQUYVkY%2BsOdAJl1hfuVRySRBwYVTnbNJpQpnHJb9uQtFRcaktvgrGZKdd3gZCETf90l12JEsG7ishPgvsYIJVvI1VtSKTNvUvk3XxZoiBoyv5h3Wu0wENoEHS3HaHnI0hloTZB9rccW%2Bq7eyVj8dSKcOw51rti%2FBBNfmN%2BpLBTtXn4nwyQDmh%2BnTBVKy%2BY8ifai8iedwhX5I0l7mLfFRZvXf1C8F%2BsxJf4fT2%2Ft7czkJKiOwXBsPg%3D%3D&trade_no=2019092122001473661000497724&auth_app_id=2016101200668044&version=1.0&app_id=2016101200668044&sign_type=RSA2&seller_id=2088102179220884×tamp=2019-09-21+14%3A20%3A07
來(lái)進(jìn)行驗(yàn)證,是否支付成功。下面是實(shí)現(xiàn)該功能的核心代碼:
urls.py :(將路由添加到utls.py文件中)
path('show_msg/', views.show_msg),
views.py :
def show_msg(request):
if request.method == 'GET':
alipay = AliPay(
appid="2016101200668044", # APPID
app_notify_url='http://127.0.0.1:8000/check_order/',
return_url='http://127.0.0.1:8000/show_msg/',
app_private_key_path='keys/app_private_2048.txt', # 應(yīng)用私鑰
alipay_public_key_path='keys/alipay_public_2048.txt', # 支付寶公鑰
debug=True, # 默認(rèn)是False
)
params = request.GET.dict() # 獲取請(qǐng)求攜帶的參數(shù)并轉(zhuǎn)換成字典類型
print(
request.GET) # <QueryDict: {'charset': ['utf-8'], 'out_trade_no': ['04f09b6f-e792-4a1d-8dbc-c68f1d046622'], ……}
print(params) # {'charset': 'utf-8', 'out_trade_no': '04f09b6f-e792-4a1d-8dbc-c68f1d046622',……}
sign = params.pop('sign', None) # 獲取sign的值
# 對(duì)sign參數(shù)進(jìn)行驗(yàn)證
status = alipay.verify(params, sign)
if status:
return render(request, 'show_msg.html', {'msg': '支付成功'})
else:
return render(request, 'show_msg.html', {'msg': '支付失敗'})
else:
return render(request, 'show_msg.html', {'msg': '只支持GET請(qǐng)求,不支持其它請(qǐng)求'})
show_msg.html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>支付結(jié)果</title>
<link rel="stylesheet"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 30px">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-primary">
<div class="panel-body text-center">{{ msg }}!</div>
</div>
</div>
</div>
</div>
</body>
</html>
支付成功的截圖:

① 編寫(xiě)視圖函數(shù)check_order來(lái)接收支付寶的發(fā)送過(guò)來(lái)的POST請(qǐng)求,根據(jù)POST過(guò)來(lái)的請(qǐng)求體內(nèi)容,判斷是否支付成功,如果支付成功,把訂單支付狀態(tài)改為 已支付 。
注意:在本地測(cè)試app_notify_url參數(shù)必須通過(guò)公網(wǎng)接收請(qǐng)求,支付寶只能向外網(wǎng)發(fā)送POST請(qǐng)求,所以必須把項(xiàng)目運(yùn)行在具有公網(wǎng)ip的服務(wù)器上,第三部分【三. 支付項(xiàng)目部署】會(huì)論述到。這里把視圖函數(shù)邏輯完成。
因?yàn)樾枰С諴OST請(qǐng)求,所以需要修改配置文件:
settings.py
… MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 注釋掉這一行,就不會(huì)報(bào)CSRF cookie not set.)的錯(cuò)誤 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] …
views.py :(需要將所有的 app_notify_url 的值修改為公網(wǎng)地址)
def check_order(request):
'''
支付寶通知支付的結(jié)果信息,如果支付成功可以用來(lái)修改訂單的狀態(tài)
:param request:
:return:
'''
if request.method == 'POST':
alipay = AliPay(
appid="2016101200668044", # APPID
app_notify_url='http://106.12.115.136:8000/check_order/', # 支付寶會(huì)向這個(gè)地址發(fā)送post請(qǐng)求
return_url='http://127.0.0.1:8000/show_msg/', # 支付寶會(huì)向這個(gè)地址發(fā)送get請(qǐng)求
app_private_key_path='keys/app_private_2048.txt', # 應(yīng)用私鑰
alipay_public_key_path='keys/alipay_public_2048.txt', # 支付寶公鑰
debug=True,
)
# print('request.body:', request.body) # 是字節(jié)類型,b'gmt_create=2019-09-21+17%3A00%3A15&charset=utf-8&……
body_str = request.body.decode('utf-8') # 轉(zhuǎn)成字符串
# print('body_str:', body_str)
from urllib.parse import parse_qs
post_data = parse_qs(body_str) # 根據(jù)&符號(hào)分割
print(post_data) # post_data是一個(gè)字符串
post_dict = {}
for k, v in post_data.items():
post_dict[k] = v[0]
sign = post_dict.pop('sign', None)
status = alipay.verify(post_dict, sign)
if status: # 支付成功
out_trade_no = post_data['out_trade_no']
models.Order.objects.filter(order_number=out_trade_no).update(order_status=1)
return HttpResponse('success') # 向支付寶返回success,表示接收到請(qǐng)求
else:
return HttpResponse('支付失敗')
else:
return HttpResponse('只支持POST請(qǐng)求')
5. 訂單視圖的生成
order_list.html :
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>訂單信息</title>
<link rel="stylesheet"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 10px">
<h4 style="text-align: center;font-weight: bold">Django支付寶支付案例</h4>
</div>
<div class="row" style="margin-top: 10px">
<div class="col-md-8 col-md-offset-2">
<table class="table table-bordered">
<tr style="text-align: center">
<th style="text-align: center">訂單ID</th>
<th style="text-align: center">訂單號(hào)</th>
<th style="text-align: center">訂單狀態(tài)</th>
<th style="text-align: center">商品名稱</th>
<th style="text-align: center">商品價(jià)格</th>
</tr>
{% for row in order_obj %}
<tr style="text-align: center">
<td>{{ row.id }}</td>
<td>{{ row.order_number }}</td>
<td>{{ row.get_order_status_display }}</td>
<td>{{ row.goods.goods_name }}</td>
<td>{{ row.goods.goods_price }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
<div class="container-fluid" style="color: #b2bcc5;margin-top: 20px;margin-bottom: 2px">
<div class="row">
<div class="col-md-12 text-center" style="padding: 40px">
Copyright © 2019-2020 藍(lán)色旗幟 版權(quán)所有
<a target="_blank_" style="color:#b2bcc5;">豫ICP備19014367號(hào)-1</a>
</div>
</div>
</div>
</body>
</html>
views.py :(訂單列表部分邏輯代碼)
def order_list(request):
order_obj = models.Order.objects.all()
return render(request, 'order_list.html', {'order_obj': order_obj})
截圖:
三. 支付項(xiàng)目的部署
1. 項(xiàng)目部署環(huán)境
- 系統(tǒng):CentOS 7
- Python版本:python 3.7.3
- Django版本:Django 2.2.5
2. 安裝python3
① 解決依賴關(guān)系
[root@instance-mtfsf05r ~]# yum update [root@VM_39_157_centos ~]# yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
② 下載python3的源代碼
[root@VM_39_157_centos ~]# wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz ,或 [root@instance-mtfsf05r ~]# wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
③ 解壓縮源代碼
[root@instance-mtfsf05r ~]# tar zxvf Python-3.7.3.tgz -C ./ 或 [root@instance-mtfsf05r ~]# xz -d Python-3.4.7.tar.xz [root@instance-mtfsf05r ~]# tar -xf Python-3.4.7.tar
④ 切換進(jìn)入python源代碼目錄
[root@instance-mtfsf05r ~]# cd Python-3.7.3/
⑤ 釋放編譯文件
[root@instance-mtfsf05r Python-3.7.3]# ./configure --prefix=/usr/local/python373
執(zhí)行完這條語(yǔ)句后還不會(huì)生成/usr/local/python373這個(gè)文件夾。./configure是用來(lái)檢測(cè)安裝平題啊的目標(biāo)特征。比如,它會(huì)檢測(cè)你是不是有CC或GCC,它是一個(gè)sheel腳本。configure腳本執(zhí)行后,會(huì)生成一個(gè)Makefile文件。
./configure:是當(dāng)前文件夾下面的configure文件(綠色的文件表示可執(zhí)行文件)
./configure --prefix=/usr/local:釋放腳本文件,指明安裝路徑。
執(zhí)行后會(huì)檢查依賴問(wèn)題,如果依賴沒(méi)解決好,就會(huì)有各種報(bào)錯(cuò)。
⑥ 編譯與安裝
[root@instance-mtfsf05r Python-3.7.3]# make [root@instance-mtfsf05r Python-3.7.3]# make install
這兩步完成后才會(huì)創(chuàng)建/usr/local/python373這個(gè)文件夾。make是用來(lái)編譯的,它從Makefile中讀取指令,然后編譯。make install是用來(lái)安裝的,它也會(huì)從Makefile中讀取指令,安裝到指定的位置。
這兩句也可以一句執(zhí)行:make && make install,表示make執(zhí)行成功之后,才會(huì)執(zhí)行make install命令。make命令執(zhí)行的時(shí)候,就會(huì)調(diào)Makefile開(kāi)始編譯。
⑦ 配置軟鏈接,快捷啟動(dòng)python3和pip3(如果選擇配置軟鏈接, 請(qǐng)忽略⑧⑨ )
[root@instance-mtfsf05r bin]# ln -s /usr/local/python373/bin/python3 /usr/bin/python3 [root@instance-mtfsf05r bin]# ln -s /usr/local/python373/bin/pip3 /usr/bin/pip3 [root@instance-mtfsf05r ~]# pip3 install --upgrade pip
pip3 install --upgrade pip的意思是:通過(guò)pip3 install 這個(gè)命令去升級(jí)pip
如果想要直接執(zhí)行python就使用python3可以執(zhí)行下面的操作:
[root@instance-mtfsf05r ~]# cd /usr/bin [root@instance-mtfsf05r bin]# mv python python.backup [root@instance-mtfsf05r bin]# ln -s /usr/local/bin/python3.7 /usr/bin/python
⑧ 配置系統(tǒng)環(huán)境變量,加入python3的目錄(與⑦ 任選其一種方式)
第一種方式: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/python3/bin/
第二種方式: PATH=$PATH:/usr/local/python3/bin/
配置環(huán)境變量需要謹(jǐn)慎,如果配錯(cuò)了,其它命令也會(huì)丟失。
⑨ 寫(xiě)入個(gè)人配置文件,永久生效
編輯配置文件: [root@instance-mtfsf05r bin]# vim /etc/profile
將PATH寫(xiě)入到配置文件中: PATH=$PATH:/usr/local/python3/bin/ (可以放到最后一行)
讀取配置文件,生效配置: [root@instance-mtfsf05r bin]# source /etc/profile
2. 安裝django
[root@instance-mtfsf05r ~]# pip3 install django
注意:項(xiàng)目依賴的第三方庫(kù)也都要安裝到系統(tǒng)中。
3. 啟動(dòng)支付寶項(xiàng)目
啟動(dòng)項(xiàng)目之前需要修改django配置文件(settings.py)修改為所有主機(jī)都可以訪問(wèn),這是為了防止項(xiàng)目不能被訪問(wèn):
ALLOW_HOST = ['*'] [root@instance-mtfsf05r ~]# cd alipay_django/ [root@instance-mtfsf05r alipay_django]# python3 manage.py runserver 0.0.0.0:5000
網(wǎng)頁(yè)訪問(wèn)不到的解決方案:1. iptables -F:清空規(guī)則;2. setenforce 0:把兩個(gè)防火墻都關(guān)閉。
可能用到的linux命令:
查找被占用的端口: netstat -tln | grep 8000
查看被占用端口的PID: lsof -i:8000
kill掉該進(jìn)程: kill -s -9 32290

四. 支付案例的總結(jié)
1. 案例的下載
github: https://github.com/ThanlonSmith/alipay_django
2. 服務(wù)器宕機(jī)問(wèn)題(面試)
用戶支付完成后,支付寶剛剛返回支付完成的信息時(shí),但服務(wù)器卻宕機(jī)了。要知道這個(gè)時(shí)候,我們系統(tǒng)的訂單支付狀態(tài)還沒(méi)更新呢,該如何解決?其實(shí)不用過(guò)多擔(dān)心的,實(shí)際上如果支付寶沒(méi)有收到返回結(jié)果,會(huì)不時(shí)間隔一段時(shí)間在24小時(shí)之內(nèi)不停地向我們的服務(wù)器發(fā)送請(qǐng)求。如果服務(wù)器在24小時(shí)之內(nèi)運(yùn)行起來(lái)了,還是可以更新我們的訂單支付狀態(tài)的。但是,如果超過(guò)24小時(shí),就只能自己修改站內(nèi)的訂單狀態(tài)信息了。還有,可以在程序代碼中看到有這樣一行代碼 return HttpResponse('success') ,這其實(shí)再告訴支付寶,我們網(wǎng)站已經(jīng)收到信息,不用再發(fā)請(qǐng)求了,這是支付寶的一種檢測(cè)機(jī)制。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 添加用戶設(shè)置密碼并發(fā)郵件給root用戶
這篇文章主要介紹了python 添加用戶設(shè)置密碼并發(fā)郵件給root用戶的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
詳解pandas.DataFrame.plot() 畫(huà)圖函數(shù)
這篇文章主要介紹了詳解pandas.DataFrame.plot()畫(huà)圖函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
python爬取企查查企業(yè)信息之selenium自動(dòng)模擬登錄企查查
這篇文章主要介紹了python爬取企查查企業(yè)信息之自動(dòng)模擬登錄企查查以及selenium獲取headers,selenium獲取cookie,需要的朋友可以參考下2021-04-04
python如何遍歷指定路徑下所有文件(按按照時(shí)間區(qū)間檢索)
這篇文章主要給大家介紹了關(guān)于python如何遍歷指定路徑下所有文件(按按照時(shí)間區(qū)間檢索)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python?jieba庫(kù)的安裝詳細(xì)圖文教程
jieba庫(kù)的作用主要用于中文分詞,是一種不錯(cuò)的中文分詞組件,下面這篇文章主要給大家介紹了關(guān)于Python?jieba庫(kù)安裝的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03

