From f708174b00e73a501dca4eb5ffb23520b4be3f67 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 26 三月 2025 15:45:24 +0800
Subject: [PATCH] Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/xizang into dev

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java |  201 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 190 insertions(+), 11 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java
index 56ef4cd..b45ecd7 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java
@@ -6,6 +6,7 @@
 import com.alibaba.fastjson.TypeReference;
 import com.ruoyi.common.constant.AmountConstant;
 import com.ruoyi.common.enums.BillTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.TBillDto;
 import com.ruoyi.system.model.TOrderBill;
@@ -13,9 +14,7 @@
 import com.ruoyi.system.service.TBillService;
 import com.ruoyi.system.service.TOrderBillService;
 import com.ruoyi.system.service.TPayOrderService;
-import com.taxi591.bankapi.dto.CovertPayBackResult;
-import com.taxi591.bankapi.dto.QueryBillRequest;
-import com.taxi591.bankapi.dto.QueryBillResponse;
+import com.taxi591.bankapi.dto.*;
 import com.taxi591.bankapi.service.BankService;
 import com.taxi591.bankapi.service.SignatureAndVerification;
 import lombok.extern.slf4j.Slf4j;
@@ -28,9 +27,14 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -54,13 +58,188 @@
     @Autowired
     TPayOrderService payOrderService;
 
+    public static String getRequestBody(HttpServletRequest request)
+            throws IOException {
+        /** 读取httpbody内容 */
+        StringBuilder httpBody = new StringBuilder();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new InputStreamReader(
+                    request.getInputStream()));
+            String line = null;
+            while ((line = br.readLine()) != null) {
+                httpBody.append(line);
+            }
+        } catch (IOException ex) {
+            throw ex;
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+        return httpBody.toString();
+    }
+
     @PostMapping(value = "payCallback")
