支付寶APP支付Java服務端
阿新 • • 發佈:2019-01-04
這裡對於設定支付寶賬號和配置就不做說明,網上很多配置資訊和應用上線的文章
做第三方介面首先得看官方文件,支付寶的官方文件非常清晰:
首先登入支付寶的開放文件,下載支付寶SDK和demo,連結:
https://docs.open.alipay.com/54/106370/
將jar包匯入專案,在Java服務端生成訂單資訊:
//例項化客戶端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2" );
//例項化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共引數,這裡只需要傳入業務引數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是測試資料");
model.setSubject("App支付測試Java");
model.setOutTradeNo(outtradeno);//更換為自己的訂單編號
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");//訂單價格
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商戶外網可以訪問的非同步地址");//回撥地址不可以帶引數
String orderStr = "";
try {
//這裡和普通的介面呼叫不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute (request);
orderStr = response.getBody();
System.out.println(orderStr);//就是orderString 可以直接給客戶端請求,無需再做處理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
說的簡直太詳細,只需要替換自己的訂單ID和價格就可以了,這裡我們只需要把orderStr返回給客戶端就可以了,我是通過json返回的,當然客戶端完成支付之後,服務端還需要知道支付結果,或者將支付的訂單資訊存入資料庫,那麼我們需要設定回撥地址,即setNotifyUrl,支付寶服務端通過這個地址將支付結果返回給後臺服務端,在這裡我們可以更改訂單狀態,插入訂單資訊等等。(注:這個的回撥地址必須是外網可以訪問的,不然收不到支付寶返回的資訊,這個地址即我們在開發配置中設定的授權回撥地址)
回撥頁面內容嚴格按照支付寶規定:
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
<%@page import="com.alipay.api.internal.util.AlipaySignature"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.alipay.*"%>
<%@ page import="com.alipay.api.*"%>
<%
//獲取支付寶POST過來反饋資訊
Map<String,String> params = new HashMap<String,String>();
System.out.println("非同步通知引數:");
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] + ",";
}
if(name.equals("trade_status")){
System.out.println("交易狀態為:"+valueStr);
}
//亂碼解決,這段程式碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段程式碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
System.out.println("params"+params);
String pk = "自己的支付寶公鑰";
//獲取支付寶的通知返回引數
//商戶訂單號
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 auth_app_id = new String(request.getParameter("auth_app_id").getBytes("ISO-8859-1"),"UTF-8");
//買家登入支付寶id
String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
//交易時間
String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");
//交易金額
String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"),"UTF-8");
boolean verify_result = AlipaySignature.rsaCheckV1(params,pk, "UTF-8", "RSA2");
//這裡可以做處理修改訂單狀態
if(verify_result){//驗證成功
//支付成功只需要返回success
System.out.println(1);
out.println("success"); //請不要修改或刪除
}else{//驗證失敗
System.out.println(2);
out.println("fail");
}
%>
需要修改訂單狀態時在回撥頁面根據out_trade_no改變訂單狀態就可以。