必備的Jar支援
<!-- 官網說明位址:https://docs.open.alipay.com/54/103419 -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.26.ALL</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
螞蟻金服開放平申請建立應用
申請位址:https://openhome.alipay.com/platform/appManage.htm#/apps
電腦網站支付快速接入
文檔位址:https://docs.open.alipay.com/270/105899/
支付寶參數配置(AliPayConfig.class)
package com.pay.alipay;
/**
* 支付寶支付的配置類
* RSA1更新到RSA2的方式:https://opensupport.alipay.com/support/knowledge/20069/201602242782#/?_k=xj2m2v
* @author xxx
*/
public class AliPayConfig {
//支付寶網關(固定)
public static final String URL = "https://openapi.alipay.com/gateway.do";
//APPID 即建立應用後生成
public static final String APP_ID = "";
//開發者私鑰,由開發者自己生成
public static final String APP_PRIVATE_KEY = "";
//參數傳回格式,隻支援json
public static final String FORMAT = "json";
//編碼集,支援GBK/UTF-8
public static final String CHARSET = "UTF-8";
//支付寶公鑰,由支付寶生成
public static final String ALIPAY_PUBLIC_KEY = "";
//商戶生成簽名字元串所使用的簽名算法類型,目前支援RSA2和RSA,推薦使用RSA2
public static final String SIGN_TYPE = "RSA2";
}
支付寶下單支付接口
public void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException {
//初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL,
AliPayConfig.APP_ID, AliPayConfig.APP_PRIVATE_KEY,
AliPayConfig.FORMAT, AliPayConfig.CHARSET,
AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
//建立API對應的request
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//支付成功後跳轉的頁面,千萬不要加端口号(同步網頁重定向通知)
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
//支付完成設定回調通知位址,千萬不要加端口号(異步伺服器通知)
alipayRequest.setNotifyUrl("http://domain.com/CallBack/alipayNotifyUrl");
//下單時傳遞的請求參數, 詳情參照(https://docs.open.alipay.com/api_1/alipay.trade.page.pay/)請求參數
Map<String, Object> bizContentMap = new TreeMap<String, Object>();
//商戶網站唯一訂單号(必填,類型為String), 最大長度64
String out_trade_no = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
bizContentMap.put("out_trade_no", out_trade_no);
//商品的标題/交易标題/訂單标題/訂單關鍵字等(必填,類型為String), 最大長度256。
bizContentMap.put("subject", "Iphone6 16G");
//訂單總金額,機關為元,精确到小數點後兩位(必填,類型為String), 最大長度9。
bizContentMap.put("total_amount", "0.01");
//銷售産品碼,與支付寶簽約的産品碼名稱(必填,類型為String), 目前僅支援FAST_INSTANT_TRADE_PAY
bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");
//對一筆交易的具體描述資訊。 (非必填,類型為String), 最大長度128。
bizContentMap.put("body", "新品蘋果手機");
//填充業務參數
alipayRequest.setBizContent(JSONObject.toJSONString(bizContentMap));
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
支付寶下單支付後的回調接口(一定要是否登入都能通路的方法)
/**
* 支付寶支付完成後異步通知回調函數
* 送出方式為:Post
* 注意事項:設定異步通知回調通知的時候,異步通知回調位址不能加端口号!!!
* AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
* alipayRequest.setNotifyUrl("異步通知回調位址");
* @return 如果通知成功并處理完業務就傳回"success",反之傳回"fail"。
*/
public String alipayNotifyUrl(HttpServletRequest request) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
//擷取支付寶POST過來回報資訊
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);
}
//調用SDK驗證簽名
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY,
AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
} catch (AlipayApiException e) {
e.printStackTrace();
}
if(signVerified){
//交易狀态
String trade_status = request.getParameter("trade_status");
if(trade_status.equals("TRADE_FINISHED")){
//判斷該筆訂單是否在商戶網站中已經做過處理
}else if (trade_status.equals("TRADE_SUCCESS")){
//判斷該筆訂單是否在商戶網站中已經做過處理
System.out.println("訂單号: "+request.getParameter("out_trade_no"));
}
return "success";
}else{
System.out.println("支付寶回調方法簽名校驗失敗!");
return "fail";
}
}