-    public @ResponseBody String payCallback(HttpServletRequest request){
-        CovertPayBackResult result = bankService.covertPayCallBack(request, (billRequest) -> {
-            tBillService.completePay(billRequest);
-            return true;
-        });
-        return result.getBack();
+    public void payCallback(HttpServletRequest servletRequest,HttpServletResponse servletResponse){
+        String request = null;
+        String responseJson = null;
+        try {
+            log.info("--------进入getRequest4Sale----------------------------------");
+            // 接收报文
+            String requestContent = getRequestBody(servletRequest).trim();
+            String signatureString = requestContent.substring(0,
+                    requestContent.indexOf("||"));
+            log.info("-----ChargeBillController------------截取报文的signatureString:{}", signatureString);
+            String requestBody = requestContent.substring(signatureString
+                    .length() + 2);
+            log.info("-----ChargeBillController------------截取报文的requestBody:{}", requestBody);
+            //如果有双引号,则截取双引号内requestBody的内容
+            Pattern p=Pattern.compile("\"");
+            Matcher m=p.matcher(requestBody);
+            while(m.find()){
+                requestBody=requestBody.replace(m.group(), "");
+                log.info("-----ChargeBillController------如果有双引号,则截取后的requestBody:{}", requestBody);
+            }
+            //requestBody是base64加密后的数据,需解析出来
+            request = new String(
+                    com.alibaba.fastjson.util.Base64.decodeFast(requestBody));
+            log.info("-----ChargeBillController------------解析完成后的requestBody-------{}" + request);
+            ChargeBillRequest chargeBillRequest = JSON.parseObject(request,
+                    new TypeReference<ChargeBillRequest>() {
+                    });
+            boolean b = signatureAndVerification.read_cer_and_verify_sign(requestBody,
+                    signatureString);
+            if (!b){
+                throw new ServiceException("验签失败");
+            }
+            /** 销账报文重发次数,通过resendTimes此字段识别销账报文是否为重发的,0表示首次、1表示重发一次,2表示重发2次,最多重发3次*/
+            if(chargeBillRequest!=null && "0".equals(chargeBillRequest.getMessage().getInfo().getResendTimes())){
+                ChargeBillResponse chargeBillResponse = new ChargeBillResponse(
+                        chargeBillRequest);
+                ChargeBillResponse.Message respMessage = chargeBillResponse
+                        .getMessage();
+                ChargeBillResponse.Message.Head respHead = chargeBillResponse
+                        .getMessage().getHead();
+                ChargeBillResponse.Message.Info respInfo = chargeBillResponse
+                        .getMessage().getInfo();
+                respHead.setTransFlag("02");
+                respHead.setTimeStamp(DateUtil.format(new Date(),"yyyyMMddHHmmssSSS"));
+                // respHead.setChannel("MBNK");
+                respHead.setChannel(chargeBillRequest.getMessage().getHead()
+                        .getChannel());
+                // respHead.setTranCode("chargeBill");
+                respHead.setTransCode(chargeBillRequest.getMessage().getHead()
+                        .getTransCode());
+                respHead.setTransSeqNum(chargeBillRequest.getMessage().getHead()
+                        .getTransSeqNum());
+                //测试销账返回报文中,本来是销账成功的报文,但是不要送0000成功码   (JF190510134746710555这个流水号是在Demo的returnCode设置成null的时候产生的,流水状态为6;)
+
+                String epayCode = chargeBillRequest.getMessage().getInfo()
+                        .getEpayCode();
+                String traceNo = chargeBillRequest.getMessage().getInfo()
+                        .getTraceNo();
+                String numOpenMerchantOrder = chargeBillRequest.getMessage()
+                        .getInfo().getNumOpenMerchantOrder();
+                respInfo.setNumOpenMerchantOrder(numOpenMerchantOrder);
+                respInfo.setEpayCode(epayCode);
+                respInfo.setTraceNo(traceNo);
+
+                try{
+                    tBillService.completePay(chargeBillRequest);
+                    respHead.setReturnCode("0000");
+                    respHead.setReturnMessage("账单缴费成功");
+                }catch (Exception e){
+                    respHead.setReturnCode("1111");
+                    respHead.setReturnMessage("账单处理失败");
+                    log.error("支付第一次回调出现异常,{}",request,e);
+                }
+                //第一次处理失败,不退款
+                respInfo.setRefundFlag("false");
+                respMessage.setInfo(respInfo);
+                respMessage.setHead(respHead);
+                chargeBillResponse.setMessage(respMessage);
+                responseJson = JSON.toJSONString(chargeBillResponse);
+                //加签名
+                String signatrue = signatureAndVerification
+                        .signWhithsha1withrsa(responseJson);
+                log.info("-----ChargeBillController------------responseJson打印结果是(responseJson加密前):" + responseJson);
+                responseJson = signatrue + "||"
+                        + new String(Base64.encodeBase64(responseJson.getBytes("utf-8")));
+                log.info("-----ChargeBillController------------responseJson打印结果是(responseJson加密后):" + responseJson);
+                servletResponse.setCharacterEncoding("utf-8");
+                servletResponse.setContentType("text/plain");
+                servletResponse.getWriter().write(responseJson);
+            }else{
+                //销账报文重发次数,通过resendTimes此字段识别销账报文是否为重发的,0表示首次、1表示重发一次,2表示重发2次,最多重发3次
+                //商户端要注意销账重复通知的情况,要进行订单唯一性处理
+
+
+                ChargeBillResponse chargeBillResponse = new ChargeBillResponse(
+                        chargeBillRequest);
+                ChargeBillResponse.Message respMessage = chargeBillResponse
+                        .getMessage();
+                ChargeBillResponse.Message.Head respHead = chargeBillResponse
+                        .getMessage().getHead();
+                ChargeBillResponse.Message.Info respInfo = chargeBillResponse
+                        .getMessage().getInfo();
+                respHead.setTransFlag("02");
+                respHead.setTimeStamp(DateUtil.format(new Date(),"yyyyMMddHHmmssSSS"));
+                // respHead.setChannel("MBNK");
+                respHead.setChannel(chargeBillRequest.getMessage().getHead()
+                        .getChannel());
+                // respHead.setTranCode("chargeBill");
+                respHead.setTransCode(chargeBillRequest.getMessage().getHead()
+                        .getTransCode());
+                respHead.setTransSeqNum(chargeBillRequest.getMessage().getHead()
+                        .getTransSeqNum());
+                try{
+                    tBillService.completePay(chargeBillRequest);
+                    respHead.setReturnCode("0000");
+                    respHead.setReturnMessage("账单缴费成功");
+                }catch (Exception e){
+                    respHead.setReturnCode("1111");
+                    respHead.setReturnMessage("账单处理失败");
+                    log.error("支付第一次回调出现异常,{}",request,e);
+                }
+                // 再次推送未处理成功,则返回退款标志
+                if (!"0000".equals(respHead.getReturnCode())) {
+                    respInfo.setRefundFlag("true");
+                }
+                String epayCode = chargeBillRequest.getMessage().getInfo()
+                        .getEpayCode();
+                String traceNo = chargeBillRequest.getMessage().getInfo()
+                        .getTraceNo();
+                String numOpenMerchantOrder = chargeBillRequest.getMessage()
+                        .getInfo().getNumOpenMerchantOrder();
+                respInfo.setNumOpenMerchantOrder(numOpenMerchantOrder);
+                respInfo.setEpayCode(epayCode);
+                respInfo.setTraceNo(traceNo);
+
+                respMessage.setInfo(respInfo);
+                respMessage.setHead(respHead);
+                chargeBillResponse.setMessage(respMessage);
+                responseJson = JSON.toJSONString(chargeBillResponse);
+                //加签名
+                String signatrue = signatureAndVerification
+                        .signWhithsha1withrsa(responseJson);
+                log.info("-----ChargeBillController------------responseJson打印结果是(responseJson加密前):" + responseJson);
+                responseJson = signatrue + "||"
+                        + new String(Base64.encodeBase64(responseJson.getBytes("utf-8")));
+                log.info("-----ChargeBillController------------responseJson打印结果是(responseJson加密后):" + responseJson);
+                servletResponse.setCharacterEncoding("utf-8");
+                servletResponse.setContentType("text/plain");
+                servletResponse.getWriter().write(responseJson);
+
+            }
+
+        }catch (Exception e) {
+            log.error("处理支付回调发生异常:返回内容:{}",request,e);
+        }
     }
 
     @PostMapping(value = "queryBill")
@@ -99,8 +278,8 @@
                     .getInfo();
             //缴费账单子账单
             ArrayList<QueryBillResponse.Message.Info.Bill> respBills = new ArrayList<QueryBillResponse.Message.Info.Bill>();
-            ArrayList<QueryBillResponse.Message.Info.Bill.DescDetail> respDescDetail =
-                    new ArrayList<QueryBillResponse.Message.Info.Bill.DescDetail>();
+//            ArrayList<QueryBillResponse.Message.Info.Bill.DescDetail> respDescDetail =
+//                    new ArrayList<QueryBillResponse.Message.Info.Bill.DescDetail>();
             QueryBillResponse.Message.Info.Bill respBill = respInfo.new Bill();
             //缴费子商户账单
 //            ArrayList<QueryBillResponse.Message.Info.Bill.SplitSubMerInfo> splitSubMerInfos = new ArrayList<QueryBillResponse.Message.Info.Bill.SplitSubMerInfo>();

--
Gitblit v1.7.1