支付寶通知頁面notify_url、返回頁面return_url



1、 構造請求數據 
商戶通過提供的接口代碼示例,通過代碼示例的規則,程序構造與運算得到sign加密結果以及構造後的請求給支付寶的數據集合。GET方式下是URL地址鏈接,POST方式下是支付寶網關地址及參數集合。 
2、 發送請求數據 
把構造完成的數據集合,通過頁面鏈接跳轉或表單提交的方式傳遞給支付寶。 
3、 請求的交易 
支付寶得到這些集合後,會先做安全校驗等驗證,一系列驗證通過後便會處理完成這次發送過來的數據請求。 
4、 返回相應數據 
支付寶對處理完成的交易,程序上自動進行重新構造成URL地址鏈接,以自動跳轉的方式跳回商家在請求時設定好的頁面路徑地址(參數return_url,商家沒設定,則不會跳回)。 
5、 對相應的數據進行處理 
商家的返回頁面(參數return_url指定頁面文件)得到支付寶返回的數據,把這些數據結合自身網站情況,進行數據處理(如:訂單更新)。 
Java代碼  收藏代碼
  1. <%  
  2. /* * 
  3.  功能:支付寶頁面跳轉同步通知頁面 
  4.  版本:3.2 
  5.  日期:2011-03-17 
  6.  說明: 
  7.  以下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 
  8.  該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 
  9.  
  10.  //***********頁面功能說明*********** 
  11.  該頁面可在本機電腦測試 
  12.  可放入HTML等美化頁面的代碼、商戶業務邏輯程序代碼 
  13.  TRADE_FINISHED(表示交易已經成功結束,爲普通即時到帳的交易狀態成功標識); 
  14.  TRADE_SUCCESS(表示交易已經成功結束,爲高級即時到帳的交易狀態成功標識); 
  15.  //******************************** 
  16.  * */  
  17. %>  
  18. <%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>  
  19. <%@ page import="java.util.*"%>  
  20. <%@ page import="java.util.Map"%>  
  21. <%@ page import="com.alipay.util.*"%>  
  22. <%@ page import="com.alipay.services.*"%>  
  23. <%@ page import="com.alipay.config.*"%>  
  24. <html>  
  25.   <head>  
  26.         <meta http-equiv="Content-Type" content="text/html; charset=gbk">  
  27.         <title>支付寶頁面跳轉同步通知頁面</title>  
  28.   </head>  
  29.   <body>  
  30. <%  
  31.     //獲取支付寶GET過來反饋信息  
  32.     Map<String,String> params = new HashMap<String,String>();  
  33.     Map requestParams = request.getParameterMap();  
  34.     for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  
  35.         String name = (String) iter.next();  
  36.         String[] values = (String[]) requestParams.get(name);  
  37.         String valueStr = "";  
  38.         for (int i = 0; i < values.length; i++) {  
  39.             valueStr = (i == values.length - 1) ? valueStr + values[i]  
  40.                     : valueStr + values[i] + ",";  
  41.         }  
  42.         //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化  
  43.         valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");  
  44.         params.put(name, valueStr);  
  45.     }  
  46.   
  47.       
  48.     //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//  
  49.     String trade_no = request.getParameter("trade_no");             //支付寶交易號  
  50.     String order_no = request.getParameter("out_trade_no");         //獲取訂單號  
  51.     String total_fee = request.getParameter("total_fee");           //獲取總金額  
  52.     String subject = new String(request.getParameter("subject").getBytes("ISO-8859-1"),"gbk");//商品名稱、訂單名稱  
  53.     String body = "";  
  54.     if(request.getParameter("body") != null){  
  55.         body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "gbk");//商品描述、訂單備註、描述  
  56.     }  
  57.     String buyer_email = request.getParameter("buyer_email");       //買家支付寶賬號  
  58.     String trade_status = request.getParameter("trade_status");     //交易狀態  
  59.   
  60.     //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//  
  61.       
  62.     //計算得出通知驗證結果  
  63.     boolean verify_result = AlipayNotify.verify(params);  
  64.       
  65.     if(verify_result){//驗證成功  
  66.         //////////////////////////////////////////////////////////////////////////////////////////  
  67.         //請在這裏加上商戶的業務邏輯程序代碼  
  68.   
  69.         if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){  
  70.             //判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)  
  71.                 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序  
  72.                 //如果有做過處理,不執行商戶的業務程序  
  73.         }  
  74.           
  75.         //該頁面可做頁面美工編輯  
  76.         out.println("驗證成功<br />");  
  77.         out.println("trade_no=" + trade_no);  
  78.         //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——  
  79.   
  80.         //////////////////////////////////////////////////////////////////////////////////////////  
  81.     }else{  
  82.         //該頁面可做頁面美工編輯  
  83.         out.println("驗證失敗");  
  84.     }  
  85. %>  
  86.   </body>  
  87. </html>  


返回頁面(notify_url文件)工作原理 

