Django - 實現支付寶支付介面(沙箱環境)
阿新 • • 發佈:2018-12-29
目錄
二、基於Django的支付Demo - 非官方,需pycryptodome模組
2-4 本地回撥頁面 - 處理支付寶回撥資訊 API官方文件
注意事項
- 沙箱支付測試,移動端只能使用安卓測試
- 只有將專案部署在公網IP上,才能實現支付寶支付後的回撥頁面
- 注意原始碼需要使用Crypto模組,預設資料夾小寫存在查詢不到錯誤
- 若在支付寶回撥頁面時,本地伺服器宕機,支付寶會在24小時內一段時間傳送一次請求,若超過24小時則無效。
- 支付寶支付成功,支付寶返回get回撥和post回撥,可以基於她來修改訂單狀態
一、支付寶沙箱
1-1 官網入口
1-2 官方沙箱基礎配置
二、基於Django的支付Demo - 非官方,需pycryptodome模組
2-1 頁面A 獲取支付數額,傳送請求到後臺
2-2 頁面A 執行檢視函式
from django.shortcuts import render, redirect, HttpResponse from utils.pay import AliPay import time def ali(): # 沙箱環境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info app_id = "2016092400583356" # 支付寶收到使用者的支付,會向商戶(我)發兩個請求,一個get請求,一個post請求 - 用於表示支付成功or失敗 # POST請求,用於最後的檢測 notify_url = "http://42.56.89.12:80/page2/" # GET請求,用於頁面的跳轉展示 return_url = "http://42.56.89.12:80/page2/" # 私鑰檔案 merchant_private_key_path = "keys/app_private_2048.txt" # 阿里公鑰檔案 alipay_public_key_path = "keys/alipay_public_2048.txt" # 生成一個AliPay的物件 alipay = AliPay( appid=app_id, app_notify_url=notify_url, return_url=return_url, app_private_key_path=merchant_private_key_path, alipay_public_key_path=alipay_public_key_path, # 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰 debug=True, # 預設False, ) return alipay def page1(request): if request.method == "GET": return render(request, 'page1.html') else: money = float(request.POST.get('money')) # 執行支付配置方法,生成一個物件 alipay = ali() # 生成支付的url # query_params:物件呼叫direct_pay query_params = alipay.direct_pay( subject="TEST商品", # 商品簡單描述 out_trade_no="x2" + str(time.time()), # 商戶訂單號 total_amount=money, # 交易金額(單位: 元 保留倆位小數) ) # alipaydev,!!帶著dev的都是沙箱環境!! pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params) print(pay_url) # 朝這個地址發get請求 return redirect(pay_url)
2-3 私鑰和公鑰配置
2-4 本地回撥頁面 - 處理支付寶回撥資訊 API官方文件
def page2(request): alipay = ali() if request.method == "POST": # 檢測是否支付成功 # 去請求體中獲取所有返回的資料:狀態/訂單號 from urllib.parse import parse_qs body_str = request.body.decode('utf-8') print(body_str) post_data = parse_qs(body_str) print('支付寶給我的資料:::---------', post_data) post_dict = {} for k, v in post_data.items(): post_dict[k] = v[0] print('轉完之後的字典', post_dict) sign = post_dict.pop('sign', None) status = alipay.verify(post_dict, sign) print('POST驗證', status) return HttpResponse('POST返回') else: params = request.GET.dict() sign = params.pop('sign', None) status = alipay.verify(params, sign) print('GET驗證', status) return HttpResponse('支付成功')
三、實驗流程