1.支付寶網頁支付java
String goodsAmount = request.getParameter(); String subject = "童裝"; //把請求參數打包 Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", "alipay.wap.create.direct.pay.by.user");//手機網頁支付 sParaTemp.put("partner", AlipayConfig.partner); sParaTemp.put("seller_id", AlipayConfig.seller_id); sParaTemp.put("_input_charset", AlipayConfig.input_charset); sParaTemp.put("payment_type", AlipayConfig.payment_type); sParaTemp.put("notify_url", AlipayConfig.notify_url); sParaTemp.put("return_url", AlipayConfig.return_url); sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key); sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip); sParaTemp.put("show_url", "www.abc.com"); sParaTemp.put("out_trade_no", recharge.getOrderNo());//調用支付寶以前生成的商品訂單號 sParaTemp.put("subject", subject); sParaTemp.put("total_fee", goodsAmount);//金額 //sParaTemp.put("body", body); /*其餘業務參數根據在線開發文檔,添加參數.文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1 //如sParaTemp.put("參數名","參數值");*/ //創建請求,請求成功支付寶服務器返回一段網頁代碼 String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "確認"); //將這段代碼以網頁形式返回給用戶便可進行支付
配置文件web
package alipay.config; /* * *類名:AlipayConfigApp *功能:基礎配置類 *詳細:設置賬戶有關信息及返回路徑 *版本:3.4 *修改日期:2016-03-08 *說明: *如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓請在這裏配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 合做身份者ID,簽約帳號,以2088開頭由16位純數字組成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String partner = "2088************"; // 收款支付寶帳號,以2088開頭由16位純數字組成的字符串,通常狀況下收款帳號就是簽約帳號 public static String seller_id = partner; // MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String key = "****h2lh2g847h****kuu6fu8cl0****"; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問 public static String notify_url = "http://abc.def.com/"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問 public static String return_url = "http://abc.def.com/"; // 簽名方式 public static String sign_type = "MD5"; // 調試用,建立TXT日誌文件夾路徑,見AlipayCore.java類中的logResult(String sWord)打印方法。 public static String log_path = "C:\\"; // 字符編碼格式 目前支持 gbk 或 utf-8 public static String input_charset = "utf-8"; // 支付類型 ,無需修改 public static String payment_type = "1"; // 調用的接口名,無需修改,即時到帳 public static String service = "create_direct_pay_by_user"; //↑↑↑↑↑↑↑↑↑↑請在這裏配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //↓↓↓↓↓↓↓↓↓↓ 請在這裏配置防釣魚信息,若是沒開通防釣魚功能,爲空便可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 防釣魚時間戳 若要使用請調用類文件submit中的query_timestamp函數 public static String anti_phishing_key = ""; // 客戶端的IP地址 非局域網的外網IP地址,如:221.0.0.1 public static String exter_invoke_ip = ""; //↑↑↑↑↑↑↑↑↑↑請在這裏配置防釣魚信息,若是沒開通防釣魚功能,爲空便可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
notify_url不能帶端口號和參數數組
支付成功後異步回調商家服務器安全
/** * 支付寶異步通知網頁版 */ @RequestMapping("paymentNotifyCallBack") public void paymentNotifyCallBack() { PrintWriter out = null; try { out = response.getWriter(); //獲取支付寶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] + ","; } params.put(name, valueStr); } //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(如下僅供參考)// //商戶訂單號 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); //支付寶交易號 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); //交易狀態 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8"); //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)// if (AlipayNotify.verify(params)) {//驗證成功 if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) { logger.info("支付寶web回調後臺成功......"); Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no); recharge.setUpdateDate(new Date()); recharge.setTradeNo(trade_no);//交易號 recharge.setPayTime(new Date());//付款時間 recharge.setPayStatus(1); recharge.setPayType(1); int flag = rechargeService.update(recharge); if (flag > 0) { logger.info("訂單狀態修改爲功........."); } else { logger.info("訂單狀態修改失敗.........."); } AlipayCore.logResult("notify_url success!"); } } else {//驗證失敗 out.print("fail"); } } catch (Exception e) { logger.info("接收支付寶異步通知出錯:" + e); e.printStackTrace(); } }
同步通知服務器
2.支付寶app支付app
//將參數打包成數組 String[] parameters = { "partner=\"" + AlipayConfigApp.partner + "\"", "seller_id=\"" + AlipayConfigApp.partner + "\"", "out_trade_no=\"" + recharge.getOrderNo() + "\"", "subject=\"童裝\"", "body=\"童裝\"", "total_fee=\"" + String.valueOf(recharge.getRechargeAmount()) + "\"", "notify_url=\"http://zhaopincmbs.fangshangqu.com/recruitcmbs/alipay/notifyCallBackApp.htm\"", "service=\"mobile.securitypay.pay\"", "payment_type=\"1\"", "input_charset=\"utf-8\"" }; //調用支付寶接口 String result = AlipayCoreApp.signAllString(parameters); //將結果返回給客戶端 resultMap.put("data1", result); outJson(resultMap);
異步回調異步
//獲取支付寶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); } //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(如下僅供參考)// try { //商戶訂單號 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); //支付寶交易號 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); //交易狀態 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8"); //異步通知ID String notify_id = request.getParameter("notify_id"); //sign String sign = request.getParameter("sign"); //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)// if (notify_id != "" && notify_id != null) {////判斷接受的post通知中有無notify_id,若是有則是異步通知。 if (AlipayNotifyApp.verifyResponse(notify_id).equals("true"))//判斷成功以後使用getResponse方法判斷是不是支付寶發來的異步通知。 { if (AlipayNotifyApp.getSignVeryfy(params, sign))//使用支付寶公鑰驗籤 { if (trade_status.equals("TRADE_SUCCESS")) { logger.info("支付寶成功......"); //String ... = ... //商戶能夠從params中獲取通知中的數據 //而後進行支付成功後的業務邏輯處理 System.out.println("訂單" + out_trade_no + "支付成功"); logger.info("支付回調後臺成功......"); Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no); recharge.setUpdateDate(new Date()); recharge.setTradeNo(trade_no);//交易號 recharge.setPayTime(new Date());//付款時間 recharge.setPayStatus(1); recharge.setPayType(1); int flag = rechargeService.update(recharge); if (flag > 0) { logger.info("訂單狀態修改爲功........."); } else { logger.info("訂單狀態修改失敗.........."); } //調試打印log AlipayCoreApp.logResult("notify_url success!", "notify_url"); } } else//驗證簽名失敗 { out.print("sign fail"); } } else//驗證是否來自支付寶的通知失敗 { out.print("response fail"); } } else { out.print("no notify message"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); }