1、 構造請求數據
商戶通過提供的接口代碼示例,通過代碼示例的規則,程序構造與運算得到sign加密結果以及構造後的請求給支付寶的數據集合。GET方式下是URL地址鏈接,POST方式下是支付寶網關地址及參數集合。
2、 發送請求數據
把構造完成的數據集合,通過頁面鏈接跳轉或表單提交的方式傳遞給支付寶。
3、 請求的交易
支付寶得到這些集合後,會先做安全校驗等驗證,一系列驗證通過後便會處理完成這次發送過來的數據請求。
4、 返回相應數據
支付寶對處理完成的交易,程序上自動進行重新構造成URL地址鏈接,以自動跳轉的方式跳回商家在請求時設定好的頁面路徑地址(參數return_url,商家沒設定,則不會跳回)。
5、 對相應的數據進行處理
商家的返回頁面(參數return_url指定頁面文件)得到支付寶返回的數據,把這些數據結合自身網站情況,進行數據處理(如:訂單更新)。
- <%
- /* *
- 功能:支付寶頁面跳轉同步通知頁面
- 版本:3.2
- 日期:2011-03-17
- 說明:
- 以下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
- 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
- //***********頁面功能說明***********
- 該頁面可在本機電腦測試
- 可放入HTML等美化頁面的代碼、商戶業務邏輯程序代碼
- TRADE_FINISHED(表示交易已經成功結束,爲普通即時到帳的交易狀態成功標識);
- TRADE_SUCCESS(表示交易已經成功結束,爲高級即時到帳的交易狀態成功標識);
- //********************************
- * */
- %>
- <%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
- <%@ page import="java.util.*"%>
- <%@ page import="java.util.Map"%>
- <%@ page import="com.alipay.util.*"%>
- <%@ page import="com.alipay.services.*"%>
- <%@ page import="com.alipay.config.*"%>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gbk">
- <title>支付寶頁面跳轉同步通知頁面</title>
- </head>
- <body>
- <%
- //獲取支付寶GET過來反饋信息
- Map<String,String> params = new HashMap<String,String>();
- Map requestParams = request.getParameterMap();
- for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
- String name = (String) iter.next();
- String[] values = (String[]) requestParams.get(name);
- String valueStr = "";
- for (int i = 0; i < values.length; i++) {
- valueStr = (i == values.length - 1) ? valueStr + values[i]
- : valueStr + values[i] + ",";
- }
- //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
- valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
- params.put(name, valueStr);
- }
- //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
- String trade_no = request.getParameter("trade_no"); //支付寶交易號
- String order_no = request.getParameter("out_trade_no"); //獲取訂單號
- String total_fee = request.getParameter("total_fee"); //獲取總金額
- String subject = new String(request.getParameter("subject").getBytes("ISO-8859-1"),"gbk");//商品名稱、訂單名稱
- String body = "";
- if(request.getParameter("body") != null){
- body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "gbk");//商品描述、訂單備註、描述
- }
- String buyer_email = request.getParameter("buyer_email"); //買家支付寶賬號
- String trade_status = request.getParameter("trade_status"); //交易狀態
- //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
- //計算得出通知驗證結果
- boolean verify_result = AlipayNotify.verify(params);
- if(verify_result){//驗證成功
- //////////////////////////////////////////////////////////////////////////////////////////
- //請在這裏加上商戶的業務邏輯程序代碼
- if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
- //判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)
- //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
- //如果有做過處理,不執行商戶的業務程序
- }
- //該頁面可做頁面美工編輯
- out.println("驗證成功<br />");
- out.println("trade_no=" + trade_no);
- //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
- //////////////////////////////////////////////////////////////////////////////////////////
- }else{
- //該頁面可做頁面美工編輯
- out.println("驗證失敗");
- }
- %>
- </body>
- </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)
- <%
- /* *
- 功能:支付寶服務器異步通知頁面
- 版本:3.2
- 日期:2011-03-17
- 說明:
- 以下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
- 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
- //***********頁面功能說明***********
- 創建該頁面文件時,請留心該頁面文件中無任何HTML代碼及空格。
- 該頁面不能在本機電腦測試,請到服務器上做測試。請確保外部可以訪問該頁面。
- 該頁面調試工具請使用寫文本函數logResult,該函數在com.alipay.util文件夾的AlipayNotify.java類文件中
- 如果沒有收到該頁面返回的 success 信息,支付寶會在24小時內按一定的時間策略重發通知
- TRADE_FINISHED(表示交易已經成功結束,通用即時到帳反饋的交易狀態成功標誌);
- TRADE_SUCCESS(表示交易已經成功結束,高級即時到帳反饋的交易狀態成功標誌);
- //********************************
- * */
- %>
- <%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
- <%@ page import="java.util.*"%>
- <%@ page import="com.alipay.util.*"%>
- <%@ page import="com.alipay.services.*"%>
- <%@ page import="com.alipay.config.*"%>
- <%
- //獲取支付寶POST過來反饋信息
- Map<String,String> params = new HashMap<String,String>();
- Map requestParams = request.getParameterMap();
- for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
- String name = (String) iter.next();
- String[] values = (String[]) requestParams.get(name);
- String valueStr = "";
- for (int i = 0; i < values.length; i++) {
- valueStr = (i == values.length - 1) ? valueStr + values[i]
- : valueStr + values[i] + ",";
- }
- //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
- //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
- params.put(name, valueStr);
- }
- //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
- String trade_no = request.getParameter("trade_no"); //支付寶交易號
- String order_no = request.getParameter("out_trade_no"); //獲取訂單號
- String total_fee = request.getParameter("total_fee"); //獲取總金額
- String subject = new String(request.getParameter("subject").getBytes("ISO-8859-1"),"gbk");//商品名稱、訂單名稱
- String body = "";
- if(request.getParameter("body") != null){
- body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "gbk");//商品描述、訂單備註、描述
- }
- String buyer_email = request.getParameter("buyer_email"); //買家支付寶賬號
- String trade_status = request.getParameter("trade_status"); //交易狀態
- //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
- if(AlipayNotify.verify(params)){//驗證成功
- //////////////////////////////////////////////////////////////////////////////////////////
- //請在這裏加上商戶的業務邏輯程序代碼
- //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
- if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
- //判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)
- //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
- //如果有做過處理,不執行商戶的業務程序
- out.println("success"); //請不要修改或刪除
- } else {
- out.println("success"); //請不要修改或刪除
- }
- //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
- //////////////////////////////////////////////////////////////////////////////////////////
- }else{//驗證失敗
- out.println("fail");
- }
- %>