package com.boying.controller.phone; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.boying.common.BaseController; import com.boying.common.R; import com.boying.common.ReturnData; import com.boying.common.SystemConfigProperties; import com.boying.entity.*; import com.boying.service.*; import com.boying.util.HTTPEntityUtil; import com.google.gson.Gson; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletRequest; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.UnsupportedEncodingException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import static com.boying.util.MyX509TrustManager.httpsRequest; /** * @author kdq * @version 1.0.0 * @ClassName PayController.java * @Description TODO * @createTime 2022年11月22日 15:19:00 */ @RestController @RequestMapping("ffzf/ffPay") @RequiredArgsConstructor @Tag(description = "ffzf/ffPay" , name = "对接财政支付接口" ) public class PayController extends BaseController { private final OrderRecordService orderRecordService; private final TicketService ticketService; private final TicketBlackService ticketBlackService; private final OutParkService outParkService; @Autowired private final SystemConfigProperties systemConfigProperties; private final ParkService parkService; private final WhiteListService whiteListService; private final NowPayOrderService nowPayOrderService; static String payKey = "df937eda27cb4a59a12347966678e232"; static String paySecret = "9e3b2f387b5b4232a9c782affc9c36ed"; static String payerTypeCode = "1304062100000001"; static String payerTypeCode2 = "1304062100000002"; static String ip = "https://pay.hebcz.cn"; static String ip2 = "http://nontax.hebcz.cn"; //生成电子缴款码 @PostMapping("zhiFa") @Operation(summary = "执法生成缴款码" , description = "执法生成缴款码" ) public Object zhiFa(Long id){ Ticket ticket = ticketService.getById(id); if(ticket.getPayStatus()==1){ return error("此罚单已支付"); } if(ticket.getStatus()==3){ return error("此罚单已撤销"); } StringBuffer sbf = new StringBuffer(); StringBuffer s = new StringBuffer(); if(ticket.getMoney()==0){ s.append("amt=0.01"); }else{ DecimalFormat df = new DecimalFormat("#0.00"); s.append("amt="+df.format(ticket.getMoney()).toString()); } s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result"); s.append("&payKey=df937eda27cb4a59a12347966678e232"); s.append("&payerName="+ticket.getCarNo()); s.append("&payerNum="+ticket.getCode()); s.append("&payerTypeCode=1304062100000001"); s.append("&reserve1="); s.append("&reserve2="); s.append("&reserve3="); s.append("&returnUrl="); sbf.append(s.toString()); s.append("&paySecret=9e3b2f387b5b4232a9c782affc9c36ed"); String encode = null; try { encode = DigestUtils.md5DigestAsHex(s.toString().getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } sbf.append("&sign="+encode); sbf.append("&signType=MD5"); System.out.println(sbf.toString()); String s1 = httpsRequest(ip + "/pay/inpay", "POST", sbf.toString()); System.out.println(s1); if(s1.equals("error")){ return error("生成电子缴款码失败,请联系管理员"); } JSONObject jsonObject = JSON.parseObject(s1); String payCode = ""; if(jsonObject.get("payCode")==null){ String eInfo = jsonObject.get("errorInfo").toString(); if(eInfo.equals("此订单已过期")){ ticket.setCode(System.currentTimeMillis()+""); String payCode2 = zhiFa2(ticket); ticket.setPayCode(payCode2); ticketService.save(ticket); addOrderRecord2(ticket); return success("生成执法电子缴款码","https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+payCode); } return error(jsonObject.get("errorInfo").toString()); } payCode = jsonObject.get("payCode").toString(); ticket.setPayCode(payCode); ticketService.save(ticket); addOrderRecord2(ticket); return success("生成执法电子缴款码","https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+payCode); } public String zhiFa2(Ticket ticket){ StringBuffer sbf = new StringBuffer(); StringBuffer s = new StringBuffer(); if(ticket.getMoney()==0){ s.append("amt=0.01"); }else{ DecimalFormat df = new DecimalFormat("#0.00"); s.append("amt="+df.format(ticket.getMoney()).toString()); } s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result"); s.append("&payKey=df937eda27cb4a59a12347966678e232"); s.append("&payerName="+ticket.getCarNo()); s.append("&payerNum="+ticket.getCode()); s.append("&payerTypeCode=1304062100000001"); s.append("&reserve1="); s.append("&reserve2="); s.append("&reserve3="); s.append("&returnUrl="); sbf.append(s.toString()); s.append("&paySecret=9e3b2f387b5b4232a9c782affc9c36ed"); String encode = null; try { encode = DigestUtils.md5DigestAsHex(s.toString().getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } sbf.append("&sign="+encode); sbf.append("&signType=MD5"); String s1 = httpsRequest(ip + "/pay/inpay", "POST", sbf.toString()); JSONObject jsonObject = JSON.parseObject(s1); String payCode = jsonObject.get("payCode").toString(); return payCode; } //支付接口通知 @PostMapping("result") @Operation(summary = "缴费结果通知" , description = "缴费结果通知" ) public String result(HttpServletRequest request, String payKey, String payerTypeCode, String payerNum, String payCode, Double amt, String status, String errorInfo, String sign, String signType) throws Exception{ try { // updateOrderRecord(payCode,status); }catch (Exception e){ e.printStackTrace(); } return "success"; } //生成电子缴款码 @PostMapping("park2") @Operation(summary = "财政缴费更新生成缴款码" , description = "财政缴费更新生成缴款码" ) public Object park2(Long id){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); String logs = sdf.format(new Date())+"开始扫码缴费------》\n"; logs += "出场表id为:"+id+",\n"; OutPark outPark = outParkService.getById(id); if(outPark.getPrice()==0){ updateOutPark(outPark.getId(),"03"); logs += "支付金额为0,\n"; writeTxt(logs); return error("本次停车无需支付费用"); } //判断是否在白名单 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(WhiteList::getCarNo,outPark.getCarNo()); List all = whiteListService.list(wrapper); for(WhiteList w : all){ if(w.getType()==0){ logs+=outPark.getCarNo()+"在白名单,\n"; updateOutPark(outPark.getId(),"03"); writeTxt(logs); return error("本次停车无需支付费用!"); }else{ if(w.getParkId()!=null){ if(w.getEndTime()!=null){ if(w.getParkId().equals(outPark.getParkId())&&System.currentTimeMillis() wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(WhiteList::getCarNo,outPark.getCarNo()); List all = whiteListService.list(wrapper); for(WhiteList w : all){ if(w.getType()==0){ logs+=outPark.getCarNo()+"在白名单,\n"; updateOutPark(outPark.getId(),"03"); writeTxt(logs); return R.failed("本次停车无需支付费用!"); }else{ if(w.getParkId()!=null){ if(w.getEndTime()!=null){ if(w.getParkId().equals(outPark.getParkId())&&System.currentTimeMillis() details = new ArrayList<>(); ApplyTicket.detail detail = new ApplyTicket.detail(); detail.setItemstandardtype(""); detail.setAmount(1); detail.setAmt(outPark.getPrice()); detail.setIncitemcode("072101"); detail.setMeasureunit(""); details.add(detail); ApplyTicket applyTicket = new ApplyTicket(); applyTicket.setBusinum(l); applyTicket.setFilldate(format); applyTicket.setPayer(outPark.getCarNo()); applyTicket.setPayeraccount(""); applyTicket.setPayerbank(""); applyTicket.setPayerphonenumber("18888888888"); applyTicket.setPayee("河北省财政厅"); applyTicket.setAmt(outPark.getPrice()); applyTicket.setMemo(""); applyTicket.setOverdate(""); applyTicket.setState(1); applyTicket.setDetails(details); String jsonStr = JSON.toJSONString(applyTicket, SerializerFeature.WriteDateUseDateFormat); Map map = JSON.parseObject(jsonStr, new TypeReference>() {}); RestTemplate restTemplate = new RestTemplate(); ResponseEntity entity = restTemplate.postForEntity(urlIP+applyetcketnum, HTTPEntityUtil.setEntity(map), ReturnData.class); if(entity.getBody().getCode() == 1){ System.out.println("支付申请缴款码返回为:"+entity.getBody()); Object o = entity.getBody().getData().get(0); String s = JSON.toJSONString(o); Map map1 = (Map)JSON.parse(s); String payurl = (String)map1.get("payurl"); String eticketnum = (String)map1.get("eticketnum"); outPark.setPayCode(eticketnum); outPark.setCode2(l); outParkService.saveOrUpdate(outPark); addOrderRecord(outPark); return payurl+eticketnum; }else { return null; } } /** * 获取执法id */ @PostMapping("getZhifaId") @Operation(summary = "更新大厅缴款码" , description = "更新大厅缴款码" ) public Object getZhifaId(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(NowPayOrder::getType,0) .orderByDesc(NowPayOrder::getCreateTime) .last(" limit 1"); NowPayOrder one = nowPayOrderService.getOne(wrapper); if(one == null){ return R.failed(null,"暂无缴费项目"); }else { return R.ok(ticketService.getById(one.getQueryId())); } } /** * 缴款书 */ @PostMapping("zhifa") @Operation(summary = "执法缴费(新)" , description = "执法缴费(新)" ) public Object zhifa(Long id){ System.out.println(id+"开始缴费"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); String logs = sdf.format(new Date())+"开始扫码缴费------》\n"; logs += "罚单表id为:"+id+",\n"; Ticket ticket = ticketService.getById(id); if(ticket.getMoney()==0){ updateTicket(ticket.getId(),"03"); logs += "支付金额为0,\n"; writeTxt(logs); return R.failed("本罚单无需支付费用"); } if(StringUtils.isNotBlank(ticket.getPayCode()) && ticket.getPayStatus() == 0){ return R.ok("生成电子罚单缴款码", "https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+ticket.getPayCode()); }else if(StringUtils.isNotBlank(ticket.getPayCode()) && ticket.getPayStatus() == 1){ return R.failed("已缴费"); } if(StringUtils.isBlank(ticket.getPayCode())){ return R.ok("生成电子罚单缴款码", getPayUrl2(ticket)); }else { return R.failed("出错"); } } /** * 获取缴款码 * @param ticket * @return */ public String getPayUrl2(Ticket ticket){ String urlIP = systemConfigProperties.getIp4(); String applyetcketnum = systemConfigProperties.getAPPLYETCKETNUM(); //申请缴款书,唯一码为出场id+时间戳 String idStr = ticket.getId()+""; String dateStr = DateUtil.currentSeconds()+""; String l = idStr + dateStr; SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf2.format(new Date()); List< ApplyTicket.detail> details = new ArrayList<>(); ApplyTicket.detail detail = new ApplyTicket.detail(); detail.setItemstandardtype(""); detail.setAmount(1); detail.setAmt(ticket.getMoney()); detail.setIncitemcode("050114"); detail.setMeasureunit(""); details.add(detail); ApplyTicket applyTicket = new ApplyTicket(); applyTicket.setBusinum(l); applyTicket.setFilldate(format); applyTicket.setPayer(ticket.getCarNo()); applyTicket.setPayeraccount(""); applyTicket.setPayerbank(""); applyTicket.setPayerphonenumber("18888888888"); applyTicket.setPayee("河北省财政厅"); applyTicket.setAmt(ticket.getMoney()); applyTicket.setMemo(""); applyTicket.setOverdate(""); applyTicket.setState(1); applyTicket.setDetails(details); String jsonStr = JSON.toJSONString(applyTicket, SerializerFeature.WriteDateUseDateFormat); Map map = JSON.parseObject(jsonStr, new TypeReference>() {}); RestTemplate restTemplate = new RestTemplate(); ResponseEntity entity = restTemplate.postForEntity(urlIP+applyetcketnum, HTTPEntityUtil.setEntity(map), ReturnData.class); if(entity.getBody().getCode() == 1){ System.out.println("支付申请缴款码返回为:"+entity.getBody()); Object o = entity.getBody().getData().get(0); String s = JSON.toJSONString(o); Map map1 = (Map)JSON.parse(s); String payurl = (String)map1.get("payurl"); String eticketnum = (String)map1.get("eticketnum"); ticket.setPayCode(eticketnum); ticket.setCode2(l); ticketService.saveOrUpdate(ticket); addOrderRecord2(ticket); return payurl+eticketnum; }else { System.out.println("支付申请缴款码返回为:"+entity); return null; } } /** * 1.停车缴费流程:获取缴款码->生成订单->支付接口返回通知->更新订单->更新出场表 * 2.罚单流程: 获取缴款码->生成罚单->生成订单->支付接口返回通知->更新订单->更新罚单->更新车辆 * */ //更新订单记录 public void updateOrderRecord(Integer queryId,String status){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(OrderRecord::getQueryId,queryId) .orderByDesc(OrderRecord::getCreateTime); List all = orderRecordService.list(wrapper); if(all.size()>=1){ OrderRecord orderRecord = all.get(0); if(status.equals("01")){ orderRecord.setStatus(0); } if(status.equals("03")){ orderRecord.setStatus(1); //测试环境,暂时把开票设置为2 orderRecord.setTicketStatus(2); } if(status.equals("04")||status.equals("05")||status.equals("06")){ orderRecord.setStatus(2); } orderRecordService.saveOrUpdate(orderRecord); if(orderRecord.getType()==0){ updateTicket(orderRecord.getQueryId(),status); }else{ updateOutPark(orderRecord.getQueryId(),status); } } } //更新罚单的状态 public void updateTicket(Integer ticketId,String status){ Ticket ticket = ticketService.getById(ticketId); if(ticket!=null){ if(status.equals("01")){ ticket.setPayStatus(0); } if(status.equals("03")){ ticket.setPayStatus(1); dealCar(ticket.getCarNo()); if(StringUtils.isBlank(ticket.getNumber()) || "--".equals(ticket.getNumber())){ ticket = ticketService.getNumber(ticket); ticket.setPush(0); ticketService.uploadInfo(ticket); return; } } if(status.equals("04")||status.equals("05")||status.equals("06")){ ticket.setPayStatus(2); } ticketService.saveOrUpdate(ticket); } } //更新缴费状态 private void dealCar(String carNo){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(Ticket::getCarNo,carNo) .eq(Ticket::getPayStatus,1); List tickets = ticketService.list(wrapper); if(tickets.size()==0){ //更新缴费状态 QueryWrapper wrapper1 = new QueryWrapper<>(); wrapper1.lambda() .eq(TicketBlack::getCarNo,carNo); List all = ticketBlackService.list(wrapper1); if(all.size()>0){ TicketBlack ticketBlack = all.get(0); ticketBlack.setViolationCount(ticketBlack.getViolationCount() == 0?0:ticketBlack.getViolationCount() - 1); if(ticketBlack.getIsActive() == 0){ ticketBlack.setStatus(1); ticketBlack.setBlackType(0); } ticketBlackService.saveOrUpdate(ticketBlack); } } } public void updateOutPark(Integer outParkId, String status){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss"); String s = sdf.format(new Date())+"开始修改出场表-----》\n"; s+= "outparkId==="+outParkId+",status==="+status+",\n"; OutPark outPark = outParkService.getById(outParkId); if(outPark!=null){ s += "找到出场数据:"+outPark.getId()+",\n"; writeTxt(s); if(status.equals("03")){ s += "出场数据修改----》"; writeTxt(s); outPark.setStatus(1); outParkService.saveOrUpdate(outPark); } }else { s += "未找到出场数据-----》"; writeTxt(s); } } //插入停车订单记录 public void addOrderRecord(OutPark outPark){ Park park = parkService.getById(outPark.getParkId()); OrderRecord orderRecord = new OrderRecord(); orderRecord.setAddress(park.getName()); orderRecord.setCarNo(outPark.getCarNo()); orderRecord.setCode(outPark.getCode()); orderRecord.setCode2(outPark.getCode2()); orderRecord.setMoney(outPark.getPrice()); orderRecord.setQueryId(outPark.getId()); orderRecord.setType(1); orderRecord.setTicketStatus(0); orderRecord.setPayCode(outPark.getPayCode()); orderRecordService.saveOrUpdate(orderRecord); } //插入执法订单记录 public void addOrderRecord2(Ticket ticket){ OrderRecord orderRecord = new OrderRecord(); orderRecord.setAddress(ticket.getAddress()); orderRecord.setCarNo(ticket.getCarNo()); orderRecord.setCode(ticket.getCode()); orderRecord.setCode2(ticket.getCode2()); orderRecord.setMoney(ticket.getMoney()); orderRecord.setQueryId(ticket.getId()); orderRecord.setType(0); orderRecord.setTicketStatus(2); orderRecord.setPayCode(ticket.getPayCode()); orderRecordService.saveOrUpdate(orderRecord); } //确认开票接口 public void ticketIsOk(OrderRecord orderRecord){ orderRecord.setTicketStatus(1); orderRecordService.saveOrUpdate(orderRecord); } private void writeTxt( String txt) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); try { FileWriter f = new FileWriter(systemConfigProperties.getLogPath()+"支付日志"+sdf.format(new Date())+".txt",true); BufferedWriter bw=new BufferedWriter(f); bw.write(txt); bw.newLine(); bw.close(); } catch(Exception e) { System.out.println("打印错误"); } } }