Browse Source

Accept Merge Request #13: (develop-wxl -> master)

Merge Request: 增加退款查询接口

Created By: @万新亮
Accepted By: @万新亮
URL: https://chuanghaikeji.coding.net/p/smarCampus/d/iHotel_student_houtai/git/merge/13?initial=true
万新亮 1 year ago
parent
commit
cad533fbda

+ 4 - 0
src/main/java/com/template/api/HouseOrderAPI.java

@@ -121,5 +121,9 @@ public interface HouseOrderAPI {
     @ApiOperation(value = "管理端——支付", notes = "管理端——支付", httpMethod = "POST")
     CommonResult payOrderPrice(@RequestBody HouseOrderPriceDto houseOrderPriceDto);
 
+    @PostMapping("/queryRefundById")
+    @ApiOperation(value = "查询退款", notes = "管理端——支付", httpMethod = "POST")
+    CommonResult queryRefundById(@RequestParam String refundNo);
+
 }
 

+ 150 - 37
src/main/java/com/template/controller/HouseOrderController.java

@@ -32,6 +32,10 @@ import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
 import com.wechat.pay.java.service.payments.jsapi.model.*;
 import com.wechat.pay.java.service.payments.model.Transaction;
 import com.wechat.pay.java.service.payments.nativepay.NativePayService;
+import com.wechat.pay.java.service.refund.RefundService;
+import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
+import com.wechat.pay.java.service.refund.model.Refund;
+import com.wechat.pay.java.service.refund.model.Status;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.poi.ss.usermodel.Row;
@@ -63,6 +67,7 @@ import java.util.*;
 import static com.template.common.utils.StrUtils.getUUIDBits;
 import static com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.NOTPAY;
 import static com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.SUCCESS;
