1.掃碼,注冊信息
2.點擊沙箱
3.自定義密鑰選擇RSA2密鑰,加簽內容配置
4.通過支付寶開發平台開發助手,生成密鑰
4.1下載支付寶開發平台開發助手:https://opendocs.alipay.com/common/02kipl
4.2生成公鑰和私鑰文件
4.3把文件中的公鑰和私鑰進行配置,就完成了
5.通過提供的商家和買家進行支付
6.創建一個公共的配置文件
package com.jack.all.common; import java.io.FileWriter; import java.io.IOException; public class AlipayConfig { // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號,開發時使用沙箱提供的APPID,生產環境改成自己的APPID public static String APP_ID = ""; //測試 // 商戶私鑰,您的PKCS8格式RSA2私鑰 public static String APP_PRIVATE_KEY = ""; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 public static String ALIPAY_PUBLIC_KEY = ""; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String notify_url = "http://localhost:8081/orders/notifyUrl"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問(其實就是支付成功后返回的頁面) // public static String return_url = "http://localhost:8081/orders/returnUrl"; public static String return_url = "http://localhost:8081/orders/returnUrl"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String CHARSET = "UTF-8"; // 支付寶網關,這是沙箱的網關 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; //測試 // 支付寶網關 public static String log_path = "E:\\"; /** * 寫日志,方便測試(看網站需求,也可以改成把記錄存入數據庫) * @param sWord 要寫入日志里的文本內容 */ public static void logResult(String sWord) { FileWriter writer = null; try { writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis() + ".txt"); writer.write(sWord); } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
7.創建一個測試用到的方法
package com.jack.all.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayTradePagePayRequest; import com.jack.all.common.AlipayConfig; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @Controller @RequestMapping(value="/Alipay") public class AlipayController { /** * 購物車 * * @return */ @RequestMapping(value = "/Shopcart") public String Shopcart() { return "pay"; } /** * 結算界面 * @return */ @ResponseBody @RequestMapping(value = "/PayPage") public String payController (HttpServletRequest request, HttpServletResponse response) throws IOException { //獲得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.sign_type); //設置請求參數 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AlipayConfig.return_url);//支付成功后的跳轉界面 alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//支付成功后的回調地址 //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 String out_trade_no = request.getParameter("Order"); //付款金額,必填 ShopName String total_amount = request.getParameter("Money"); //訂單名稱,必填 String subject = request.getParameter("Name"); //商品描述,可空 String body =request.getParameter("購物測試"); // 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。 String timeout_express = "1c"; alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"timeout_express\":\""+ timeout_express +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //請求 String url = ""; try { url = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單 /* response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); response.getWriter().write(url); // 直接將完整的表單html輸出到頁面 response.getWriter().flush(); response.getWriter().close();*/ } catch (AlipayApiException e) { e.printStackTrace(); } System.out.println(url); return url; } /** * 同步跳轉 * * @param request * @throws Exception */ @ResponseBody @RequestMapping("/returnUrl") public ModelAndView returnUrl(HttpServletRequest request) throws Exception { ModelAndView mav = new ModelAndView(); // 獲取支付寶GET過來反饋信息(官方固定代碼) Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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); } boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.sign_type); // 調用SDK驗證簽名 // 返回界面 if (signVerified) { System.out.println("前往支付成功頁面"); mav.setViewName("Shopcart"); } else { System.out.println("前往支付失敗頁面"); mav.setViewName("failReturn"); } return mav; } /** * 支付寶服務器異步通知 * * @param request * @throws Exception */ @ResponseBody @RequestMapping("/notifyUrl") public void notifyUrl(HttpServletRequest request) throws Exception { // 獲取支付寶GET過來反饋信息 Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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); } boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.sign_type); // 調用SDK驗證簽名 if (signVerified) { // 驗證成功 更新訂單信息 System.out.println("異步通知成功"); // 商戶訂單號 String out_trade_no = request.getParameter("out_trade_no"); // 交易狀態 String trade_status = request.getParameter("trade_status"); // 修改數據庫 } else { System.out.println("異步通知失敗"); } } }
8.測試用的pay.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>沙箱下單測試</title> </head> <body> <div> <form action="http://localhost:8081/Alipay/PayPage" method="post"> <div> 訂單號:<input name="Order" value="20592155879901" ></input> </div> <div> 商品名稱:<input name="Name" value="筆記本電腦"></input> </div> <div> 金額:<input name="Money" value="99.99"></input>元 </div> <input type="submit" value="提交訂單"></input> </form> </div> </body> </html>
二、重點:是前后端分離用
$.get("http://localhost:8081/orders/PayPage?id=" + data.id, function (data) { $("body").html(data); })