先理一理一些安全可信區域,支付寶提供商家應用平台(可以理解為商家的移動客戶端)和商家應用管理平台(可以理解為商家的服務端),相對於支付寶平台來說,它通過商家配置在支付寶商家管理平台的公鑰來驗簽服務端發送的消息,這就意味着如果在商戶的應用客戶端上配置私鑰的話是非常不安全和不合理的,這樣也就需要我們把生成簽名的服務放置在商戶應用平台上
1.返回界面用於商戶應用的客戶端使用,應用界面部署在商戶應用平台之上
<% /* * 功能:支付寶頁面跳轉同步通知頁面 說明: 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 //***********頁面功能說明*********** 該頁面可在本機電腦測試 可放入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>
2.通知商戶地址是支付寶發生扣款后不管是成功還是失敗都會進行異步回調的操作,如果沒有成功或者失敗(處理中的狀態),會有輪詢的操作
<% /* * 功能:支付寶服務器異步通知頁面 說明: 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 //***********頁面功能說明*********** 創建該頁面文件時,請留心該頁面文件中無任何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"); } %>
