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 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() { }); //交易编号 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 respBills = new ArrayList(); ArrayList respDescDetail = new ArrayList(); QueryBillResponse.Message.Info.Bill respBill = respInfo.new Bill(); //缴费子商户账单 // ArrayList splitSubMerInfos = new ArrayList(); //封装返回给缴费中心的响应 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 orderBills = orderBillService.getByOrderNo(orderid); List bills = orderBills.stream().map(ob -> tBillService.getDetailByBillId(ob.getBillId())).collect(Collectors.toList()); respBill.setBillNo(orderid); List 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(); } } }