| | |
| | | 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.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 |
| | |
| | | |
| | | @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) -> { |
| | |
| | | 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.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(); |
| | | } |
| | | } |
| | | |
| | | |