1、前期作業
- 進行專案之前我們需要一個支付寶的沙箱環境,進入沙箱環境的網址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

- 設定密鑰的方式需要下載以支付寶生成密鑰工具:工具包的地址及提取碼:
鏈接:https://pan.baidu.com/s/1AXK3s4SBowNp1K47Qc1QHw
提取碼:2u04
運行.exe檔案

- 復制my_private_key.pem的內容,并且保證里面不含有空格和換行等字符;將復制的內容再填入第一張圖中的RSA2密鑰的設定中,會生成支付寶公鑰并復制存放在alipay_public_key.pem檔案中
python SDK工具包下載(坑的不得了)
- 在下載的程序中,支付寶官方提供了SDK工具包,在cmd命令列中運行:pip install alipay-sdk-pythoon,如果在下載的程序中沒有出現錯誤,那你就是幸運兒;如果你報錯了,那么恭喜你已經入坑了,別急,我既然這么說了,就有幫你解決問題的能力,

在你下載的程序中肯定會遇到上述這樣的情況,下載sdk的時候,需要上面紅框內的三個依賴包,第一個和第二個你有可能自己去pip下載,或者他幫你已經下載好了,但是第三個包好像是下載不了,經過我大量的搜索,好像是下載另外一個類似于這樣的包,這個包是他的延申——pycryptodome,所以你得去pip install pycryptodome了,但是在你下載這個包的時候,還是會報上面一樣的錯誤,所以支付寶開發者平臺給我們提供的SDK包是無法下載的,
- 問題解決:經我翻天覆地的搜索,無意中看到了另外一種下載方式,這一種方式就是使用了pycryptodome這個依賴包,那么你就可以直接下載了:
pip install python-alipay-sdk
這種下載就會沒錯了,
創建專案app
- 進入專案目錄下運行:python manage.py startapp payment
- 然后再創建下面圖一樣的目錄(只需要看payment app目錄即可,檔案顏色不用管)將之前保存的私鑰公鑰檔案都粘貼到key的目錄下

- 這里就省略主url配置了,直接進入子url配置了
- urls.py檔案
from django.urls import path from . import views app_name = '[payment]' urlpatterns = [ path("alipay/", views.AliPayView.as_view(), name="alipay"), # 支付寶支付 path("check_pay/", views.CheckPayView.as_view(), name="check_pay"), # 驗證支付是否完成 ]
- 視圖檔案就很重頭戲了
- 分別創建這兩個類了,另外在類的外部先定義好Alipay的物件,相信大家已經看過很多Alipay物件的創建了,他們初始化物件的引數是不一樣的,因為他們是沒有下載SDK工具包,所以應該都是去github上復制了一份別人封裝的alipay的工具包,所以在使用物件呼叫方法是有些是不一樣的,如果你下載了SDK工具包,按照我的步驟就不會錯的,還有不能一味的跟著別人的代碼敲,多看看里面的原始碼以及他的實作方式,廢話不多說,上代碼了(這里我一部分一部分寫,這樣有助于理解,也讓自己增強記憶,但都是同一個views.py檔案中)P
- 第一步就是初始化我們的Alipay類的物件,首先先看下Alipay類的原始碼,他是繼承了BasePay類,所以直接看BasePay類的原始碼,我這里直接去當前使用并且中的地方,方式:AliPay——>BaseAliPay——>查看他的__init__初始化方法,主要看我添加注釋的地方,似乎不是加載應用私鑰檔案和支付寶公鑰檔案,最后一句是呼叫了加載這兩種檔案的方法——>_load_key方法,里面的注釋很重要,這里不復制,主要講述的內容是我們需要pem檔案格式的內容,而在檔案頭和檔案尾都需要添加----- 描述性語言 -----,瀏覽_load_key方法的時候就會知道為什么需要pem檔案和檔案頭和檔案尾的樣式,然后在讀取檔案時也需要像下面這樣讀取,當然如果你能保證獲取的內容相同,讀取檔案的方式可以不一致,
def __init__( self, appid, app_notify_url, app_private_key_string=None, alipay_public_key_string=None, sign_type="RSA2", debug=False ): """ 初始化: alipay = AliPay( appid="", app_notify_url="http://example.com", sign_type="RSA2" ) """ self._appid = str(appid) self._app_notify_url = app_notify_url # 就是my_private_key.pem里面的內容 self._app_private_key_string = app_private_key_string # 就是alipay_public_key.pem里面的內容 self._alipay_public_key_string = alipay_public_key_string self._app_private_key = None self._alipay_public_key = None if sign_type not in ("RSA", "RSA2"): raise AliPayException(None, "Unsupported sign type {}".format(sign_type)) self._sign_type = sign_type if debug is True: self._gateway = "https://openapi.alipaydev.com/gateway.do" else: self._gateway = "https://openapi.alipay.com/gateway.do" # load key file immediately # 這里很關鍵,也是重點 self._load_key()AliPay初始化方法__init__
from alipay import AliPay my_private_key = "" alipay_public_key = "" with open("./payment/key/my_private_key.pem") as f1: for read in f1.readlines(): my_private_key += read with open("./payment/key/alipay_public_key.pem") as f2: for read in f2.readlines(): alipay_public_key += read alipay = AliPay(appid='2016102100732430', app_notify_url='http://127.0.0.1:8000/payment/check_pay/', app_private_key_string=my_private_key, alipay_public_key_string=alipay_public_key, debug=True)
-
- 這個時候我們可以在前端發出一個請求,像發出類似支付這樣的請求,前端拿到這樣的地址,做一個重定向,
class AliPayView(ListAPIView): # 這里只是定義一個全域的訂單號 order_id = None def get(self, request): """ 請求獲取支付寶的支付二維碼 :param request: 獲取的請求 :return: 含有支付二維碼的請求地址 """ all_price = request.GET.get("all_price") AliPayView.order_id = request.GET.get("order_id") params = alipay.api_alipay_trade_page_pay( subject="商品購買", # 收費的名稱 out_trade_no=str(uuid.uuid4()), #商戶的訂單號,唯一,使用uuid比較方便 total_amount=all_price, # 從前端獲取的價格 # 這個很關鍵,這里是支付的時候需要驗證一個請求的地址 return_url="http://127.0.0.1:8000/payment/check_pay/", ) # 支付寶網關的地址:因為是debug=False所以是沙箱的地址 url = alipay._gateway + "?" + params return Response(data=https://www.cnblogs.com/aitiknowledge/p/{"url": url})
-
- 當我們用沙箱支付寶掃碼并且支付成功時,會像服務器發出上面return_url地址的get請求,并且他會攜帶上述的params的引數,而且引數中會有sign的標識,需要使用AliPay物件呼叫簽名驗證的方法verify,他的回傳值是boolean值
class CheckPayView(APIView): def get(self, request): """ 驗證用戶是否支付成功,支付成功就需要修改訂單的狀態, :param request: 獲取的請求 :return: 重定向到訂單頁面 """ params = request.GET.dict() sign = params.pop("sign") if alipay.verify(params, sign): order = Orders.objects.get(pk=AliPayView.order_id) order.status = 2 order.save() return redirect(reverse("operations:order"))
-
- 這樣views.py檔案已經寫完
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158906.html
標籤:Python
上一篇:八、Python入門-例外處理
下一篇:K均值演算法
