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 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 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 map) throws Exception { //订单支付成功后同步返回地址 if (check(request.getParameterMap())) { Map 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 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 getRequestMap(Map requestParams) { Map 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 requestParams) throws Exception { //对return、notify参数进行验签 Map requestMap = this.getRequestMap(requestParams); return AlipaySignature.rsaCheckV1(requestMap, alipayProperties.getAlipayPublicKey(), alipayProperties.getCharset(), alipayProperties.getSignType()); //调用SDK验证签名 } }