即:支付寶主動通知交互模式(支付寶反饋數據) 

前提:若要支付寶能主動通知,需商戶在請求時設定好通知的頁面路徑(參數notify_url),且該頁面文件完全空白,無任何字符。 
1、 發起通知 
一旦交易狀態發生變更(如:買家已付款,等待賣家發貨),支付寶便會根據自動進行數據處理,並主動調用商戶在請求時設定好通知的頁面路徑(參數notify_url) 
2、 對通知數據進行處理 
商戶網站收到支付寶發送過來的通知數據,把這些數據結合自身網站情況,進行數據處理,如:處理返回頁(參數return_url)漏掉的訂單,做訂單更新,即補單措施。 
3、 在頁面上輸出success 
商戶網站處理完成所有的數據處理以後,即程序運行最後,返回寫頁面“success”這7個字符(頁面上只允許輸出success),以表示自己已經成功處理完成自己的業務。 
4、 完成處理該次通知,不再發送通知 
支付寶得到商戶反饋回來的“success”7個字符信息,進行覈對與驗證,結束此次通知流程。 
注意: 
如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。在25小時內完成6~10次通知(通知頻率:5s,2m,10m,15m,1h,2h,6h,15h) 
Java代碼  收藏代碼
  1. <%  
  2. /* * 
  3.  功能:支付寶服務器異步通知頁面 
  4.  版本:3.2 
  5.  日期:2011-03-17 
  6.  說明: 
  7.  以下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 
  8.  該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 
  9.  
  10.  //***********頁面功能說明*********** 
  11.  創建該頁面文件時,請留心該頁面文件中無任何HTML代碼及空格。 
  12.  該頁面不能在本機電腦測試,請到服務器上做測試。請確保外部可以訪問該頁面。 
  13.  該頁面調試工具請使用寫文本函數logResult,該函數在com.alipay.util文件夾的AlipayNotify.java類文件中 
  14.  如果沒有收到該頁面返回的 success 信息,支付寶會在24小時內按一定的時間策略重發通知 
  15.  TRADE_FINISHED(表示交易已經成功結束,通用即時到帳反饋的交易狀態成功標誌); 
  16.  TRADE_SUCCESS(表示交易已經成功結束,高級即時到帳反饋的交易狀態成功標誌); 
  17.  //******************************** 
  18.  * */  
  19. %>  
  20. <%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>  
  21. <%@ page import="java.util.*"%>  
  22. <%@ page import="com.alipay.util.*"%>  
  23. <%@ page import="com.alipay.services.*"%>  
  24. <%@ page import="com.alipay.config.*"%>  
  25. <%  
  26.     //獲取支付寶POST過來反饋信息  
  27.     Map<String,String> params = new HashMap<String,String>();  
  28.     Map requestParams = request.getParameterMap();  
  29.     for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  
  30.         String name = (String) iter.next();  
  31.         String[] values = (String[]) requestParams.get(name);  
  32.         String valueStr = "";  
  33.         for (int i = 0; i < values.length; i++) {  
  34.             valueStr = (i == values.length - 1) ? valueStr + values[i]  
  35.                     : valueStr + values[i] + ",";  
  36.         }  
  37.         //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化  
  38.         //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");  
  39.         params.put(name, valueStr);  
  40.     }  
  41.   
  42.   
  43.       
  44.     //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//  
  45.   
  46.     String trade_no = request.getParameter("trade_no");             //支付寶交易號  
  47.     String order_no = request.getParameter("out_trade_no");         //獲取訂單號  
  48.     String total_fee = request.getParameter("total_fee");           //獲取總金額  
  49.     String subject = new String(request.getParameter("subject").getBytes("ISO-8859-1"),"gbk");//商品名稱、訂單名稱  
  50.     String body = "";  
  51.     if(request.getParameter("body") != null){  
  52.         body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "gbk");//商品描述、訂單備註、描述  
  53.     }  
  54.     String buyer_email = request.getParameter("buyer_email");       //買家支付寶賬號  
  55.     String trade_status = request.getParameter("trade_status");     //交易狀態  
  56.       
  57.     //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//  
  58.   
  59.     if(AlipayNotify.verify(params)){//驗證成功  
  60.         //////////////////////////////////////////////////////////////////////////////////////////  
  61.         //請在這裏加上商戶的業務邏輯程序代碼  
  62.   
  63.         //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——  
  64.           
  65.         if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){  
  66.             //判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)  
  67.                 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序  
  68.                 //如果有做過處理,不執行商戶的業務程序  
  69.               
  70.             out.println("success"); //請不要修改或刪除  
  71.         } else {  
  72.             out.println("success"); //請不要修改或刪除  
  73.         }  
  74.   
  75.         //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——  
  76.   
  77.         //////////////////////////////////////////////////////////////////////////////////////////  
  78.     }else{//驗證失敗  
  79.         out.println("fail");  
  80.     }  
  81. %>  
發佈了8 篇原創文章 · 獲贊 13 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章