最近項目中要使用支付寶網頁支付功能,做個記錄,以後在用到的時候方便自己查看,同事也希望能幫助到你。
先附上支付寶電腦網站支付的官方文檔介紹 https://docs.open.alipay.com/270/105898/
我們這裏調用的是統一收單下單並支付頁面接口,該接口會返回一段html代碼,這個是支付寶自己的網頁支付頁面,前端負責展示,如下圖所示。
進入正題
一 引入依賴
這裏有兩種方式,可以在官方下載jar包導入項目中,也可以在pom文件中引入依賴,我用的是後者
<!-- 支付寶支付依賴 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
二 統一配置類
我這裏使用的是沙箱環境,appid,公鑰,私鑰都是沙箱環境的,登錄下支付寶開放平臺,自己跟着官方說明配置下就可以了。
public class AlipayConfig {
// 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
public static String app_id = "";
// 私鑰
public static String merchant_private_key = "";
// 支付寶公鑰
public static String alipay_public_key = "";
// 支付寶支付後,異步通知路徑
public static String notify_url ="http://xxxxx/aliPayCallBack";
// 服務器同步通知頁面路徑,也就是用戶支付成功後跳轉的頁面地址,先用百度代替
public static String return_url = "https://www.baidu.com";
// 簽名方式
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 gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
二 調用接口
支付寶調用接口很方便,比微信方便的不是一點半點。我自己封裝了一個server類,便於調用。參數的話可以自己封裝下,我這裏爲了方便就沒封裝,直接拼寫的json格式,其他參數可以自行查看官方api說明
public class AliPayServer {
public String pay(String orderNo, BigDecimal money) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(AlipayConfig.return_url);
request.setNotifyUrl(AlipayConfig.notify_url);
//out_trade_no 指的是商戶訂單號,唯一標識
//product_code 固定的
//total_amount 支付金額,單位元。
//subject 主題 可填可不填
//body 商品詳情,可填可不填
//timeout_express 二維碼有效期
request.setBizContent("{" +
"\"out_trade_no\":\"" + orderNo + "\"," +
"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
"\"total_amount\":" + money + "," +
"\"subject\":\"購買航母\"," +
"\"body\":\"攻打利器\"," +
"\"timeout_express\":\"15m\"" +
" }");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
System.out.println("調用成功");
} else {
System.out.println("調用失敗");
}
return response.getBody();
}
}
支付功能就搞定了,是不是很簡單。下面就差支付寶異步通知回調接口了。
三 回調接口
controller層就不寫了,直接寫實現類的回調方法
@Override
public void aliPayCallBack(HttpServletRequest request, HttpServletResponse response) {
//獲取支付寶POST過來反饋信息
Map<String, String> params = this.getAliPayResultMap(request);
//驗證簽名
boolean flag = false;
try {
flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, "RSA2");
} catch (AlipayApiException e) {
e.printStackTrace();
System.out.println("校驗簽名出現異常");
return;
}
// 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
String orderNo = request.getParameter("out_trade_no"); // 獲取訂單編號
String trade_status = request.getParameter("trade_status"); // 交易狀態
// 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
if (flag) {// 驗證成功
try {
if (trade_status.equals("TRADE_SUCCESS")) {
System.out.println("支付寶訂單支付成功!");
}
//這裏通知支付寶回調成功,不然一直回調
response.getWriter().write("success");
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("簽名驗證不通過");
try {
response.getWriter().write("failure");
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 獲取支付寶支付異步通知結果
*
* @param request
* @return
*/
private Map<String, String> getAliPayResultMap(HttpServletRequest request) {
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] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
return params;
}
到這裏整個流程就結束了,哪裏有錯誤還請及時告知。
如果這篇文章幫您節省了不少時間,並且解決了問題,求賞賜呀!一塊錢也是愛!