forked from kidgrow-microservices-platform

zhaoxiaohao
2020-10-15 24679b74b46479acf248151f70a3768a9588249b
kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/alipay/AlipayController.java
@@ -13,8 +13,9 @@
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.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;
@@ -34,102 +35,112 @@
@RestController
@RequestMapping("alipay")
@Api(tags = "支付宝的支付controller")
public class AlipayController  {
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{  //商户预创建支付订单,生成二维码
    public ResultBody precreate(HttpServletResponse response) throws Exception {  //商户预创建支付订单,生成二维码
        String outTradeNo = UUID.randomUUID().toString().replaceAll("_", "");
        String outTradeNo = UUID.randomUUID().toString().replaceAll("-", "");
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("dia_id","1");
        queryWrapper.eq("pay_status",0);
        AlipayTradePrecreateModel model=new AlipayTradePrecreateModel();
        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.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();
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        request.setBizModel(model);
        //兼容pkcs1 编码;
        java.security.Security.addProvider(
                new org.bouncycastle.jce.provider.BouncyCastleProvider()
        );
        AlipayTradePrecreateResponse alipayTradePrecreateResponse=alipayClient.execute(request);
        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","");
        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){
    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.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();
    public ResultBody cancel() throws Exception {  //取消订单,支付超时、支付结果未知是可撤销,超过24小时不可撤销
        AlipayTradeCancelModel model = new AlipayTradeCancelModel();
        model.setOutTradeNo("300");
        AlipayTradeCancelRequest request=new AlipayTradeCancelRequest();
        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
        request.setBizModel(model);
        AlipayTradeCancelResponse response=alipayClient.execute(request);
        AlipayTradeCancelResponse response = alipayClient.execute(request);
        return ResultBody.ok().data(response.getBody());
    }
    @ApiOperation(value = "trade_success状态下异步通知接口,端口异常的接口")
    @ApiOperation(value = "trade_success状态下异步通知接口,目前用的这个回调")
    @PostMapping("/notify")
    public ResultBody notify(HttpServletRequest request) throws Exception{   //trade_success状态下异步通知接口
        if (check(request.getParameterMap())){
    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(request.toString());
            log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
            System.out.println("异步通知 "+ Instant.now());
        }else {
            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";
        }
        return ResultBody.ok().data("订单失败");
    }
    @ApiOperation(value = "订单支付成功后同步返回地址")
    @PostMapping("/return")
    public ResultBody returnUrl(HttpServletRequest request, Map<String,Object> map) throws Exception{  //订单支付成功后同步返回地址
        if (check(request.getParameterMap())){
    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());
@@ -137,15 +148,15 @@
            log.error(map.toString());
            log.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
            String trade_status = requestMap.get("trade_status");
            if(StringUtils.isNotBlank(trade_status)){
            if (StringUtils.isNotBlank(trade_status)) {
                //支付成功
                if(trade_status.equals("TRADE_SUCCESS")){
                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);
                    queryWrapper.eq("out_trade_no", requestMap.get("out_trade_no"));
                    queryWrapper.eq("pay_status", 0);
                    List<SaasClientPay> list = saasClientPayService.list(queryWrapper);
                    if(!list.isEmpty()){
                    if (!list.isEmpty()) {
                        SaasClientPay saasClientPay = list.get(0);
                        saasClientPay.setPayTime(DateUtils.parseDate(requestMap.get("gmt_payment")));
                        saasClientPay.setPayStatus(2);
@@ -155,25 +166,27 @@
                }
            }
            return ResultBody.ok().data("success");
        }else {
        } 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参数进行验签
    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验证签名