package com.boying.controller.phone; import cn.hutool.core.bean.BeanUtil; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.boying.common.R; import com.boying.common.SystemConfigProperties; import com.boying.entity.*; import com.boying.entity.vo.MonthFeePayVo; import com.boying.service.*; import com.boying.util.LicensePlateValidator; import com.google.gson.Gson; import lombok.Data; import lombok.RequiredArgsConstructor; 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 java.text.SimpleDateFormat; import java.time.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * @author kdq * @version 1.0.0 * @ClassName MonthFeePayController.java * @Description TODO * @createTime 2024年12月20日 16:14:00 */ @RestController @RequestMapping("ffzf/monthFeePay") @RequiredArgsConstructor public class MonthFeePayController { private final PaymentLogService paymentLogService; private final EnterParkService enterParkService; private final PayLogService payLogService; private final WhiteListService whiteListService; private final SystemConfigProperties systemConfigProperties; private final WXService wxService; private final ParkService parkService; @PostMapping("/pay") public Object pay(MonthFeePayVo vo) { if(!LicensePlateValidator.isValidLicensePlate(vo.getCarNo())){ return R.failed("车牌号填写错误"); } if(vo.getPhone() == null){ return R.failed("未填写手机号"); } boolean validChineseMobileNumber = isValidChineseMobileNumber(vo.getPhone()); if(!validChineseMobileNumber){ return R.failed("手机号有误"); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .eq(WhiteList::getCarNo,vo.getCarNo()) .eq(WhiteList::getPayFlag,1); List list = whiteListService.list(queryWrapper); if(list !=null && list.size()>0){ return R.ok(list.get(0)); } return R.ok(null,"未查询到月票"); } @PostMapping("/findWhiteList") public Object findWhiteList(MonthFeePayVo vo) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .eq(WhiteList::getCarNo,vo.getCarNo()) .eq(WhiteList::getPhone,vo.getPhone()); List list = whiteListService.list(queryWrapper); if(list !=null && list.size()>0){ return R.ok(list.get(0)); }else { return R.failed("未查询到此月票"); } } /** * 获取微信openid */ @PostMapping("getOpenId") public Object park(MonthFeePayVo vo){ String openIdByCode = wxService.getOpenIdByCode(vo.getCode()); PaymentLog paymentLog = new PaymentLog(); paymentLog.setType(vo.getType()); paymentLog.setParkId(vo.getParkId()); paymentLog.setCarNo(vo.getCarNo()); paymentLog.setPhone(vo.getPhone()); paymentLog.setName(vo.getName()); paymentLog.setMoney(vo.getMoney()); paymentLog.setStartTime(vo.getStartTime()); paymentLog.setEndTime(vo.getEndTime()); paymentLogService.save(paymentLog); return payByWX(paymentLog,openIdByCode); } /** * 获取阿里支付 */ @PostMapping("getAiLi") public Object getAiLi(MonthFeePayVo vo){ PaymentLog paymentLog = new PaymentLog(); paymentLog.setType(vo.getType()); paymentLog.setParkId(vo.getParkId()); paymentLog.setCarNo(vo.getCarNo()); paymentLog.setPhone(vo.getPhone()); paymentLog.setName(vo.getName()); paymentLog.setMoney(vo.getMoney()); paymentLog.setStartTime(vo.getStartTime()); paymentLog.setEndTime(vo.getEndTime()); paymentLogService.save(paymentLog); return payByAli(paymentLog); } @PostMapping("/paySuccess") public Object paySuccess(PaymentLog vo,Integer flag) { if(flag == null || flag == 0){ return R.failed("缴费失败"); }else { //缴费成功,新增白名单 WhiteList whiteList = new WhiteList(); whiteList.setPayFlag(1); whiteList.setCarNo(vo.getCarNo()); whiteList.setStartTime(vo.getStartTime()); whiteList.setEndTime(vo.getEndTime()); whiteList.setPhone(vo.getPhone()); if(vo.getType()==1){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .select(Park::getId); List list = parkService.list(wrapper); String collect = list.stream().map(Park::getId).map(String::valueOf).collect(Collectors.joining(",")); whiteList.setParkIds(collect); whiteList.setType(1); }else { whiteList.setParkIds(vo.getParkId()+""); whiteList.setParkId(vo.getParkId()); whiteList.setType(1); } whiteListService.save(whiteList); return R.ok(); } } /** * 微信缴费 */ @PostMapping("payByWX") public Object payByWX(PaymentLog paymentLog,String openId){ System.out.println("开始支付"); String xtyhpay = systemConfigProperties.getXTYHPAY(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String format = sdf.format(new Date()); LocalDateTime date3 = LocalDateTime.now(); Map map = new HashMap<>(); map.put("encoding","UTF-8"); map.put("signMethod","01"); map.put("sdkAppId",systemConfigProperties.getXTYHMERID()); map.put("txnType","1006"); map.put("txnSubType","100603"); map.put("txnAccType","02"); map.put("secMerAppId",systemConfigProperties.getXTYHAPPID()); map.put("txnSubOpenid",openId); map.put("txnProductId",paymentLog.getId()+""); map.put("aesWay","01"); map.put("merId",systemConfigProperties.getXTYHMERID()); map.put("merName",systemConfigProperties.getXTYHMERNAME()); map.put("backEndUrl",systemConfigProperties.getYPRESULT()); map.put("txnOrderId",paymentLog.getId()+""+format); map.put("txnOrderTime",format); map.put("txnOrderBody",paymentLog.getCarNo()+"月票缴费"); map.put("txnAmt",Math.round(paymentLog.getMoney() * 100)+""); map.put("txnCcyType","156"); Map stringStringMap = wxService.addSign(map); map.put("certId",stringStringMap.get("certId")); map.put("signAture",stringStringMap.get("signAture")); Gson gson =new Gson(); String str = gson.toJson(map); System.out.println("请求报文:"+str); String body = HttpRequest.post(xtyhpay) .header(Header.CONTENT_TYPE, "application/json") .body(str) .timeout(15000) .execute() .body(); System.out.println(paymentLog.getId()+"响应报文:"+body); JSONObject map1 = JSON.parseObject(body); String respCode = (String)map1.get("respCode"); if(respCode.equals("0000")){ String respTxnSsn = (String)map1.get("respTxnSsn"); String respTxnTime = (String)map1.get("respTxnTime"); String respData = (String)map1.get("respData"); Map map2 = gson.fromJson(respData, Map.class); String appId = (String)map2.get("appId"); String timeStamp = (String)map2.get("timeStamp"); String nonceStr = (String)map2.get("nonceStr"); String signType = (String)map2.get("signType"); String package1 = (String)map2.get("package"); String paySign = (String)map2.get("paySign"); Map resultMap = new HashMap<>(); resultMap.put("appId",appId); resultMap.put("timeStamp",timeStamp); resultMap.put("nonceStr",nonceStr); resultMap.put("signType",signType); resultMap.put("package",package1); resultMap.put("paySign",paySign); PayLog payLog = new PayLog(); payLog.setOutParkId(paymentLog.getId()); payLog.setCode2(respTxnSsn); payLog.setPayTime(LocalDateTime.now()); payLog.setTxnOrderId(paymentLog.getId()+""+format); payLog.setTxnOrderTime(format); payLog.setRespTxnTime(respTxnTime); payLog.setType(1); payLogService.save(payLog); return R.ok(resultMap,null); } String respMsg = (String)map1.get("respMsg"); return R.failed(respCode+":"+respMsg); } /** * 阿里缴费 */ @PostMapping("payByAli") public Object payByAli(PaymentLog paymentLog){ String xtyhpay = systemConfigProperties.getXTYHPAY(); LocalDateTime date3 = LocalDateTime.now(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String format = sdf.format(new Date()); Map map = new HashMap<>(); map.put("encoding","UTF-8"); map.put("signMethod","01"); map.put("sdkAppId",systemConfigProperties.getXTYHMERID()); map.put("txnType","1007"); map.put("txnSubType","100702"); map.put("txnAccType","03"); map.put("aesWay","01"); map.put("merId",systemConfigProperties.getXTYHMERID()); map.put("merName",systemConfigProperties.getXTYHMERNAME()); map.put("backEndUrl",systemConfigProperties.getXTYHRESULT()); map.put("txnOrderId",paymentLog.getId()+""+format); map.put("txnOrderTime",format); map.put("txnOrderBody",paymentLog.getCarNo()+"月票缴费"); map.put("txnAmt",Math.round(paymentLog.getMoney() * 100)+""); map.put("txnCcyType","156"); Map stringStringMap = wxService.addSign(map); map.put("certId",stringStringMap.get("certId")); map.put("signAture",stringStringMap.get("signAture")); Gson gson =new Gson(); String str = gson.toJson(map); System.out.println("请求报文:"+str); String body = HttpRequest.post(xtyhpay) .header(Header.CONTENT_TYPE, "application/json") .body(str) .timeout(15000) .execute() .body(); System.out.println(paymentLog.getId()+"响应报文:"+body); JSONObject map1 = JSON.parseObject(body); String respCode = (String)map1.get("respCode"); if(respCode.equals("0000")){ String respTxnSsn = (String)map1.get("respTxnSsn"); String respData = (String)map1.get("respData"); String respTxnTime = (String)map1.get("respTxnTime"); Map map2 = gson.fromJson(respData, Map.class); String qrCode = (String)map2.get("qrCode"); PayLog payLog = new PayLog(); payLog.setOutParkId(paymentLog.getId()); payLog.setCode2(respTxnSsn); payLog.setQrCode(qrCode); payLog.setPayTime(LocalDateTime.now()); payLog.setTxnOrderId(paymentLog.getId()+""+format); payLog.setTxnOrderTime(format); payLog.setRespTxnTime(respTxnTime); payLog.setType(1); payLogService.save(payLog); return R.ok(null,qrCode); } String respMsg = (String)map1.get("respMsg"); return R.failed(respCode+":"+respMsg); } /** * 邢台银行支付回调接口 * @param * @return */ @PostMapping("/getResult") public Object getResult(HttpServletRequest request){ System.out.println("getResult收到访问"); String respCode = request.getParameter("respCode"); String respTxnSsn = request.getParameter("respTxnSsn"); System.out.println(respCode+":"+respTxnSsn); if(respCode != null){ if(respCode.equals("0000")){ //交易成功,根据流水号查询出场记录 PayLog payLog = payLogService.findByPayCode(respTxnSsn); if(payLog == null){ return R.failed("未查询到流水记录"); }else { PaymentLog byPayCode = paymentLogService.getById(payLog.getOutParkId()); if(byPayCode == null){ return R.failed("未查询到流水"); }else { if(byPayCode.getStatus() == 1){ return R.ok(null,"月票已支付"); }else { byPayCode.setStatus(1); paySuccess(byPayCode,1); return R.ok(null,"回调成功"); } } } }else if(respCode.equals("0002") || respCode.equals("0003") || respCode.equals("0003") || respCode.equals("0012")){ //交易成功,超时,未明,稍后发起查询 }else if(respCode.equals("0011")){ //交易 } }else { return R.failed("未接收到入参"); } return R.failed(null,"请求失败"); } //判断手机号 public static boolean isValidChineseMobileNumber(String number) { // 正则表达式 String regex = "^(13[0-9]|14[57]|15[0-35-9]|17[0-9]|18[0-9])\\d{8}$"; // 编译正则表达式 Pattern pattern = Pattern.compile(regex); // 匹配 Matcher matcher = pattern.matcher(number); // 返回是否匹配结果 return matcher.matches(); } }