1. 程式人生 > >Django - 實現支付寶支付介面(沙箱環境)

Django - 實現支付寶支付介面(沙箱環境)

目錄

注意事項

一、支付寶沙箱

1-1 官網入口

 1-2 官方沙箱基礎配置

二、基於Django的支付Demo - 非官方,需pycryptodome模組​

2-1 頁面A 獲取支付數額,傳送請求到後臺​

2-2 頁面A 執行檢視函式

2-3 私鑰和公鑰配置

 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('支付成功')

 三、實驗流程