From a7e4ea612c4ab32118a796c4ef41a5c589af21c0 Mon Sep 17 00:00:00 2001
From: yupeng <roc__yu@163.com>
Date: 星期四, 06 三月 2025 13:54:18 +0800
Subject: [PATCH] feat: 更新创建订单接口,修改金额校验,新增银行查单接口

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java |  193 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 190 insertions(+), 3 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 bcb7af3..fd0274e 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
@@ -1,8 +1,23 @@
 package com.ruoyi.web.controller.api;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.ruoyi.common.constant.AmountConstant;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.model.TOrderBill;
+import com.ruoyi.system.model.TPayOrder;
 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.service.BankService;
+import com.taxi591.bankapi.service.SignatureAndVerification;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -10,9 +25,16 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @RestController
 @RequestMapping("open/bank")
+@Slf4j
 public class BankOutController {
 
     @Autowired
@@ -20,6 +42,16 @@
 
     @Autowired
     TBillService tBillService;
+
+    @Autowired
+    SignatureAndVerification signatureAndVerification;
+
+    @Autowired
+    TOrderBillService orderBillService;
+
+    @Autowired
+    TPayOrderService payOrderService;
+
     @PostMapping(value = "payCallback")
     public @ResponseBody String payCallback(HttpServletRequest request){
         CovertPayBackResult result = bankService.covertPayCallBack(request, (billRequest) -> {
@@ -29,9 +61,164 @@
         return result.getBack();
     }
 
-    @PostMapping(value = "bills")
-    public @ResponseBody String bills(HttpServletRequest request){
-        return "";
+    @PostMapping(value = "queryBill")
+    public void bills(HttpServletRequest request, HttpServletResponse httpServletResponse){
+        log.info("进入QueryBillController账单查询接口--------(金额规则为0的)-------");
+
+        String responseJson = null;
+        try {
+            //接收报文request返回截取并返回requestBody和使用base64解析后的requestBody
+            Map<String, String> requestMap = signatureAndVerification.requestBodyOfBase64(request);
+            //使用base64解析完成后的requestBody
+            String requestBodyOfDecoded = requestMap.get("requestBodyOfDecoded");
+            //解析前的requestBody
+            String requestBody = requestMap.get("requestBody");
+            //获取缴费中心传送过来的签名
+            String signatureString = requestMap.get("signatureString");
+
+            // 验签
+            boolean flag = signatureAndVerification.read_cer_and_verify_sign(requestBody,
+                    signatureString);
+
+            log.info("【QueryBill:getBill4DirectJoinMerch】缴费中心响应的报文验签结果为:{}" , flag);
+
+            QueryBillRequest queryBillRequest = JSON.parseObject(requestBodyOfDecoded,
+                    new TypeReference<QueryBillRequest>() {
+                    });
+            //交易编号
+            String traceNo = queryBillRequest.getMessage().getInfo()
+                    .getTraceNo();
+            //返回给缴费中心的响应
+            QueryBillResponse response = new QueryBillResponse(queryBillRequest);
+            QueryBillResponse.Message respMessage = response.getMessage();
+            QueryBillResponse.Message.Head respHead = response.getMessage()
+                    .getHead();
+            QueryBillResponse.Message.Info respInfo = response.getMessage()
+                    .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>();
+            QueryBillResponse.Message.Info.Bill respBill = respInfo.new Bill();
+            //缴费子商户账单
+//            ArrayList<QueryBillResponse.Message.Info.Bill.SplitSubMerInfo> splitSubMerInfos = new ArrayList<QueryBillResponse.Message.Info.Bill.SplitSubMerInfo>();
+
+            //封装返回给缴费中心的响应
+
+            String epayCode = queryBillRequest.getMessage().getInfo()
+                    .getEpayCode();
+            respInfo.setEpayCode(epayCode);
+            String merchantId = queryBillRequest.getMessage().getInfo()
+                    .getMerchantId();
+            respInfo.setMerchantId(merchantId);
+            respInfo.setTraceNo(traceNo);
+            respInfo.setInput1(queryBillRequest.getMessage().getInfo()
+                    .getInput1());
+            respInfo.setInput2(queryBillRequest.getMessage().getInfo()
+                    .getInput2());
+            respInfo.setInput3(queryBillRequest.getMessage().getInfo()
+                    .getInput3());
+            respInfo.setInput4(queryBillRequest.getMessage().getInfo()
+                    .getInput4());
+            respInfo.setInput5(queryBillRequest.getMessage().getInfo()
+                    .getInput5());
+            String orderid= queryBillRequest.getMessage().getInfo().getInput1();
+            if (StringUtils.isEmpty(orderid)){
+                respHead.setReturnCode("0009");
+                respHead.setReturnMessage("参数错误,input1订单号不能为空");
+            }else{
+                if (flag){
+
+                    TPayOrder order = payOrderService.getById(orderid);
+                    List<TOrderBill> orderBills = orderBillService.getByOrderNo(orderid);
+                    List<TBillDto> bills = orderBills.stream().map(ob
+                            -> tBillService.getDetailByBillId(ob.getBillId())).collect(Collectors.toList());
+
+//	        封装详细账单信息
+                    respBill.setBillName(order.getUserName());
+                    respBill.setFeeAmt(BigDecimal.valueOf(order.getAmount()).divide(AmountConstant.b100,2, RoundingMode.HALF_DOWN).toPlainString());
+                    respBills.add(respBill);
+                    respInfo.setCustName(order.getUserName());
+                    respInfo.setCustAddress("");
+                    respInfo.setCacheMem("");
+                    respInfo.setRemark("");
+                    respInfo.setCallBackText("西藏国资委");
+                    //respInfo.setCallBackUrl("https://abcsr.keepfx.cn/b/ejy/payResult/");
+                    //使用base64加密信息
+//                    respInfo.setCallBackUrl("aHR0cDp3d3cuYWJjaGluYS5jb20vY24v");
+                    //金额规则字段
+                    String amtRule = "0";
+                    respInfo.setAmtRule(amtRule);
+	            /*QueryBillResponse.Message.Info.Bill.UnitDetail unitDetail = respBill.new UnitDetail(
+	                    "unitName", "6.66", "1");*/
+                    BigDecimal outstandAmount = bills.stream().map(TBillDto::getOutstandingMoney).reduce(BigDecimal::add).get();
+                    //欠费金额
+                    respBill.setOweAmt(outstandAmount.setScale(2,RoundingMode.HALF_DOWN).toPlainString());
+                    respBill.setFeeAmt("0.00");
+//
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail1 = respBill.new DescDetail(
+//                            "缴费月份:", "2020年6月份");
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail2 = respBill.new DescDetail(
+//                            "供电局编号:", "4340152");
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail3 = respBill.new DescDetail(
+//                            "欠费金额:", "0.00元");
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail4 = respBill.new DescDetail(
+//                            "缴费月份:", "2020年6月份");
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail5 = respBill.new DescDetail(
+//                            "服务时间:", "每天0:30-23:30期间均可缴费");
+//                    QueryBillResponse.Message.Info.Bill.DescDetail descDtail6 = respBill.new DescDetail(
+//                            "温馨提示:", "北京电力电费代缴,咨询电话:95598 该用户为:预付费用户");
+//                    respDescDetail.add(descDtail1);
+//                    respDescDetail.add(descDtail2);
+//                    respDescDetail.add(descDtail3);
+//                    respDescDetail.add(descDtail4);
+//                    respDescDetail.add(descDtail5);
+//                    respDescDetail.add(descDtail6);
+
+//                    respBill.setRcvMerchantId("103881104410001");
+
+//	          商户子商户详细信息
+//                    QueryBillResponse.Message.Info.Bill.SplitSubMerInfo splitSubMerInfo1 =respBill.new SplitSubMerInfo("10388", "0.01");
+//                    QueryBillResponse.Message.Info.Bill.SplitSubMerInfo splitSubMerInfo2 =respBill.new SplitSubMerInfo("1038819201", "0.02");
+//                    splitSubMerInfos.add(splitSubMerInfo1);
+//                    splitSubMerInfos.add(splitSubMerInfo2);
+
+//                    respBill.setSplitSubMerInfos(splitSubMerInfos);
+//                    respBill.setDescDetails(respDescDetail);
+                    respInfo.setTotalBillCount(String.valueOf(respBills.size()));
+                    respInfo.setBill(respBills);
+
+                    // 有定制电子回单附言信息的,需添加自定义定制附言信息字段
+                    respInfo.setMerchantRemark("");
+                    respHead.setReturnCode("0000");
+                    respHead.setReturnMessage("账单查询成功,返回成功标志");
+                }else {
+                    respHead.setReturnCode("0009");
+                    respHead.setReturnMessage("缴费中心传送给商户的请求报文签名验签失败!");
+                }
+            }
+
+            respHead.setTransFlag("02");
+            respHead.setTimeStamp(DateUtil.format(new Date(),"yyyyMMddHHmmssSSS"));
+
+            respMessage.setInfo(respInfo);
+            respMessage.setHead(respHead);
+            response.setMessage(respMessage);
+            responseJson = JSON.toJSONString(response);
+            // 加签名
+            String signatrue = signatureAndVerification
+                    .signWhithsha1withrsa(responseJson);
+            log.info("signatrue" + responseJson);
+            log.info("responseJson打印结果是(responseJson加密前):" + responseJson);
+            responseJson = signatrue + "||"
+                    + new String(Base64.encodeBase64(responseJson.getBytes("utf-8")));
+            log.info("responseJson打印结果是(responseJson加密后):{}", responseJson);
+            httpServletResponse.setCharacterEncoding("utf-8");
+            httpServletResponse.setContentType("text/plain");
+            httpServletResponse.getWriter().write(responseJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
 

--
Gitblit v1.7.1