支付寶支付功能
阿新 • • 發佈:2018-11-08
前期準備
首先我們需要獲得支付寶提供的許可權與介面,在螞蟻開放平臺進行相關申請:https://openhome.alipay.com/platform/appDaily.htm?tab=info
申請支付寶賬戶許可權
建立應用
沙箱測試環境
appID:我的身份
支付寶閘道器:測試環境
獲得相關的測試賬號
商戶賬號、客戶賬號後面可以通過這兩個賬號來進行測試
沙箱錢包(也可以不下載,直接在網頁上登陸測試賬號進行支付測試)
在安卓手機上進行安裝
獲得SDK(pay.py)
就是加密演算法
SDK(加密演算法,阿里沒有提供python版本,從github山獲得)
官方
GIHUB(請注意瀏覽原始碼)——pay.py(依賴:pip install pycryptodome)
公鑰私鑰
在這裡下載
執行
生成公鑰私鑰
完成上傳
應用公鑰上傳後自動生成支付寶公鑰
在django檔案中進行替換成自己的key
django程式
演示
1.執行
2.訪問去支付
3.支付頁面
4.登陸測試使用者,完成支付
最終跳轉到
說明功能正常
Django實現
程式碼結構
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"