1. 程式人生 > >python實現支付功能2

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"