xuhy
2025-03-07 ca8c83c771495363c46b6cfe56a599dfbdbe70d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
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;
import org.springframework.web.bind.annotation.ResponseBody;
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
    BankService bankService;
 
    @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) -> {
            tBillService.completePay(billRequest);
            return true;
        });
        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();
        }
    }
 
 
}