1. 吐槽:
做微信支付的時候抽時間去看了支付寶支付,發現支付寶支付好簡單,有官方給的SDK直接調用就OK,但是真正做起來才發現實在是太想當然了,微信app支付就那麼幾個接口,而且輸入輸出驗籤都寫得很詳細,但是支付寶開始做才發現文檔實在是太多了,說不定就從哪跳轉到了另外一個地方,尤其做到異步調用這裏,文檔簡直不要太不詳細,其實最主要就是封裝的SDK沒有文檔,找不到驗籤的方法.
2. 要注意的點:
-
notify_url
notify_url = "https://www.xxx.com/****/******/callback/"
,這裏的url要注意看你的項目中最後的"/"是否需要加,有的斜槓不加是會報錯的 -
異步通知中,要進行sign驗籤
官方代碼基本都是封裝到類裏的,我找來找去就是找不到那個類,但是找到了它封裝的一個
verify_with_rsa(public_key, message, sign) 函數
3. 導入方法(上代碼)
from alipay.aop.api.util.SignatureUtils import verify_with_rsa
def notify(self, request):
"""
支付寶內部支付完成後,異步通知到這個接口,返回支付寶狀態,同步到數據庫中
"""
"""處理不同得參數,必須返回success"""
# 我這裏是用的Django所以取值使用request.POST,具體怎麼取值取決於使用者的框架
data = request.POST.dict()
# sign, sign_type 都要從數據中取出,否則簽名通不過
sign, sign_type = data.pop('sign'), data.pop('sign_type')
#排序
params = sorted(data.items(), key=lambda e: e[0], reverse=False)
#拼接成字符串
message = "&".join(u"{}={}".format(k, v) for k, v in params).encode()
alipay_public_key = settings.alipay_public_key
try:
if verify_with_rsa(alipay_public_key.encode('utf-8').decode('utf-8'), message, sign):
# 1. 商戶需要驗證該通知數據中的 out_trade_no 是否爲商戶系統中創建的訂單號
# 2. 判斷 total_amount 是否確實爲該訂單的實際金額(即商戶訂單創建時的金額),
# 3. 校驗通知中的 seller_id(或者 seller_email ) 是否爲 out_trade_no 這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
# 4. 驗證 app_id 是否爲該商戶本身。上述 1、2、3、4有任何一個驗證不通過,則表明本次通知是異常通知,務必忽略。在上述驗證通過後商戶必須根據支付寶不同類型的業務通知,正確的進行不同的業務處理,並且過濾重複的通知結果數據。在支付寶的業務通知中,只有交易通知狀態爲 TRADE_SUCCESS 或 TRADE_FINISHED 時,支付寶纔會認定爲買家付款成功
# 1-4的驗證需要自己加
notify_type = data['notify_type'] # 通知類型
trade_status = data['trade_status'] # 訂單狀態
if notify_type == 'trade_status_sync':
pay_success = False
if trade_status == 'TRADE_SUCCESS' or trade_status == 'TRADE_FINISHED':
pay_success = True
if pay_success:
# 如果支付成功一定是success這個單詞,其他的alipay不認
return 'success'
return 'failure'
else:
return 'failure'
except:
return 'failure'