python實現支付功能2
1.html程式碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="static/js/jquery-1.12.4.min.js"></script> <script> $(function () { $('#btn').click(function () { var order_id = "20171123002" var req_data = { order_id: order_id, csrfmiddlewaretoken: "{{ csrf_token }}" } $.post("/pay/", req_data, function (data) { window.open(data.url) }) $.get("/check_pay/?order_id=" + order_id, function (data) { if (0 == data.code) { // 支付成功 alert("支付成功"); location.reload(); } else { alert(data.message) } }) }) }) </script> </head> <body> <input type="button" id="btn" value="支付"> </body> </html>
路由
from django.conf.urls import url,include from django.contrib import admin
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('app_test.urls')), ]
from django.conf.urls import url from . import views urlpatterns=[ url(r"^$",views.index), url(r"^pay/$",views.pay), url(r"^check_pay/$", views.check_pay), ]
檢視函式
from django.shortcuts import render from django.http import JsonResponse from alipay import AliPay import os from django.conf import settings
def index(request): return render(request, "index.html")
def pay(request): order_id = request.POST.get("order_id") # 建立用於進行支付寶支付的工具物件 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 預設回撥url app_private_key_path=os.path.join(settings.BASE_DIR, "app_test/app_private_key.pem"), alipay_public_key_path=os.path.join(settings.BASE_DIR, "app_test/alipay_public_key.pem"), # 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 預設False 配合沙箱模式使用 )
# 電腦網站支付,需要跳轉到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(0.01), # 將Decimal型別轉換為字串交給支付寶 subject="商貿商城", return_url=None, notify_url=None # 可選, 不填則使用預設notify url )
# 讓使用者進行支付的支付寶頁面網址 url = settings.ALIPAY_URL + "?" + order_string
return JsonResponse({"code": 0, "message": "請求支付成功", "url": url})
def check_pay(request): # 建立用於進行支付寶支付的工具物件 order_id = request.GET.get("order_id") alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 預設回撥url app_private_key_path=os.path.join(settings.BASE_DIR, "app_test/app_private_key.pem"), alipay_public_key_path=os.path.join(settings.BASE_DIR, "app_test/alipay_public_key.pem"), # 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰, sign_type="RSA2", # RSA2,官方推薦,配置公鑰的時候能看到 debug=True # 預設False 配合沙箱模式使用 )
while True: # 呼叫alipay工具查詢支付結果 response = alipay.api_alipay_trade_query(order_id) # response是一個字典 # 判斷支付結果 code = response.get("code") # 支付寶介面呼叫成功或者錯誤的標誌 trade_status = response.get("trade_status") # 使用者支付的情況
if code == "10000" and trade_status == "TRADE_SUCCESS": # 表示使用者支付成功 # 返回前端json,通知支付成功 return JsonResponse({"code": 0, "message": "支付成功"})
elif code == "40004" or (code == "10000" and trade_status == "WAIT_BUYER_PAY"): # 表示支付寶介面呼叫暫時失敗,(支付寶的支付訂單還未生成) 後者 等待使用者支付 # 繼續查詢 print(code) print(trade_status) continue else: # 支付失敗 # 返回支付失敗的通知 return JsonResponse({"code": 1, "message": "支付失敗"})
setting.py修改如下:
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
# 支付寶配置引數 ALIPAY_APPID = "你的應用id" ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do"