1.首先是創建應用,我創建的是網頁移動應用
2.設置接口加簽方式

3.點擊設置,可能會獲取驗證碼,輸入驗證碼,然后彈出框看得到有個支付寶密鑰生成器字樣點擊下載,然后安裝,生成私鑰和公鑰

4.復制公鑰到這里來,粘貼,保存設置

4.提交審核

5.等待審核通過。。。。。。。
6.下載alipay的sdk,我這里直接maven方式導入
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.8.73.ALL</version> </dependency>
7.支付配置類
public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號 public static String app_id = "20191107690...."; // 商戶私鑰,您的PKCS8格式RSA2私鑰 public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0......"; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0......"; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String notify_url = "http://127.0.0.1:8080/returnUrl"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String return_url = "http://127.0.0.1:8080/returnUrl"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String charset = "utf-8"; // 支付寶網關 public static String gatewayUrl = "https://openapi.alipay.com/gateway.do"; // 支付寶網關 public static String log_path = "C:\\"; //↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
注意:配置類里的merchant_private_key(對應第4步上面那欄秘鑰字符串)和alipay_public_key(對應第4步下面那欄秘鑰字符串),
8.手機wap頁面(瀏覽器應用,套殼安卓app都可以)喚起支付寶代碼如下,直接返回,會跳轉到支付寶的支付頁,頁面不用自己寫,然后詢問是否打開支付寶
@RequestMapping("/test")
@ResponseBody
public String test(Integer id, HttpServletRequest request) throws Exception{
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
AlipayConfig.merchant_private_key,
"json", AlipayConfig.charset,
AlipayConfig.alipay_public_key,
AlipayConfig.sign_type); //獲得初始化的AlipayClient
String authOrderid = new SimpleDateFormat("yyyyMMdd").format(new Date()) + System.currentTimeMillis();
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//創建API對應的request
//alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
alipayRequest.setReturnUrl(request.getScheme() + "://" + request.getLocalAddr() + ":" + request.getServerPort() + "/alipay/payResult");//返回地址,如:通知支付成功
alipayRequest.setNotifyUrl("http://2y819821x1.zicp.vip/payResult");//在公共參數中設置回跳和通知地址
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\"" + authOrderid + "\"," + //訂單號
" \"total_amount\":\"0.01\"," + // 支付價格
" \"subject\":\"" + URLEncoder.encode("配送員押金","utf-8") + "\"," + // 商品信息
" \"product_code\":\"QUICK_WAP_PAY\"" +
" }");//填充業務參數
String result="";
try {
result = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單
// AlipayTradeWapPayResponse pageExecute = alipayClient.pageExecute(alipayRequest);
// AlipayTradeWapPayResponse execute = alipayClient.execute(alipayRequest);
// result = alipayClient.sdkExecute(alipayRequest).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return result;
}
9.app喚起支付寶,這里返回的是一串get形式的參數不帶host,意思是只有一個url問號?后面的參數,但是這不足以喚起支付寶需要與前端配合,具體怎么喚起看支付寶文檔
@RequestMapping("/toAlipay")
@ResponseBody
public AjaxResult toAlipay(HttpServletRequest request) throws Exception {
// 獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
AlipayConfig.merchant_private_key, "json", AlipayConfig.charset,
AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
String authOrderid = new SimpleDateFormat("yyyyMMdd").format(new Date()) + System.currentTimeMillis();
AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();// 創建API對應的request
// 參數設置
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("body");
model.setSubject("阿甘配送員押金");
// 請保證OutTradeNo值每次保證唯一
model.setOutTradeNo(authOrderid);
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
alipayRequest.setBizModel(model);
alipayRequest.setNotifyUrl("http://www.moxikilox.com:8081/api/payResult");
String result = "";
Map<String, Object> map = new HashMap<>();
map.put("orderid", authOrderid);
try {
AlipayTradeAppPayResponse sdkExecute = alipayClient.sdkExecute(alipayRequest);
result = sdkExecute.getBody();
map.put("orderinfo", result);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return AjaxResult.success("操作成功", map);
}
10.異步回調操作,驗證支付狀態,以及支付金額,一定注意,異步回調地址(NotifyUrl)必須公網,我代碼里是用花生殼做了內網映射請求到我電腦的,返回地址(ReturnUrl)支付寶標明必須公網,但是可以是局域網地址,只要返回的頁面和你手機網絡在同一局域網內就行!
/** * 異步 交易驗證 */ @RequestMapping("/payResult") public String payResult(HttpServletRequest request, HttpServletResponse response) { // 1.從支付寶回調的request域中取值 // 獲取支付寶返回的參數集合 Map<String, String[]> aliParams = request.getParameterMap(); // 用以存放轉化后的參數集合 Map<String, String> conversionParams = new HashMap<String, String>(); for (Iterator<String> iter = aliParams.keySet().iterator(); iter.hasNext();) { String key = iter.next(); String[] values = aliParams.get(key); 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"), "uft-8"); conversionParams.put(key, valueStr); } // 這一段是我自己的業務代碼,可根據需求變更 AjaxResult ajaxResult = xpenseTrackerService.updatePayStatus(conversionParams); if(ajaxResult.getStatus() == 200){ return "success"; } return "fail"; }
注意:異步驗證從request中取出了支付寶的請求參數,然后封裝為map,支付寶回每隔一段時間就請求一次這個接口,直到返回success字符串才停止請求。
