傅行帆 před 5 roky
rodič
revize
3aa294e55d

+ 68
- 1
src/main/java/com/huiju/estateagents/controller/WxPayController.java Zobrazit soubor

@@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletRequest;
14 14
 import java.io.ByteArrayOutputStream;
15 15
 import java.io.InputStream;
16 16
 import java.util.HashMap;
17
+import java.util.List;
17 18
 import java.util.Map;
18 19
 
19 20
 @Slf4j
@@ -53,7 +54,7 @@ public class WxPayController extends BaseController {
53 54
      * @return
54 55
      */
55 56
     @RequestMapping(value = "/notify/{type}",method = RequestMethod.POST)
56
-    public String wxBillNotify(@PathVariable String type, HttpServletRequest request){
57
+    public String wxNotify(@PathVariable String type, HttpServletRequest request){
57 58
         log.info("支付成功回调开始,支付类型是{}",type);
58 59
         String failResult = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[失败]]></return_msg>" + "</xml> ";
59 60
         String successResult = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
@@ -92,4 +93,70 @@ public class WxPayController extends BaseController {
92 93
         return successResult;
93 94
     }
94 95
 
96
+    /**
97
+     * 微信退款成功回调接口
98
+     * @param type
99
+     * @param request
100
+     * @return
101
+     */
102
+    @RequestMapping(value = "/refund/{type}",method = RequestMethod.POST)
103
+    public String wxRefund(@PathVariable String type, HttpServletRequest request){
104
+        log.info("支付成功回调开始,支付类型是{}",type);
105
+        String failResult = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[失败]]></return_msg>" + "</xml> ";
106
+        String successResult = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
107
+        Map<String, String> resultMap = new HashMap<>();
108
+        try {
109
+            InputStream inStream = request.getInputStream();
110
+            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
111
+            byte[] buffer = new byte[1024];
112
+            int len = 0;
113
+            while ((len = inStream.read(buffer)) != -1) {
114
+                outSteam.write(buffer, 0, len);
115
+            }
116
+
117
+            // 获取微信调用我们notify_url的返回信息
118
+            String result = new String(outSteam.toByteArray(), "utf-8");
119
+            log.info("wxnotify:微信支付----result----=" + result);
120
+
121
+            // 关闭流
122
+            outSteam.close();
123
+            inStream.close();
124
+            // xml转换为map
125
+            resultMap = WXPayUtil.xmlToMap(result);
126
+            //处理业务需求
127
+            if (WXPayConstants.SUCCESS.equalsIgnoreCase(resultMap.get("result_code"))) {
128
+                wxPayService.wxNotify(resultMap, type);
129
+            }else {
130
+                log.error("支付回调出错{}",resultMap.get("return_msg"));
131
+                return failResult;
132
+            }
133
+
134
+        } catch (Exception e) {
135
+            log.error("支付回调出错{}",e.getMessage());
136
+            return failResult;
137
+        }
138
+
139
+        return successResult;
140
+    }
141
+
142
+    /**
143
+     * 微信申请退款接口
144
+     * @param taOrder
145
+     * @param request
146
+     * @return
147
+     */
148
+    @RequestMapping(value = "/admin/refund",method = RequestMethod.POST)
149
+    public ResponseBean wxRefund(@RequestBody TaOrder taOrder,
150
+                                       HttpServletRequest request){
151
+        ResponseBean responseBean = new ResponseBean();
152
+        try {
153
+            wxPayService.payRefund(taOrder,getOrgId(request),getUserId(request));
154
+        } catch (Exception e) {
155
+            log.error("微信批量退款失败: {}" , e.getMessage());
156
+            responseBean.addError(e.getMessage());
157
+            return responseBean;
158
+        }
159
+        responseBean.addSuccess(taOrder);
160
+        return responseBean;
161
+    }
95 162
 }

+ 10
- 0
src/main/java/com/huiju/estateagents/entity/TaOrder.java Zobrazit soubor

