xuhy
2025-03-07 ca8c83c771495363c46b6cfe56a599dfbdbe70d2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/BankOutController.java
@@ -1,8 +1,25 @@
package com.ruoyi.web.controller.api;
import cn.hutool.core.collection.CollectionUtil;
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.enums.BillTypeEnum;
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 +27,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 +44,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,7 +63,164 @@
        return result.getBack();
    }
    @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.setBillNo(orderid);
                    List<String> types = bills.stream().map(bill -> BillTypeEnum.getByCode(Integer.parseInt(bill.getBillType())).getName()).distinct().collect(Collectors.toList());
//           封装详细账单信息
                    respBill.setBillName("缴费:"+CollectionUtil.join(types,","));
                    respBill.setOweAmt(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");*/
                    //欠费金额
                    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();
        }
    }
}