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.config.alipay.AlipayProperties; import com.kidgrow.oprationcenter.model.SaasClientPay; 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; @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() ); 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.setCreateHospitalDepartment(""); saasClientPay.setCreateHospitalDepartid(""); saasClientPay.setCreateHospitalId(Long.valueOf(1L)); 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()); saasClientPay.setCreateUserId(Long.valueOf(1L)); saasClientPay.setCreateUserName(""); 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 ResultBody 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(request.toString()); log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); System.out.println("异步通知 "+ Instant.now()); }else { System.out.println("验签失败"); } return ResultBody.ok().data("订单失败"); } @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验证签名 } }