@@ -1,6 +1,7 @@
1 1
 package com.huiju.estateagents.entity;
2 2
 
3 3
 import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableField;
4 5
 import com.baomidou.mybatisplus.annotation.TableId;
5 6
 import lombok.Data;
6 7
 import lombok.EqualsAndHashCode;
@@ -85,5 +86,14 @@ public class TaOrder implements Serializable {
85 86
      */
86 87
     private String transactionId;
87 88
 
89
+    /**
90
+     * 退款单号
91
+     */
92
+    private String refundNo;
88 93
 
94
+    /**
95
+     * 退款原因
96
+     */
97
+    @TableField(exist = false)
98
+    private String refundReason;
89 99
 }

+ 2
- 1
src/main/java/com/huiju/estateagents/interceptor/AccessInterceptor.java Zobrazit soubor

@@ -70,7 +70,8 @@ public class AccessInterceptor implements HandlerInterceptor {
70 70
             "/clean/menurole",
71 71
             "/clean/buttonrole",
72 72
             "/api/admin/taPersonFromRecord",
73
-            "/api/notify",//微信支付所有回掉放过
73
+            "/api/notify",//微信支付所有回调放过
74
+            "/api/refund/",//微信退款所有回调放过
74 75
     };
75 76
 
76 77
     /*

+ 8
- 0
src/main/java/com/huiju/estateagents/service/IWxPayService.java Zobrazit soubor

@@ -16,4 +16,12 @@ public interface IWxPayService {
16 16
     ResponseBean payUnifiedOrder(TaOrder taOrder, String clientIp) throws Exception;
17 17
 
18 18
     void wxNotify(Map<String, String> resultMap, String type);
19
+
20
+    /**
21
+     * 微信退款接口
22
+     * @param taOrder
23
+     * @param orgId
24
+     * @param userId
25
+     */
26
+    void payRefund(TaOrder taOrder, Integer orgId, Integer userId) throws Exception;
19 27
 }

+ 86
- 1
src/main/java/com/huiju/estateagents/service/impl/WxPayServiceImpl.java Zobrazit soubor

@@ -25,12 +25,14 @@ import java.util.Map;
25 25
 
26 26
 @Slf4j
27 27
 @Service
