天天看點

關于支付寶異步通知的那些事

一、如何指定接收異步通知的位址 

    對于支付産生的交易,支付寶會根據原始支付API中傳入的異步通知位址notify_url,通過POST請求的形式将支付結果 作為參數通知到商戶系統。 

    以app支付為例,支付請求中notify_url參數的(如下圖): 

二、異步通知傳回參數介紹 

    支付寶通過POST請求的形式将支付結果作為參數通知到商戶系統。各接口傳回的異步通知參數可能會略有不同,具體請參見支付寶開放平台文檔中各接口的異步通知參數的詳細說明。 

以app支付為例,傳回的異步通知參數如下(以下示例封包僅供參考,實際傳回的詳細封包請以實際傳回為準): 

複制代碼

https:

//api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大樂透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00¬ify_time=2016-07-19 14:10:49&subject=大樂透2.1&sign_type=RSA2&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e

三、異步通知的驗簽 

    為了幫助開發者調用開放接口,我們提供了開放平台服務端sdk和demo,包含JAVA、PHP和.NET三語言版本,封裝了簽名&驗簽、HTTP接口請求等基礎功能。為了避免驗簽出錯強烈建議先下載下傳對應語言版本的SDK并引入您的開發工程進行快速接入。 

   其驗簽步驟為: 

    第一步: 在通知傳回參數清單中,除去sign、sign_type兩個參數外,凡是通知傳回回來的參數皆是待驗簽的參數。 

    第二步: 将剩下參數進行url_decode, 然後進行字典排序,組成字元串,得到待簽名字元串: 

    第三步: 将簽名參數(sign)使用base64解碼為位元組碼串。 

    第四步: 使用RSA的驗簽方法,通過簽名字元串、簽名參數(經過base64解碼)及支付寶公鑰驗證簽名。 

    第五步:在步驟四驗證簽名正确後,必須再嚴格按照如下描述校驗通知資料的正确性。 

    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時,支付寶才會認定為買家付款成功。 

四、無法接收到異步通知怎麼辦 

    自查方案一:[url]https://openclub.alipay.com/read.php?tid=1677&fid=25&page=1[/url]

    自查方案二:[url]https://openclub.alipay.com/read.php?tid=675&fid=2[/url]

五、異步通知中的交易狀态介紹 

   請參考這個詳情文章:[url]https://openclub.alipay.com/read.php?tid=1295&fid=25[/url] 

六、為什麼會重複不斷的收到支付寶的異步通知 

每當交易狀态改變時,伺服器異步通知頁面就會收到支付寶發來的處理結果通知,程式執行完後必須列印輸出success。如果商戶回報給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以内完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h)。 

其中,若退款期限是3個月可退款,支付成功後,支付寶會發送trade_success的支付成功狀态的異步通知,在3個月後支付寶會再次發送trade_finished的交易結束狀态的異步通知,表示交易結束不允許退款。 

  傳回success代碼示例: 

   JAVA:

out.println("success");​      

 PHP:

echo "success";​      

 .NET:

Response.Write("success");​      

 其他開發語言也是直接輸出success即可 

    直接通路你的異步頁面應該是輸出(如下圖)中的success這7個字元 

注意:浏覽器上點選檢視頁面源代碼,看到的是這個7個字元,有空格或者其他字元都會導緻重複收到通知(建議大家做一下簡單的驗證)