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