+import static com.wechat.pay.java.service.refund.model.Status.*;
 
 /**
  * <p>
@@ -2432,8 +2437,16 @@ public class HouseOrderController implements HouseOrderAPI {
                     JSONObject h5Refund = JSONObject.parseObject(msg);
 
                     System.out.println(TimeExchange.getTime() + "微信退款返回的信息:" + h5Refund);
-
+                    RefundRecord rpr = new RefundRecord();
+                    rpr.setHouseOrderId(payRecord.getId());
+                    rpr.setRefundNo(refund_no);
+                    rpr.setUserId(Integer.valueOf(houseOrder.getReserveUserId()));
+                    rpr.setRefundPrice(new BigDecimal(total).divide(new BigDecimal("100")).setScale(2));
+                    rpr.setIsSuccess(0);
+                    rpr.setRemark("发起微信支付退款金额:"+total+"- "+TimeExchange.getTime());
+                    houseOrder.setOrderStatus("6");
                     houseOrderService.updateById(houseOrder);
+                    refundRecordService.updateById(rpr);
                     houseNumberStateService.updateById(houseNumberState);
                     return CommonResult.ok(h5Refund);
                 }
@@ -2477,38 +2490,37 @@ public class HouseOrderController implements HouseOrderAPI {
                 JSONObject resourceMap = JSONObject.parseObject(plainText);
                 // 获取 trade_state 值
                 String tradeState = resourceMap.get("refund_status").toString();
-                if (tradeState.equals("SUCCESS")) {
-
-                    // 获取 amount 字段
-                    Map<String, Object> amountMap = (Map<String, Object>) resourceMap.get("amount");
-                    //获得 返回的商户订单号
-                    String outTradeNo = resourceMap.get("out_trade_no").toString();
+                // 获取 amount 字段
+                Map<String, Object> amountMap = (Map<String, Object>) resourceMap.get("amount");
+                //获得 返回的商户订单号
+                String outTradeNo = resourceMap.get("out_trade_no").toString();
 //                    微信支付订单号
-                    String transactionId = resourceMap.get("transaction_id").toString();
+                String transactionId = resourceMap.get("transaction_id").toString();
 //                    商户退款单号
-                    String outRefundNo = resourceMap.get("out_refund_no").toString();
+                String outRefundNo = resourceMap.get("out_refund_no").toString();
 //                    微信支付退款单号
-                    String refundId = resourceMap.get("refund_id").toString();
+                String refundId = resourceMap.get("refund_id").toString();
 //                    退款成功时间
-                    String success_time = resourceMap.get("success_time").toString();
+                String success_time = resourceMap.get("success_time").toString();
 
 //                    用户退款金额
-                    String total_fee = amountMap.get("payer_refund").toString();
-                    //业务逻辑------------
-                    LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
-                    wrapperHo.eq(HouseOrder::getOrderNumber, outTradeNo);
-                    HouseOrder rr = houseOrderService.getOne(wrapperHo);
-                    if (ObjectUtils.isNotEmpty(rr)) {
-                        LambdaQueryWrapper<RefundRecord> wrapperRr = new LambdaQueryWrapper<>();
-                        wrapperRr.eq(RefundRecord::getHouseOrderId, rr.getId());
-                        RefundRecord rpr = refundRecordService.getOne(wrapperRr);
-                        if (rpr == null) {
+                String total_fee = amountMap.get("payer_refund").toString();
+                //业务逻辑------------
+                LambdaQueryWrapper<HouseOrder> wrapperHo = new LambdaQueryWrapper<>();
+                wrapperHo.eq(HouseOrder::getOrderNumber, outTradeNo);
+                PayRecord payRecord=payRecordService.getOne(new QueryWrapper<PayRecord>().eq("pay_no",outTradeNo));
+                HouseOrder rr = houseOrderService.getById(payRecord.getHouseOrderId());
+                LambdaQueryWrapper<RefundRecord> wrapperRr = new LambdaQueryWrapper<>();
+                wrapperRr.eq(RefundRecord::getHouseOrderId, rr.getId());
+                RefundRecord rpr = refundRecordService.getOne(wrapperRr);
+                if (tradeState.equals("SUCCESS")) {
+                    if (rpr == null) {
                             // 保存支付信息
                             rpr = new RefundRecord();
                             rpr.setHouseOrderId(rr.getId());
                             rpr.setUserId(Integer.valueOf(rr.getReserveUserId()));
-                            rpr.setWxNo(outRefundNo);
-                            rpr.setRefundNo(refundId);
+                            rpr.setRefundNo(outRefundNo);
+                            rpr.setWxNo(refundId);
                             System.out.println("回调的金额:" + total_fee);
                             rpr.setRefundPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
                             rpr.setIsSuccess(1);
@@ -2523,12 +2535,12 @@ public class HouseOrderController implements HouseOrderAPI {
                             }
 
                         } else if (rpr.getIsSuccess() != ePayStatu.Paysuccess.getValue()) {
-                            rpr.setWxNo(outRefundNo);
-                            rpr.setRefundNo(refundId);
+                            rpr.setRefundNo(outRefundNo);
+                            rpr.setWxNo(refundId);
                             System.out.println("回调的金额:" + total_fee);
                             rpr.setRefundPrice(new BigDecimal(total_fee).divide(new BigDecimal("100")).setScale(2));
                             rpr.setIsSuccess(1);
-                            rpr.setRemark("微信支付退款成功");
+                            rpr.setRemark(rpr.getRemark()+"|微信支付退款成功金额:"+total_fee+"--"+TimeExchange.getTime());
                             Boolean updateRpr = refundRecordService.updateById(rpr);
                             if (!updateRpr) {
                                 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
@@ -2539,7 +2551,7 @@ public class HouseOrderController implements HouseOrderAPI {
                             }
                         }
 
-                    }
+
 
                     // 订单状态
                     rr.setOrderStatus("9");
@@ -2560,9 +2572,14 @@ public class HouseOrderController implements HouseOrderAPI {
                     jsonObject.put("code", "SUCCESS");
                     jsonObject.put("message", "SUCCESS");
                     response.getWriter().write(jsonObject.toJSONString());
-
-
                 } else {
+                    if (rpr!=null){
+                        rpr.setRefundNo(outRefundNo);
+                        rpr.setWxNo(refundId);
+                        rpr.setIsSuccess(2);
+                        rpr.setRemark(rpr.getRemark()+"|微信支付退款失败:"+tradeState+"--"+TimeExchange.getTime());
+
+                    }
                     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                     JSONObject jsonObject = new JSONObject();
                     jsonObject.put("code", "FAIL");
@@ -2572,16 +2589,16 @@ public class HouseOrderController implements HouseOrderAPI {
             }
         } catch (Exception e) {
             e.printStackTrace();
-//            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-//            JSONObject jsonObject = new JSONObject();
-//            jsonObject.put("code", "FAIL");
-//            jsonObject.put("message", "失败");
-//            response.getWriter().write(jsonObject.toJSONString());
-            response.setStatus(HttpServletResponse.SC_OK);
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
             JSONObject jsonObject = new JSONObject();
-            jsonObject.put("code", "SUCCESS");
-            jsonObject.put("message", "SUCCESS");
+            jsonObject.put("code", "FAIL");
+            jsonObject.put("message", "失败");
             response.getWriter().write(jsonObject.toJSONString());
+//            response.setStatus(HttpServletResponse.SC_OK);
+//            JSONObject jsonObject = new JSONObject();
+//            jsonObject.put("code", "SUCCESS");
+//            jsonObject.put("message", "SUCCESS");
+//            response.getWriter().write(jsonObject.toJSONString());
         }
 
 
@@ -2637,6 +2654,7 @@ public class HouseOrderController implements HouseOrderAPI {
             } catch (Exception e) {
                 return CommonResult.fail("关闭已生成支付订单失败返回:"+e.getMessage());
             }
+            payRecord.setPayPrice(BigDecimal.valueOf(price));
             payRecord.setPayNo(CommonUtil.generateUUID());
             payRecord.setRemark("更新订单");
             payRecordService.updateById(payRecord);
@@ -2680,6 +2698,101 @@ public class HouseOrderController implements HouseOrderAPI {
         return CommonResult.ok(response);
     }
 
+    @Override
+    public CommonResult queryRefundById(String refundNo) {
+        Refund refund= new Refund();
+        Map<String,Object> result=new HashMap<>();
+        HouseOrder one = houseOrderService.getById(refundNo);
+        RefundRecord reFundRecord=refundRecordService.getOne(new QueryWrapper<RefundRecord>().eq("house_order_id",refundNo));
+        if(reFundRecord==null||reFundRecord.getId()==null){
+            result.put("code","1001");
+            result.put("message","该订单没有退款记录");
+            one.setOrderStatus("9");
+            one.setRefundTime(new Date());
+            houseOrderService.updateById(one);
+            return CommonResult.ok(result);
+        }
+        if(reFundRecord.getIsSuccess()==1){
+            result.put("code","200");
+            result.put("message","退款已完成");
+            one.setOrderStatus("9");
+            one.setRefundTime(new Date());
+            houseOrderService.updateById(one);
+            return CommonResult.ok(result);
+        }
+        if(reFundRecord.getIsSuccess()==2){
+            result.put("code","1002");
+            result.put("message","退款失败,原因:"+reFundRecord.getRemark());
+            //失败不更新订房单
+            return CommonResult.ok(result);
+        }
+        //退款中状态去微信查
+        if(reFundRecord.getIsSuccess()==0){
+            QueryByOutRefundNoRequest queryByOutRefundNoRequest = new QueryByOutRefundNoRequest();
+            // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
+//            queryOrderByIdRequest.setSubMchid(wxPayV3Config.getMchId());
+            queryByOutRefundNoRequest.setOutRefundNo(reFundRecord.getRefundNo());
+            log.info("微信支付查询订单入参:"+queryByOutRefundNoRequest.toString());
+            Config config =
+                    new RSAAutoCertificateConfig.Builder()
+                            .merchantId( wxPayV3Config.getMchId())
+                            .privateKeyFromPath(wxPayV3Config.getKeyPath())
+                            .merchantSerialNumber(wxPayV3Config.getSerialNum())
+                            .apiV3Key(wxPayV3Config.getApiKey3())
+                            .build();
+            RefundService service =new RefundService.Builder()
+                    .config(config)
+                    .build();
+            try {
+                refund = service.queryByOutRefundNo(queryByOutRefundNoRequest);
+                log.info("微信退款查询订单出参:"+refund.toString());
+                switch (refund.getStatus()){
+                    case SUCCESS:
+                        one.setOrderStatus("9");
+                        one.setRefundTime(new Date());
+                        reFundRecord.setRefundNo(refund.getOutRefundNo());
+                        reFundRecord.setWxNo(refund.getRefundId());
+                        reFundRecord.setRefundPrice(new BigDecimal(refund.getAmount().getPayerRefund()).divide(new BigDecimal("100")).setScale(2));
+                        reFundRecord.setIsSuccess(1);
+                        reFundRecord.setRemark(reFundRecord.getRemark()+"|微信支付退款成功金额:"+refund.getAmount().getPayerRefund()+"--"+TimeExchange.getTime()+"-"+refund.getUserReceivedAccount());
+                        result.put("code","200");
+                        result.put("message","退款成功");
+                        break;
+                    case PROCESSING:
+                        result.put("code","1003");
+                        result.put("message","退款处理中,请稍后再查询:"+reFundRecord.getRemark());
+                        break;
+                    case CLOSED:
+                        one.setOrderStatus("9");
+                        one.setRefundTime(new Date());
+                        reFundRecord.setIsSuccess(2);
+                        reFundRecord.setRemark(reFundRecord.getRemark()+"|退款处理失败,退款订单被关闭,联系商户处理:"+TimeExchange.getTime());
+                        result.put("code","1004");
+                        result.put("message","退款处理失败,退款订单被关闭,联系商户处理");
+                        break;
+                    case ABNORMAL:
+                        reFundRecord.setIsSuccess(2);
+                        one.setOrderStatus("9");
+                        one.setRefundTime(new Date());
+                        reFundRecord.setRemark(reFundRecord.getRemark()+"|退款处理失败,退款异常,联系商户处理:"+TimeExchange.getTime());
+                        result.put("code","1005");
+                        result.put("message","退款处理失败,退款异常,联系商户处理");
+                        break;
+                }
+                boolean a=houseOrderService.updateById(one);
+                boolean b=refundRecordService.updateById(reFundRecord);
+                if (!a||!b){
+                    throw new Exception("更新支付状态失败");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                return CommonResult.fail(e.getMessage());
+            }
+        }
+        return CommonResult.ok(result);
+    }
+
+
     public static void main(String[] args) throws Exception {
 //        获取签名
         //        随机字符串