1. 程式人生 > 其它 >支付寶支付(沙箱環境&真實支付)使用詳解---python

支付寶支付(沙箱環境&真實支付)使用詳解---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

b. 進入沙箱環境

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"   # 真實閘道器

2. 修改appid,修改成,真實應用的appid即可