- 一 前提條件
- 開發平台注冊: 地址:https://openhome.alipay.com
- 創建應用: 開發者中心 ➡ 選擇你對接的類型(我這里是網頁&移動應用)➡ 創建應用
- 完善應用:
a、添加功能:app支付
b、簽約
c、開發設置:應用信息里設置 接口加簽方式 等
4. 申請上線:提交申請,大概需要一天時間審核
- 二 SDK下載
1、選擇相應的語言下載即可,地址: https://docs.open.alipay.com/54/103419/
2、配置pom文件
- 三 代碼
1、 發起支付接口
/**
* 支付寶支付
* @param payRecord
* @return
*/
public MapResult aliPay(PayRecord payRecord){
//實例化客戶端
AlipayClient alipayClient = AliPayUtils.getAlipayClient();
//實例化具體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("玉米出行-油券");
model.setOutTradeNo(payRecord.getId());
model.setTimeoutExpress("10m");
model.setTotalAmount(payRecord.getPayMoney().toString());
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(notifyUrlAliPay);
String orderString = "";
try {
//這里和普通的接口調用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
orderString = response.getBody();
System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求,無需再做處理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
return MapResult.build(orderString);
}
2、AliPayUtils工具類
/**
* 2019/10/12 12:10 PM
*
* @author shoo
* @describe 支付寶支付
*/
public class AliPayUtils {
public static final String APP_ID = "2019100912345678";
/**
* 應用公鑰
*/
public static final String APP_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ";
/**
* 支付寶公鑰
*/
public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w";
public static final String APP_PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAA";
public static final String SIGN_TYPE = "RSA2";
public static final String CHARSET = "UTF-8";
public static final String GATEWAY = "https://openapi.alipay.com/gateway.do";
public static AlipayClient getAlipayClient(){
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY,APP_ID,APP_PRIVATE_KEY,"json", CHARSET, APP_PUBLIC_KEY, SIGN_TYPE);
return alipayClient;
}
}
3、支付成功后異步回調
/**
* 支付寶回調
*
*/
@PostMapping("/aliPay")
public String aliPay(HttpServletRequest request){
Map<String, String> params = convertRequestParamsToMap(request); // 將異步通知中收到的待驗證所有參數都存放到map中
String paramsJson = JSON.toJSONString(params);
logger.info("支付寶回調,{}", paramsJson);
try {
//驗簽
boolean signVerify = AlipaySignature.rsaCheckV1(params, AliPayUtils.ALIPAY_PUBLIC_KEY, AliPayUtils.CHARSET,AliPayUtils.SIGN_TYPE);
if(signVerify){
//todo 嚴格來說,這里還應該做訂單號、金額等校驗
String out_trade_no = (String) params.get("out_trade_no");//本系統付款ID
String trade_no = (String) params.get("trade_no");//淘寶系統中的交易流水號
//完成支付后的后續動作
updateOrder(out_trade_no, trade_no);
}else{
logger.info("---支付寶回調,驗簽異常,param:[{}]" , paramsJson);
return "fail";
}
}catch (Exception ex){
ex.printStackTrace();
return "fail";
}
return "success";
}
// 將request中的參數轉換成Map
private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
Map<String, String> retMap = new HashMap<>();
Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
for (Map.Entry<String, String[]> entry : entrySet) {
String name = entry.getKey();
String[] values = entry.getValue();
int valLen = values.length;
if (valLen == 1) {
retMap.put(name, values[0]);
} else if (valLen > 1) {
StringBuilder sb = new StringBuilder();
for (String val : values) {
sb.append(",").append(val);
}
retMap.put(name, sb.toString().substring(1));
} else {
retMap.put(name, "");
}
}
return retMap;
}
