首先 引用 阿里 支付 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