支付寶支付(沙箱環境&真實支付)使用詳解---python
支付寶支付(沙箱環境&真實支付)使用詳解---python_騎颱風走的部落格-CSDN部落格_支付寶支付沙箱環境 原文連結:https://blog.csdn.net/qq_52385631/article/details/122902877
0. 前提
a. 這裡我用前後端不分離專案做演示,這個支付方式,不分開發的模式,全部適用。我用電腦網站支付做案例
b. django2..2/python3.6.6
c. 這裡用別人封裝好的sdk,Alipay的sdk不是很好用
d. 最後我會粗略講一下,如果是真實的應用,進行支付的配置,其實就改動幾個地方,模擬支付,就可以變成真實支付
一. 安裝sdk
a. 不清楚sdk是什麼的,我這裡有介紹
skd與api的區別https://blog.csdn.net/qq_52385631/article/details/122851280?spm=1001.2014.3001.5501b. 安裝
pip3 install python-alipay-sdk --upgrade -i https://pypi.douban.com/simple/
二. 公私鑰的配置
a. 掃碼支付寶登入
支付寶登入https://open.alipay.com/platform/home.htm
c. 點選自定義私鑰
d. 公鑰私鑰的介紹:
公鑰是基於私鑰生成的,可解密,但是私鑰不行。
在這裡我們需要配置自己的公鑰,下面會講怎麼生成
e. 支付寶加密軟體的下載(我們要藉助他生成),點選下載安裝即可,注意:安裝路徑不能有空格,不然會有亂碼,
支付寶公私鑰加密工具https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEBps:如果這個連結失效了,你就進入接入文件找
f. 下載安裝包,安裝即可,開啟是這個樣子的,根據步驟,生成自己的公鑰,私鑰
g. 去支付寶沙盒環境裡,生成支付寶公鑰。到此私鑰,支付寶公鑰,生成完成。
這兩個先放在一個自己可以找到的地方,一會我們把他複製到專案中
三. 第三方alipay支付的sdk使用
這個是我從github拉下來的https://gitee.com/yqmc/alipay
a. 點進去之後,找到中文的文件
b.
c. 初始化,我們要根據他的提示生成一個alipay物件,我封裝好了,直接複製用即可
d. 公私鑰的配置
1. 在自己專案的根目錄建立一個files的資料夾,把自己的公鑰支付寶公鑰放進去,txt檔案即可
2. 修改格式,在他們兩個的第一行,都加上頭和尾
支付寶公鑰的頭尾(注意金鑰不能換行,只能一行展示,全部頂格顯示)
-----BEGIN PUBLIC KEY-----
你的支付寶公鑰
-----END PUBLIC KEY-----
私鑰鑰的頭尾(注意金鑰不能換行,只能一行展示)
-----BEGIN RSA PRIVATE KEY-----
你的私鑰
-----END RSA PRIVATE KEY-----
e. alipay生成物件需要的引數,在setting裡配置即可
# 支付寶支付相關配置
import os
ALIPAY_SETTING = {
'ALIPAY_APP_ID': "去剛才的沙箱賬號裡面找自己的APPID", # 應用ID(上線之後需要改成,真實應用的appid)
'APLIPAY_APP_NOTIFY_URL': None, # 應用回撥地址[支付成功以後,支付寶返回結果到哪一個地址下面] 一般這裡不寫,用下面的回撥網址即可
'ALIPAY_DEBUG': False,
# APIPAY_GATEWAY="https://openapi.alipay.com/gateway.do" # 真實閘道器
'APIPAY_GATEWAY': "https://openapi.alipaydev.com/gateway.do", # 沙盒環境的閘道器(上線需要進行修改)
'ALIPAY_RETURN_URL': "http://127.0.0.1:8000/alipay/result/", # 同步回撥網址--用於前端,支付成功之後回撥
'ALIPAY_NOTIFY_URL': "http://127.0.0.1:8000/alipay/result/", # 非同步回撥網址---後端使用,post請求,網站未上線,post無法接收到響應內容,付成功之後回撥
'APP_PRIVATE_KEY_STRING': os.path.join(BASE_DIR, 'files/應用私鑰2048.txt'), # 自己生成的私鑰,這個就是路徑拼接,配置好了,試試能不能點進去
# 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰,********
'ALIPAY_PUBLIC_KEY_STRING': os.path.join(BASE_DIR, 'files/alipay_public'), # 一定要注意,是支付寶給你的公鑰,不是你自己生成的那個
'SIGN_TYPE': "RSA2", # RSA 或者 RSA2 現在基本上都是用RSA2
}
f. alipay物件(匯入setting),我一般把他寫在app的utils.py裡面,這個放的地方隨意
from django.conf import settings
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
# 生成支付alipay物件,以供呼叫
def alipay_obj():
alipay = AliPay(
appid=settings.ALIPAY_SETTING.get('ALIPAY_APP_ID'),
app_notify_url=None, # 預設回撥 url
app_private_key_string=open(settings.ALIPAY_SETTING.get('APP_PRIVATE_KEY_STRING')).read(),
# 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰,
alipay_public_key_string=open(settings.ALIPAY_SETTING.get('ALIPAY_PUBLIC_KEY_STRING')).read(),
sign_type=settings.ALIPAY_SETTING.get('SIGN_TYPE'), # RSA 或者 RSA2
debug=settings.ALIPAY_SETTING.get('ALIPAY_DEBUG'), # 預設 False
verbose=False, # 輸出除錯資料
# config=AliPayConfig(timeout=50) # 可選,請求超時時間
)
return alipay
四. 進行支付
1. 生成支付的路由,只要路由,訪問該路由,支付寶會返回給,我們一個支付頁面
前端:
a. html:
做了一個點選按鈕,ajxa向後端傳送資料,請求成功獲取支付url
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div style="margin: 0 auto">
<h1>看什麼看,快買!</h1>
<img src="{% static '1.png' %}" alt="" style="width: 200px">
<input type="button" id="btn_ajax" value="點我即可購買">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
$(function () {
$("#btn_ajax").click(function () {
$.ajax({
url: '{% url "good_list" %}',
type: 'POST',
dataType: 'JSON',
data: {csrfmiddlewaretoken: '{{ csrf_token }}'},
success: function (res) {
if (res.status === 1) {
// 跳轉到支付連結
location.href = res.url
} else {
}
}
})
})
})
</script>
</body>
</html>
頁面如下
後端:
a. url
path('good_list/', views.good_list_view, name='good_list'),
b. view
from django.shortcuts import render
from app03.utils import alipay_obj
from django.conf import settings
from django.http import JsonResponse
# Create your views here.
def good_list_view(request):
if request.method == 'GET':
return render(request, 'good_list.html')
# 如果是post,我們認為是購買
# 示例化一個物件
alipay = alipay_obj()
# 生成支付路由
# 拼接url--返回url
# 電腦網站支付,需要跳轉到:https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
# 這下面的資料,都應該是你資料庫的資料,但是我這裡做測試,直接寫死了
out_trade_no="2016112528123", # 商品訂單號 唯一的
total_amount=995, # 商品價格
subject='表,忙乎?砍一刀否', # 商品的名稱
return_url=settings.ALIPAY_SETTING.get('ALIPAY_RETURN_URL'), # 同步回撥網址--用於前端,付成功之後回撥
notify_url=settings.ALIPAY_SETTING.get('ALIPAY_NOTIFY_URL') # 非同步回撥網址---後端使用,post請求,網站未上線,post無法接收到響應內容
)
# 我這裡大概講一下為什麼要有同步/非同步,因為同步是前端的,
# 如果前端出現頁面崩了,那麼校驗有後端完成,
# 而且在實際開發中,後端一定要校驗,因為前端的校驗,可被修改
url = 'https://openapi.alipaydev.com/gateway.do' + '?' + order_string
return JsonResponse({'url': url, 'status': 1})
2. 成功的支付頁面如下
a. 如果點擊出現,以下頁面,是正常的,開啟一個無痕瀏覽器視窗即可,一般在瀏覽器的右上角
b. 支付頁面,
c. 去支付寶的沙箱環境,找到,自己的賬號密碼,輸入,點選下一步
d. 輸入支付密碼
e. 支付成功
f. 注意看,支付成功之後,他的跳轉路由,是我們配置的同步呼叫路由,我們在前面說,同步呼叫路由是前端的,現在證實了,
另外注意一下,它的引數,有個印象,接下來有用
到此,支付全部完成
五. 同步呼叫----後端進行校驗
a. url(這路由與你配置的同步回撥路由,一定要一致,不然無法進行後續的校驗)
path('alipay/result/', views.check_html_view, name='alipay_result/'),
b. view
def check_html_view(request):
if request.method == "GET":
# 進行校驗,因為支付成功之後,後端是不知道是否成功的,所以需要校驗一下
alipay = alipay_obj()
data = request.GET.dict() # 把get請求的引數轉換成字典
signature = data.pop("sign") # 把sign pop出去
# verification
success = alipay.verify(data, signature) # success ----> True False
# 上面的都是固定用法
if success:
# 如果成功支付了,這個success是True
# 接著寫邏輯了,比如修改當前訂單的狀態
# 我舉一個例子
print('支付成功,後臺已經校驗過了,金幣+1')
return HttpResponse('ok')
return HttpResponse('支付失敗')
六. 非同步回撥,當你前端頁面崩了以後,支付寶會向該路由,傳送post請求,這個是間隔發8次,如果沒有返回success
url 我用同一個路由了,可以選擇,用不同的路由,但是必須是配置的,非同步回撥的路由
path('alipay/result/', views.check_html_view, name='alipay_result/'),
view
def check_html_view(request):
if request.method == "GET":
# 進行校驗,因為支付成功之後,後端是不知道是否成功的,所以需要校驗一下
alipay = alipay_obj()
data = request.GET.dict() # 把get請求的引數轉換成字典
signature = data.pop("sign") # 把sign pop出去
# verification
success = alipay.verify(data, signature) # success ----> True False
if success:
# 如果成功支付了,這個success是True
# 接著寫邏輯了,比如修改當前訂單的狀態
# 我舉一個例子
print('支付成功,後臺已經校驗過了,金幣+1')
return HttpResponse('ok')
return HttpResponse('支付失敗')
# post 請求非同步回撥校驗,最後一定要返回一個success
alipay = alipay_obj()
data = request.GET.dict()
signature = data.pop("sign")
# verification
success = alipay.verify(data, signature) # True False
if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
print('支付成功,後臺已經校驗過了,金幣+1')
return HttpResponse('success')
return HttpResponse('支付失敗')
ps. 真實應用支付配置
1. 修改支付閘道器,帶dev的是測試閘道器
a. 修改支付成功拼接的url(無dev)
# 電腦網站支付,需要跳轉到:https://openapi.alipay.com/gateway.do? + order_string
b. 修改settings配置的支付閘道器
APIPAY_GATEWAY="https://openapi.alipay.com/gateway.do" # 真實閘道器