28
-@Transactional(rollbackFor = Exception.class)
29 28
 public class WxPayServiceImpl implements IWxPayService {
30 29
 
31 30
     @Value("${pay-notify}")
32 31
     private String payNotify;
33 32
 
33
+    @Value("${pay-refund}")
34
+    private String payRefund;
35
+
34 36
     @Autowired
35 37
     private TaWxPayConfigMapper taWxPayConfigMapper;
36 38
 
@@ -57,6 +59,7 @@ public class WxPayServiceImpl implements IWxPayService {
57 59
      * @return
58 60
      */
59 61
     @Override
62
+    @Transactional(rollbackFor = Exception.class)
60 63
     public ResponseBean payUnifiedOrder(TaOrder taOrder, String clientIp) throws Exception {
61 64
         //构建微信配置
62 65
         WxConfig config = getWxConfig(taOrder.getOrgId());
@@ -126,6 +129,88 @@ public class WxPayServiceImpl implements IWxPayService {
126 129
 
127 130
     }
128 131
 
132
+    /**
133
+     * 微信退款
134
+     * @param taOrder
135
+     * @param orgId
136
+     * @param userId
137
+     * @throws Exception
138
+     */
139
+    @Override
140
+    public void payRefund(TaOrder taOrder, Integer orgId, Integer userId) throws Exception {
141
+        //构建微信配置
142
+        WxConfig config = getWxConfig(taOrder.getOrgId());
143
+        WXPay wxpay = new WXPay(config);
144
+
145
+        //获取支付的钱数并且判断是自动锁房还是手动锁房,自动锁房需要锁定房源,手动锁房跳过
146
+        String payPrice = getRefundPrice(taOrder);
147
+        if (null == payPrice){
148
+            throw new Exception("此认筹单异常请联系置业顾问!");
149
+        }
150
+
151
+        //退款单
152
+        Map<String, String> data = new HashMap<String, String>();
153
+        //商品号唯一
154
+        data.put("transaction_id", taOrder.getTransactionId());
155
+        data.put("out_refund_no", taOrder.getRefundNo());
156
+        data.put("fee_type", "CNY");
157
+        //金额 后台计算
158
+        data.put("total_fee", payPrice);
159
+        data.put("refund_fee", payPrice);
160
+        //退款原因
161
+        data.put("refund_desc", taOrder.getRefundReason());
162
+        //回调地址
163
+        data.put("notify_url", payRefund+taOrder.getTargetType());
164
+        Map<String, String> resp = wxpay.refund(data);
165
+        log.info("退款下单成功:{}", resp);
166
+        if (resp.get("result_code").equalsIgnoreCase(WXPayConstants.FAIL)){
167
+            throw new Exception(resp.get("err_code_des"));
168
+        }
169
+
170
+        //更新退款状态并插入退款订单并更新认筹单的退款原因
171
+        updateRefundOrderStatus(taOrder);
172
+    }
173
+
174
+    /**
175
+     * 插入退款订单并更新认筹单的退款原因
176
+     * @param taOrder
177
+     */
178
+    private void updateRefundOrderStatus(TaOrder taOrder) {
179
+        //插入退款单
180
+        taOrder.setCreateDate(LocalDateTime.now());
181
+        taOrderMapper.insert(taOrder);
182
+        //更新认筹单退款原因
183
+        TaRaiseRecord taRaiseRecord = taRaiseRecordMapper.selectById(taOrder.getTargetId());
184
+        taRaiseRecord.setRefundReason(taOrder.getRefundReason());
185
+        taRaiseRecordMapper.updateById(taRaiseRecord);
186
+    }
187
+
188
+    /**
189
+     * 获取退款金额
190
+     * @param taOrder
191
+     * @return
192
+     */
193
+    private String getRefundPrice(TaOrder taOrder) throws Exception {
194
+        if (taOrder.getTargetType().equals(CommConstant.ORDER_TARGET_TYPE_HOUSE)){
195
+            TaRaiseRecord taRaiseRecord = taRaiseRecordMapper.selectById(taOrder.getTargetId());
196
+            if (null == taRaiseRecord){
197
+                throw new Exception("此认筹单不存在!请联系置业顾问!");
198
+            }
199
+            //获取订单中的价格
200
+            TaOrder refundOrder = taOrderMapper.selectById(taRaiseRecord.getOrderId());
201
+            //退款单号
202
+            taOrder.setRefundNo("T"+refundOrder.getTradeNo());
203
+            taOrder.setParentOrderId(refundOrder.getOrderId());
204
+            taOrder.setOrgId(refundOrder.getOrgId());
205
+            taOrder.setPayTime(refundOrder.getPayTime());
206
+            taOrder.setPersonId(refundOrder.getPersonId());
207
+            taOrder.setTradeNo(refundOrder.getTradeNo());
208
+            taOrder.setTotalFee(refundOrder.getTotalFee());
209
+            return String.valueOf(refundOrder.getTotalFee());
210
+        }
211
+        return null;
212
+    }
213
+
129 214
     /**
130 215
      * 处理认筹房源的相关数据
131 216
      * @param resultMap

+ 3
- 1
src/main/resources/application-blue.yml Zobrazit soubor

@@ -74,4 +74,6 @@ sms:
74 74
     code: "0501"
75 75
 
76 76
 # 支付回调
77
-pay-notify: https://dev.pawoma.cn/api/notify/
77
+pay-notify: https://dev.pawoma.cn/api/notify/
78
+#退款回调
79
+pay-refund: https://dev.pawoma.cn/api/refund/