支付寶支付成功異步回調驗籤以及注意事項(附源碼)

1. 吐槽:

做微信支付的時候抽時間去看了支付寶支付,發現支付寶支付好簡單,有官方給的SDK直接調用就OK,但是真正做起來才發現實在是太想當然了,微信app支付就那麼幾個接口,而且輸入輸出驗籤都寫得很詳細,但是支付寶開始做才發現文檔實在是太多了,說不定就從哪跳轉到了另外一個地方,尤其做到異步調用這裏,文檔簡直不要太不詳細,其實最主要就是封裝的SDK沒有文檔,找不到驗籤的方法.

2. 要注意的點:

  1. notify_url
    notify_url = "https://www.xxx.com/****/******/callback/",這裏的url要注意看你的項目中最後的"/"是否需要加,有的斜槓不加是會報錯的

  2. 異步通知中,要進行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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章