package com.kidgrow.oprationcenter.controller.alipay;
|
|
import com.alipay.api.AlipayClient;
|
import com.alipay.api.domain.AlipayTradeCancelModel;
|
import com.alipay.api.domain.AlipayTradePrecreateModel;
|
import com.alipay.api.internal.util.AlipaySignature;
|
import com.alipay.api.request.AlipayTradeCancelRequest;
|
import com.alipay.api.request.AlipayTradePrecreateRequest;
|
import com.alipay.api.response.AlipayTradeCancelResponse;
|
import com.alipay.api.response.AlipayTradePrecreateResponse;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.kidgrow.common.model.ResultBody;
|
import com.kidgrow.common.utils.DateUtils;
|
import com.kidgrow.common.utils.QRCodeUtil;
|
import com.kidgrow.common.utils.StringUtils;
|
import com.kidgrow.oprationcenter.alipay.AlipayProperties;
|
import com.kidgrow.oprationcenter.model.SaasClientPay;
|
import com.kidgrow.oprationcenter.service.AlipayService;
|
import com.kidgrow.oprationcenter.service.ISaasClientPayService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.time.Instant;
|
import java.util.*;
|
|
@Slf4j
|
@RestController
|
@RequestMapping("alipay")
|
@Api(tags = "支付宝的支付controller")
|
public class AlipayController {
|
|
@Resource
|
private AlipayClient alipayClient;
|
@Resource
|
private AlipayProperties alipayProperties;
|
@Autowired
|
private ISaasClientPayService saasClientPayService;
|
@Autowired
|
private AlipayService alipayService;
|
|
@ApiOperation(value = "调用预支付的接口,生成二维码")
|
@PostMapping("/precreate")
|
public ResultBody precreate(HttpServletResponse response) throws Exception { //商户预创建支付订单,生成二维码
|
|
String outTradeNo = UUID.randomUUID().toString().replaceAll("-", "");
|
QueryWrapper queryWrapper = new QueryWrapper();
|
queryWrapper.eq("dia_id", "1");
|
queryWrapper.eq("pay_status", 0);
|
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
|
model.setProductCode("FACE_TO_FACE_PAYMENT"); //销售产品码
|
List<SaasClientPay> list = saasClientPayService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
SaasClientPay saasClientPay = list.get(0);
|
model.setOutTradeNo(outTradeNo); //商户订单号
|
model.setSubject("海贼王"); //订单标题
|
model.setTotalAmount(Double.valueOf(saasClientPay.getPayPrice()) / 100 + ""); //订单总金额
|
} else {
|
model.setOutTradeNo(outTradeNo); //商户订单号
|
model.setSubject("海贼王"); //订单标题
|
model.setTotalAmount("0.01"); //订单总金额
|
SaasClientPay saasClientPay = this.fengData(model);
|
boolean b = saasClientPayService.saveOrUpdate(saasClientPay);
|
}
|
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
|
request.setBizModel(model);
|
//兼容pkcs1 编码;
|
java.security.Security.addProvider(
|
new org.bouncycastle.jce.provider.BouncyCastleProvider()
|
);
|
request.setNotifyUrl(alipayProperties.getNotifyUrl());
|
request.setReturnUrl(alipayProperties.getReturnUrl());
|
AlipayTradePrecreateResponse alipayTradePrecreateResponse = alipayClient.execute(request);
|
if (StringUtils.isBlank(alipayTradePrecreateResponse.getQrCode())) {
|
return ResultBody.failed().data("生成二维码失败");
|
}
|
String content = alipayTradePrecreateResponse.getQrCode();
|
String base64 = QRCodeUtil.creatRrCode(content, 200, 200, 0).replaceAll("\n", "").replaceAll("\r", "");
|
System.out.println(base64);
|
return ResultBody.ok().data(base64);
|
}
|
|
//数据封装
|
public SaasClientPay fengData(AlipayTradePrecreateModel model) {
|
SaasClientPay saasClientPay = new SaasClientPay();
|
saasClientPay.setPayPrice(1);
|
saasClientPay.setOutTradeNo(model.getOutTradeNo());
|
saasClientPay.setPayStatus(0);
|
saasClientPay.setPayMethod(1);
|
saasClientPay.setDiaId("1");
|
saasClientPay.setId(UUID.randomUUID().toString().replaceAll("-", ""));
|
saasClientPay.setCreateTime(new Date());
|
return saasClientPay;
|
}
|
|
@ApiOperation(value = "取消订单,支付超时、支付结果未知是可撤销,超过24小时不可撤销-------暂时没有配置")
|
@PostMapping("/cancel")
|
public ResultBody cancel() throws Exception { //取消订单,支付超时、支付结果未知是可撤销,超过24小时不可撤销
|
AlipayTradeCancelModel model = new AlipayTradeCancelModel();
|
model.setOutTradeNo("300");
|
|
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
|
request.setBizModel(model);
|
|
AlipayTradeCancelResponse response = alipayClient.execute(request);
|
return ResultBody.ok().data(response.getBody());
|
}
|
|
@ApiOperation(value = "trade_success状态下异步通知接口,目前用的这个回调")
|
@PostMapping("/notify")
|
public String notify(HttpServletRequest request) throws Exception { //trade_success状态下异步通知接口
|
if (check(request.getParameterMap())) {
|
System.out.println(request.getParameter("trade_status"));
|
Map<String, String> requestMap = this.getRequestMap(request.getParameterMap());
|
log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
log.error(requestMap.toString());
|
log.error("eeeeeeeeeeeeeeeewwwwwwwwwwww:");
|
if (requestMap.get("trade_status").equals("TRADE_SUCCESS")) {
|
log.error("wwwwwwwwwww");
|
//更新状态 out_trade_no
|
log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
System.out.println("异步通知 " + Instant.now());
|
return alipayService.notify(requestMap);
|
}else {
|
return "fail";
|
}
|
} else {
|
System.out.println("验签失败");
|
return "fail";
|
}
|
}
|
|
@ApiOperation(value = "订单支付成功后同步返回地址")
|
@PostMapping("/return")
|
public ResultBody returnUrl(HttpServletRequest request, Map<String, Object> map) throws Exception { //订单支付成功后同步返回地址
|
if (check(request.getParameterMap())) {
|
Map<String, String> requestMap = this.getRequestMap(request.getParameterMap());
|
log.error("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
|
log.error(request.toString());
|
log.error("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
|
log.error(map.toString());
|
log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
String trade_status = requestMap.get("trade_status");
|
if (StringUtils.isNotBlank(trade_status)) {
|
//支付成功
|
if (trade_status.equals("TRADE_SUCCESS")) {
|
//更新状态 out_trade_no
|
QueryWrapper queryWrapper = new QueryWrapper();
|
queryWrapper.eq("out_trade_no", requestMap.get("out_trade_no"));
|
queryWrapper.eq("pay_status", 0);
|
List<SaasClientPay> list = saasClientPayService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
SaasClientPay saasClientPay = list.get(0);
|
saasClientPay.setPayTime(DateUtils.parseDate(requestMap.get("gmt_payment")));
|
saasClientPay.setPayStatus(2);
|
saasClientPay.setTradeNo(requestMap.get("trade_no"));
|
boolean b = saasClientPayService.saveOrUpdate(saasClientPay);
|
}
|
}
|
}
|
return ResultBody.ok().data("success");
|
} else {
|
return ResultBody.failed().data("false");
|
}
|
}
|
|
private Map<String, String> getRequestMap(Map<String, String[]> requestParams) {
|
Map<String, String> params = new HashMap<>();
|
for (String name : requestParams.keySet()) {
|
String[] values = requestParams.get(name);
|
String valueStr = "";
|
for (int i = 0; i < values.length; i++) {
|
valueStr = (i == values.length - 1) ? valueStr + values[i]
|
: valueStr + values[i] + ",";
|
}
|
params.put(name, valueStr);
|
System.out.println(name + " ==> " + valueStr);
|
}
|
return params;
|
}
|
|
private boolean check(Map<String, String[]> requestParams) throws Exception { //对return、notify参数进行验签
|
Map<String, String> requestMap = this.getRequestMap(requestParams);
|
return AlipaySignature.rsaCheckV1(requestMap, alipayProperties.getAlipayPublicKey(),
|
alipayProperties.getCharset(), alipayProperties.getSignType()); //调用SDK验证签名
|
}
|
}
|