forked from kidgrow-microservices-platform

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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<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()
        );
        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<String, String> 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<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验证签名
    }
}