首先 引用 阿里 支付 jar 包
<dependency>
<groupId>alipay</groupId>
<artifactId>alipay-sdk</artifactId>
<version>java20170615110434</version>
</dependency>
阿里支付邏輯是 先通過app 調用後臺接口 生成支付訂單 ,然後 阿里會回調 後臺接口 覈對支付訂單
最後 app回調後臺接口 確認有沒有支付成功
首先 調用支付接口
@RequestMapping(value = "/payApply", method = RequestMethod.POST)
@ResponseBody
public R payApply(@RequestParam() Map<String, String> allParams) {
if (allParams.get("userId") == null) {
return R.error(ResultStatusCode.MISSING_PARAMS);
}
if (allParams.get("userId").equalsIgnoreCase("")) {
return R.error(ResultStatusCode.INVALID_PARAMS);
}
// 查詢用戶
AppUser user = appLogin1Service.selectAppUserByPrimaryKey(Integer.parseInt(allParams.get("userId")));
AppPayRecord record = new AppPayRecord();
record.setPayUser(user.getId());
record.setPayFee(param.getpValue());
record.setOutTradeNo(getOutTradeNo());
record.setStatus(0); //生成支付記錄
if (appPayService.insertSelective(record) > 0) {
SysParam seviceCharge = sysParamMapper.selectByPrimaryKey("service_charge");
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", ALI_APPID,
ALI_PRIVATE_KEY, "json", "utf-8", ALI_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(seviceCharge.getpName());
model.setOutTradeNo(record.getOutTradeNo());
model.setTimeoutExpress("30m");
model.setTotalAmount(seviceCharge.getpValue().toString());
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
//這裏配置 支付寶回調接口路徑
request.setNotifyUrl(ALI_NOTIFY_URL);
// 這裏和普通的接口調用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
Map<String, Object> map = new HashMap<String, Object>();
map.put("orderInfo", response.getBody());
return R.ok().put("data", map);
} else {
return R.error("數據庫插入失敗");
}
}
支付寶回調接口
@RequestMapping(value = "/paySuccessNotify", method = RequestMethod.POST)
//@ControllerPermission(value = ControllerPermissionType.PUBLIC)
@ResponseBody
public String paySuccessNotify(HttpServletRequest request) {
try {
// 獲取到返回的所有參數 先判斷是否交易成功trade_status 再做簽名校驗
// 1、商戶需要驗證該通知數據中的out_trade_no是否爲商戶系統中創建的訂單號,
// 2、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單創建時的金額),
System.out.println("trade_stataus-------------" + request.getParameter("trade_status"));
if (request.getParameter("trade_status") != null
&& "TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
Enumeration<?> pNames = request.getParameterNames();
Map<String, String> param = new HashMap<String, String>();
while (pNames.hasMoreElements()) {
String pName = (String) pNames.nextElement();
param.put(pName, request.getParameter(pName));
System.out.println(pName + "---------------------" + param.get(pName));
}
boolean signVerified = AlipaySignature.rsaCheckV1(param, ALI_PUBLIC_KEY, "utf-8", "RSA2"); // 校驗簽名是否正確
System.out.println("signVerified-------------" + signVerified);
if (signVerified) {
/***
這裏寫 回調成功後的代碼邏輯
*/
接的 recorde 裏面的status 設置爲 1
}
}
最後app回調後臺接口
查詢訂單狀態是否爲 1