1. 程式人生 > >支付寶支付功能

支付寶支付功能

前期準備

首先我們需要獲得支付寶提供的許可權與介面,在螞蟻開放平臺進行相關申請:https://openhome.alipay.com/platform/appDaily.htm?tab=info

申請支付寶賬戶許可權

iHMqr4.png

建立應用

iHMIP0.png

沙箱測試環境

iHM45q.png

appID:我的身份

支付寶閘道器:測試環境

獲得相關的測試賬號

iHQise.png

商戶賬號、客戶賬號後面可以通過這兩個賬號來進行測試

沙箱錢包(也可以不下載,直接在網頁上登陸測試賬號進行支付測試)

iHMoGV.png

在安卓手機上進行安裝

獲得SDK(pay.py)

就是加密演算法

SDK(加密演算法,阿里沒有提供python版本,從github山獲得)

官方

GIHUB(請注意瀏覽原始碼)——pay.py(依賴:pip install pycryptodome)

公鑰私鑰

iHM7xU.png

在這裡下載
iHMXZ9.png

執行
iHMbMF.png

iHMLqJ.png

生成公鑰私鑰
iHMjaR.png

完成上傳

iHMzPx.png

應用公鑰上傳後自動生成支付寶公鑰

在django檔案中進行替換成自己的key

1541664121222

django程式

演示

1.執行

2.訪問去支付

iHMhan.png

3.支付頁面

iHMT2T.png

4.登陸測試使用者,完成支付

iHQpRK.png

iHMvI1.png

最終跳轉到

iHQSG6.png

說明功能正常

Django實現

程式碼結構

iHQ9xO.png

views.py

from django.shortcuts import render,redirect,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from utils.pay import AliPay
import time
from django.conf import settings

def aliPay():
    obj = AliPay(
        appid=settings.APPID,
        app_notify_url=settings.NOTIFY_URL,  # 如果支付成功,支付寶會向這個地址傳送POST請求(校驗是否支付已經完成)
        return_url=settings.RETURN_URL,  # 如果支付成功,重定向回到你的網站的地址。
        alipay_public_key_path=settings.PUB_KEY_PATH,  # 支付寶公鑰
        app_private_key_path=settings.PRI_KEY_PATH,  # 應用私鑰
        debug=True,  # 預設False,
    )
    return obj

def index(request):
    if request.method == 'GET':
        return render(request,'index.html')



    alipay = aliPay()

    # 對購買的資料進行加密
    money = float(request.POST.get('price'))
    out_trade_no = "x2" + str(time.time())
    # 1. 在資料庫建立一條資料:狀態(待支付)

    query_params = alipay.direct_pay(
        subject="充氣式韓紅",  # 商品簡單描述
        out_trade_no= out_trade_no,  # 商戶訂單號
        total_amount=money,  # 交易金額(單位: 元 保留倆位小數)
    )

    pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)

    return redirect(pay_url)


def pay_result(request):
    """
    支付完成後,跳轉回的地址
    :param request:
    :return:
    """
    params = request.GET.dict()
    sign = params.pop('sign', None)

    alipay = aliPay()

    status = alipay.verify(params, sign)

    if status:
        return HttpResponse('支付成功')
    return HttpResponse('支付失敗')



@csrf_exempt
def update_order(request):
    """
    支付成功後,支付寶向該地址傳送的POST請求(用於修改訂單狀態)
    :param request:
    :return:
    """
    if request.method == 'POST':
        from urllib.parse import parse_qs

        body_str = request.body.decode('utf-8')
        post_data = parse_qs(body_str)

        post_dict = {}
        for k, v in post_data.items():
            post_dict[k] = v[0]

        alipay = aliPay()

        sign = post_dict.pop('sign', None)
        status = alipay.verify(post_dict, sign)
        if status:
            # 修改訂單狀態
            out_trade_no = post_dict.get('out_trade_no')
            print(out_trade_no)
            # 2. 根據訂單號將資料庫中的資料進行更新
            return HttpResponse('支付成功')
        else:
            return HttpResponse('支付失敗')
    return HttpResponse('')

settings.py

# 支付相關配置
APPID = "2016082500309412"
NOTIFY_URL = "http://47.106.237.76:80/update_order/"
RETURN_URL = "http://47.106.237.76:80/pay_result/"
PRI_KEY_PATH = "keys/app_private_2048.txt"
PUB_KEY_PATH = "keys/alipay_public_2048.txt"