huanghongfa
2022-04-11 94a69f5c6b470a59b2642f870861a62dd00eef84
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package com.panzhihua.applets.api;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.panzhihua.common.service.community.ComBatteryCommodityOrderFeign;
import org.json.XML;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.panzhihua.common.model.dtos.shop.WxPayNotifyOrderDTO;
import com.panzhihua.common.service.community.CommunityService;
import com.panzhihua.common.utlis.StringUtils;
 
import lombok.extern.slf4j.Slf4j;
 
/**
 * @auther lyq
 * @create 2021-04-14 15:02:49
 * @describe 微信支付回到函数
 */
@Slf4j
@RestController
@RequestMapping("/wx/")
public class WxCallbackApi {
 
    private static final String  SUCCESS="SUCCESS";
 
    @Resource
    private CommunityService communityService;
    @Resource
    private ComBatteryCommodityOrderFeign commodityOrderFeign;
 
 
    @PostMapping("wxNotify")
    public void payCallback(HttpServletRequest request, HttpServletResponse response) {
        log.info("微信支付回调start");
        String inputLine = "";
        String notityXml = "";
        try {
            while ((inputLine = request.getReader().readLine()) != null) {
                notityXml += inputLine;
            }
            // 关闭流
            request.getReader().close();
            log.info("微信回调内容信息:" + notityXml);
            // 解析成Json
            org.json.JSONObject xmlJson = XML.toJSONObject(notityXml);
            if (StringUtils.isNotEmpty(xmlJson.toString())) {
                JSONObject resultData = JSON.parseObject(xmlJson.get("xml").toString());
                // 成功支付订单
                if (resultData.getString("result_code").equals("SUCCESS")
                    && resultData.getString("return_code").equals("SUCCESS")) {
                    WxPayNotifyOrderDTO notifyOrderDTO = new WxPayNotifyOrderDTO();
                    // 订单号
                    String orderTradeNo = resultData.getString("out_trade_no");
                    notifyOrderDTO.setOrderTradeNo(orderTradeNo);
                    // 微信支付订单号
                    String wxTradeNo = resultData.getString("transaction_id");
                    notifyOrderDTO.setWxTradeNo(wxTradeNo);
                    // 订单金额
                    String totalFee = resultData.getString("total_fee");
                    notifyOrderDTO.setTotalFee(totalFee);
                    // 支付完成时间
                    String payTime = resultData.getString("time_end");
                    notifyOrderDTO.setPayTime(payTime);
                    // 现金支付金额
                    String cashFee = resultData.getString("cash_fee");
                    notifyOrderDTO.setCashFee(cashFee);
 
                    // 根据订单号修改订单信息
                    communityService.wxOrderPayNotify(notifyOrderDTO);
 
                    // 封装 返回值
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("<xml>");
                    buffer.append("<return_code>SUCCESS</return_code>");
                    buffer.append("<return_msg>OK</return_msg>");
                    buffer.append("</xml>");
 
                    // 给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功
                    PrintWriter writer = response.getWriter();
                    // 返回
                    writer.print(buffer.toString());
                } else {// 未成功支付订单
                        // 封装 返回值
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("<xml>");
                    buffer.append("<return_code>FAIL</return_code>");
                    buffer.append("<return_msg>FAIL</return_msg>");
                    buffer.append("</xml>");
 
                    // 给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功
                    PrintWriter writer = response.getWriter();
                    // 返回
                    writer.print(buffer.toString());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 电动车商城商品购买支付回调
     * @param request   请求参数
     * @param response  返回参数
     */
    @PostMapping("/batteryPayNotify")
    public void batteryPayNotify(HttpServletRequest request, HttpServletResponse response) {
        log.info("钱包充值微信支付回调start");
        String inputLine = "";
        String notityXml = "";
        try {
            while ((inputLine = request.getReader().readLine()) != null) {
                notityXml += inputLine;
            }
            // 关闭流
            request.getReader().close();
            log.info("钱包充值微信回调内容信息:" + notityXml);
            // 解析成Json
            org.json.JSONObject xmlJson = XML.toJSONObject(notityXml);
            if (StringUtils.isNotEmpty(xmlJson.toString())) {
                JSONObject resultData = JSON.parseObject(xmlJson.get("xml").toString());
                // 成功支付订单
                if (SUCCESS.equals(resultData.getString("result_code")) && SUCCESS.equals(resultData.getString("result_code"))){
                    WxPayNotifyOrderDTO notifyOrderDTO = getWxNotify(resultData);
 
                    // 根据订单号修改订单信息
                    commodityOrderFeign.batteryPayNotify(notifyOrderDTO);
                    // 给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功
                    PrintWriter writer = response.getWriter();
                    // 返回
                    writer.print(getWxSuccessString());
                } else {// 未成功支付订单
                    // 给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功
                    PrintWriter writer = response.getWriter();
                    // 返回
                    writer.print(getWxFailString());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 将微信支付回调的请求参数转义为对象
     * @param resultData    微信支付回调请求参数
     * @return  转义为支付请求参数
     */
    private WxPayNotifyOrderDTO getWxNotify(JSONObject resultData){
        WxPayNotifyOrderDTO notifyOrderDTO = new WxPayNotifyOrderDTO();
        notifyOrderDTO.setResult(resultData.toJSONString());
        // 订单号
        String orderTradeNo = resultData.getString("out_trade_no");
        notifyOrderDTO.setOrderTradeNo(orderTradeNo);
        // 微信支付订单号
        String wxTradeNo = resultData.getString("transaction_id");
        notifyOrderDTO.setWxTradeNo(wxTradeNo);
        // 订单金额
        String totalFee = resultData.getString("total_fee");
        notifyOrderDTO.setTotalFee(totalFee);
        // 支付完成时间
        String payTime = resultData.getString("time_end");
        notifyOrderDTO.setPayTime(payTime);
        // 现金支付金额
        String cashFee = resultData.getString("cash_fee");
        notifyOrderDTO.setCashFee(cashFee);
        return notifyOrderDTO;
    }
 
    /**
     * 封装微信成功返回值
     * @return  成功返回值
     */
    private String getWxSuccessString(){
        StringBuffer buffer = new StringBuffer();
        buffer.append("<xml>");
        buffer.append("<return_code>SUCCESS</return_code>");
        buffer.append("<return_msg>OK</return_msg>");
        buffer.append("</xml>");
        return buffer.toString();
    }
 
    /**
     * 封装微信失败返回值
     * @return  失败返回值
     */
    private String getWxFailString(){
        StringBuffer buffer = new StringBuffer();
        buffer.append("<xml>");
        buffer.append("<return_code>FAIL</return_code>");
        buffer.append("<return_msg>FAIL</return_msg>");
        buffer.append("</xml>");
        return buffer.toString();
    }
}