From f2fe081c09c6a12fb6a03c062dc98d22624fff2a Mon Sep 17 00:00:00 2001 From: lin <642018748@qq.com> Date: Thu, 9 Feb 2023 20:12:32 +0800 Subject: [PATCH] fix car pay --- .../iformall/controller/WxCarController.java | 7 +- .../car/fute/WxCarFuteCallBackController.java | 111 +++++++++ .../schedule/CarPaidNotifySchedule.java | 18 +- .../java/com/iformall/enums/EnumCarCmd.java | 7 +- .../com/iformall/enums/EnumCarVendor.java | 3 +- .../service/park/ParkAdapterService.java | 2 +- .../iformall/service/park/ParkFactory.java | 8 + .../park/entity/ParkCreatePayOrder.java | 23 +- .../service/park/entity/ParkNotifyPaid.java | 4 +- .../service/park/entity/ParkStopFee.java | 2 +- .../park/impl/bolink/BoLinkParkService.java | 2 +- .../service/park/impl/cyf/CYFParkService.java | 2 +- .../park/impl/dahua/DaHuaParkService.java | 2 +- .../impl/fute/FuteParkCallbackService.java | 111 +++++++++ .../park/impl/fute/FuteParkService.java | 178 +++++++++++++ .../service/park/impl/fute/FuteUtil.java | 234 ++++++++++++++++++ .../HaiKangWeiShiParkService.java | 2 +- .../park/impl/jieshun/JieShunParkService.java | 2 +- .../park/impl/shangan/ShangAnParkService.java | 2 +- .../service/park/impl/tjd/TJDParkService.java | 2 +- .../service/park/pay/WxParkPayService.java | 3 +- .../park/pay/WxParkPayServiceImpl.java | 40 ++- 22 files changed, 728 insertions(+), 37 deletions(-) create mode 100644 mallinkCallback/src/main/java/com/iformall/controller/callback/car/fute/WxCarFuteCallBackController.java create mode 100644 mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkCallbackService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteUtil.java diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java index af059847e..b9c9b3f08 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java @@ -163,6 +163,7 @@ public class WxCarController extends BaseController { if (!StringUtils.isBlank(vendorPersonId)) { resultMap.put("vendorPersonId", vendorPersonId); } + resultMap.put("supportPay", park.getSupportPay()); return new ResultData(resultMap); } catch (Exception e) { logger.error("park init error",e); @@ -450,7 +451,9 @@ public class WxCarController extends BaseController { try { //创建车场支付订单 ParkCreatePayOrder payOrder = parkFactory.getParkService(park.getVendorType()).createPayOrder(paramMap, park,carNumber); - if (null == payOrder || StringUtils.isBlank(payOrder.getUniqueParkOrderNumber())) { + EnumCarVendor carVendor = EnumCarVendor.getEnum(park.getVendorType()); + String uniquePayOrderNo = ParkCreatePayOrder.getUniqueParkOrderNumber(payOrder.getParkOrderNumber(), carVendor); + if (null == payOrder || StringUtils.isBlank(uniquePayOrderNo)) { return new ResultData(Result.ERROR,"创建车场订单错误."); } if (payOrder.getFee() <= 0 ) { @@ -490,7 +493,7 @@ public class WxCarController extends BaseController { new ResultData(Result.ERROR,ErrorCode.API_KEY_NOT_FOUND.name()); } //创建微信支付订单 - PayAdapterResult wxResult = wxParkPayService.createWxPayOrder(user.getOpenId(), user.getAppId(), receiver.getReceiverAccount(), "停车费支付", attachSb.toString(), payOrder.getUniqueParkOrderNumber(), payOrder.getFee(), + PayAdapterResult wxResult = wxParkPayService.createWxPayOrder(user.getOpenId(), user.getAppId(), receiver.getReceiverAccount(), "停车费支付", attachSb.toString(), uniquePayOrderNo, payOrder.getFee(), "127.0.0.1", park.getPaidCallBack(), payAccount.getApiKey(), new Date()); return new ResultData(wxResult); } catch (Exception e) { diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/car/fute/WxCarFuteCallBackController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/fute/WxCarFuteCallBackController.java new file mode 100644 index 000000000..562b93676 --- /dev/null +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/fute/WxCarFuteCallBackController.java @@ -0,0 +1,111 @@ +package com.iformall.controller.callback.car.fute; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; +import com.iformall.common.Result; +import com.iformall.controller.base.BaseController; +import com.iformall.controller.callback.car.WxParkCallBackBaseController; +import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCarCYFVo; +import com.iformall.enums.EnumCarCmd; +import com.iformall.enums.EnumCarVendor; +import com.iformall.enums.EnumCouponSendSendType; +import com.iformall.enums.EnumPayWay; +import com.iformall.service.*; +import com.iformall.service.park.impl.cyf.CYFUtil; +import com.iformall.service.park.impl.tjd.TJDUtil; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author: furunxin + * @Date: 2020/7/6 15:29 + * @Description: 车易付回调接口 + */ + +@Slf4j +@RestController +@RequestMapping("/futeCarCallback") +public class WxCarFuteCallBackController extends WxParkCallBackBaseController { + + @Autowired + WxParkService wxParkService; + + @Autowired + WxCarCmdLogService wxCarCmdLogService; + + @Autowired + WxCUserService wxCUserService; + + @Autowired + WxCUserCarService wxCUserCarService; + + @Autowired + WxCouponSendService wxCouponSendService; + + @Autowired + WxCarPayRecordService wxCarPayRecordService; + + @Autowired + WxCUserBasicInfoService wxCUserBasicInfoService; + + /** + * @description 捷顺 车辆入场通知 + * {dataItems=[{"inTime":"2020-12-09 11:21:15","carNumber":"浙-AF81797","inCarPhoto":"p201127315/NISSP_IMG_PARK_IN/20201209/a9f1130651b9493f8eab64f14afbdd47","isReal":0,"itemId":"a9f1130651b9493f8eab64f14afbdd47","inOperator":"超级管理员","equipName":"东门入口","parkName":"杭州东站西子国际","vehicleInfo":"{\"plateNo\":\"浙-AF81797\",\"plateColor\":\"GREEN\",\"plateBackColor\":0,\"plateWordColor\":0,\"vehicleColor\":null,\"vehicleLogo\":null,\"vehicleModel\":null,\"mainModel\":0,\"subModel\":0,\"vehicleModelTrust\":0,\"mainModelTrust\":0,\"subModelTrust\":0,\"plateNoTrust\":1,\"vehicleLogoTrust\":0,\"vehicleColorTrust\":0}","equipCode":"208202496","parkCode":"p201127315"}], pno=dzxzgj, sn=6C958D99D2769AA16F3A3F06E962263F, tn=-2, ts=20201209112118886, ve=1.0} + * + * + * + * @Params [paramMap] + * @return com.iformall.common.Result + * @Author furunxin + * @Date 2020/7/8 上午8:27 + **/ + @PostMapping(value = "/parkIn") + public Result parkInCallback(@RequestBody Map paramMap) { + log.info("["+getIpAddr()+"] futeCarCallback parkIn: " + paramMap.toString()); + //解析车易付参数 + return super.parkInCallBack(EnumCarVendor.CAR_FUTE, EnumCarCmd.CAR_FUTE_CALLBACK_PARK_IN, paramMap); + } + + + /** + * @description 车易付 车辆离场通知 + * @Params [param] + * @return java.util.Map + * @Author furunxin + * @Date 2020/7/12 上午9:00 + **/ + @PostMapping(value = "/parkOut") + public Result parkOutCallback(@RequestBody Map paramMap) { + log.info("["+getIpAddr()+"] futeCarCallback parkOut: " + paramMap.toString()); + return super.parkOutCallBack(EnumCarVendor.CAR_FUTE, EnumCarCmd.CAR_FUTE_CALLBACK_PARK_OUT, paramMap); + + } + + @PostMapping(value = "/unbind") + public Result unbindCallback(@RequestBody Map paramMap) { + log.info("["+getIpAddr()+"] futeCarCallback unbind: " + paramMap.toString()); + //解析车易付参数 + return super.unbindCarCallBack(EnumCarVendor.CAR_FUTE, EnumCarCmd.CAR_FUTE_CALLBACK_UNBIND, paramMap); + } + + @PostMapping(value = "/paid") + public Result paidCallback(@RequestBody Map paramMap) { + log.info("["+getIpAddr()+"] futeCarCallback paid: " + paramMap.toString()); + //解析车易付参数 + return super.paidCallback(EnumCarVendor.CAR_FUTE, EnumCarCmd.CAR_FUTE_CALLBACK_PAID, paramMap); + } +} diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CarPaidNotifySchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CarPaidNotifySchedule.java index 8cf713d14..0c41c63a6 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/CarPaidNotifySchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CarPaidNotifySchedule.java @@ -6,6 +6,8 @@ import com.iformall.domain.po.WxActivityJoin; import com.iformall.domain.po.WxCampaign; import com.iformall.domain.po.WxCarPayOrder; import com.iformall.domain.po.WxMall; +import com.iformall.domain.po.WxPark; +import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.WxMsgRecord; import com.iformall.enums.*; import com.iformall.mapper.WxActivityJoinMapper; @@ -14,7 +16,9 @@ import com.iformall.mapper.WxCampaignMapper; import com.iformall.mapper.WxCarPayOrderMapper; import com.iformall.mapper.WxMallMapper; import com.iformall.mq.MqBaseProducer; +import com.iformall.service.WxParkService; import com.iformall.service.park.ParkFactory; +import com.iformall.service.park.entity.ParkCreatePayOrder; import com.iformall.service.park.entity.ParkNotifyPaid; import com.iformall.utils.DateUtils; import org.apache.commons.collections.map.HashedMap; @@ -48,10 +52,20 @@ public class CarPaidNotifySchedule { @Autowired ParkFactory parkFactory; + @Autowired + WxParkService wxParkService; + private List getMalls() { WxMall wxMall = new WxMall(); return wxMallMapper.findList(wxMall); } + + private WxPark getCurrentPark(TenantEntity tenantEntity) { + WxPark parkQ = new WxPark(); + parkQ.updateTenantInfo(tenantEntity); + WxPark wxPark = wxParkService.getByObj(parkQ); + return wxPark; + } /** * 5分钟执行一次 @@ -61,6 +75,7 @@ public class CarPaidNotifySchedule { public void sendMsg() { List malls = getMalls(); for (WxMall mall : malls) { + WxPark wxPark = getCurrentPark(mall); WxCarPayOrder payOrder = new WxCarPayOrder(); payOrder.updateTenantInfo(mall); payOrder.setNotifyCountLimit(10); @@ -71,7 +86,8 @@ public class CarPaidNotifySchedule { WxCarPayOrder _po = orderList.get(i); //通知车场支付成功 try { - parkFactory.getParkService(_po.getCarVendor()).notifyPaid(new ParkNotifyPaid(_po.getTenantId(), _po.getParkOrderNo(), _po.getPayAmount(), _po.getPayTime())); + String payOrderNo = ParkCreatePayOrder.getUniqueParkOrderNumber(_po.getParkOrderNo(), EnumCarVendor.getEnum(_po.getCarVendor())); + parkFactory.getParkService(_po.getCarVendor()).notifyPaid(wxPark,new ParkNotifyPaid(_po.getTenantId(),payOrderNo,_po.getParkOrderNo(), _po.getPayAmount(), _po.getPayTime())); payOrder.setParkNotify(EnumYesOrNo.YES.getCode()); payOrder.setUpdateTime(new Date()); payOrder.setNotifyCount(payOrder.getNotifyCount()+1); diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCarCmd.java b/mallinkService/src/main/java/com/iformall/enums/EnumCarCmd.java index 77636b9de..66ae8bd10 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCarCmd.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCarCmd.java @@ -34,7 +34,12 @@ public enum EnumCarCmd { CAR_HAIKANGWEISHI_CALLBACK_PARK_IN(628,"海康进场通知"), CAR_HAIKANGWEISHI_CALLBACK_PARK_OUT(629,"海康出场通知"), CAR_HAIKANGWEISHI_CALLBACK_UNBIND(630,"海康解绑车牌通知"), - CAR_HAIKANGWEISHI_CALLBACK_PAID(631,"海康支付通知") + CAR_HAIKANGWEISHI_CALLBACK_PAID(631,"海康支付通知"), + + CAR_FUTE_CALLBACK_PARK_IN(628,"福特进场通知"), + CAR_FUTE_CALLBACK_PARK_OUT(629,"福特出场通知"), + CAR_FUTE_CALLBACK_UNBIND(630,"福特解绑车牌通知"), + CAR_FUTE_CALLBACK_PAID(631,"福特支付通知") ; public static EnumCarCmd getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java index f1c3362c5..978c9b812 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java @@ -14,7 +14,8 @@ public enum EnumCarVendor { CAR_BOLINK(5, "BoLink",false), CAE_CYF(6,"CYF",false), CAR_JIESHUN(7,"JIESHUN",true), - CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",true) + CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",true), + CAR_FUTE(9,"FUTE",false)//深圳市福特智能科技有限公司 ; public static EnumCarVendor getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java b/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java index e8f1619a4..42f96ebf4 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java @@ -62,7 +62,7 @@ public interface ParkAdapterService { /** * 停车订单成功通知车场 */ - void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception; + void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception; /** * 查询停车场状态, 给老的集成用 diff --git a/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java b/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java index 24899d84c..da184f34a 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java +++ b/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java @@ -13,6 +13,8 @@ import com.iformall.service.park.impl.bolink.BoLinkParkService; import com.iformall.service.park.impl.cyf.CYFParkCallbackService; import com.iformall.service.park.impl.cyf.CYFParkService; import com.iformall.service.park.impl.dahua.DaHuaParkService; +import com.iformall.service.park.impl.fute.FuteParkCallbackService; +import com.iformall.service.park.impl.fute.FuteParkService; import com.iformall.service.park.impl.haikangweishi.HaiKangWeiShiParkCallbackService; import com.iformall.service.park.impl.haikangweishi.HaiKangWeiShiParkService; import com.iformall.service.park.impl.jieshun.JieShunParkCallbackService; @@ -37,6 +39,8 @@ public class ParkFactory { JieShunParkService jieshunService; @Autowired HaiKangWeiShiParkService haikangWeishiService; + @Autowired + FuteParkService futeParkService; @Autowired CYFParkCallbackService cyfCallbackService; @@ -44,6 +48,8 @@ public class ParkFactory { JieShunParkCallbackService jieshunCallBackService; @Autowired HaiKangWeiShiParkCallbackService haikangWeishiCallBackService; + @Autowired + FuteParkCallbackService futeParkCallbackService; private Map parkServiceMap ; private Map enumMap ; @@ -63,6 +69,7 @@ public class ParkFactory { parkServiceMap.put(EnumCarVendor.CAR_TJD.getCode(), tjdService); parkServiceMap.put(EnumCarVendor.CAR_JIESHUN.getCode(), jieshunService); parkServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI.getCode(), haikangWeishiService); + parkServiceMap.put(EnumCarVendor.CAR_FUTE.getCode(), futeParkService); return parkServiceMap; } @@ -84,6 +91,7 @@ public class ParkFactory { } callBackServiceMap = new ConcurrentHashMap(); callBackServiceMap.put(EnumCarVendor.CAE_CYF.getCode(), cyfCallbackService); + callBackServiceMap.put(EnumCarVendor.CAR_FUTE.getCode(), futeParkCallbackService); return callBackServiceMap; } diff --git a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkCreatePayOrder.java b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkCreatePayOrder.java index 251653088..88db14b43 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkCreatePayOrder.java +++ b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkCreatePayOrder.java @@ -9,16 +9,12 @@ public class ParkCreatePayOrder implements Serializable{ private static final long serialVersionUID = 5585069626450856545L; - private EnumCarVendor carVendor; - /*停车场返回的订单ID**/ private String parkOrderNumber=""; /*停车费**/ private Integer fee; - public ParkCreatePayOrder(EnumCarVendor carVendor,String parkOrderNumber,Integer fee) { - this.carVendor = carVendor; - + public ParkCreatePayOrder(String parkOrderNumber,Integer fee) { if (!StringUtils.isBlank(parkOrderNumber)) { this.parkOrderNumber = parkOrderNumber; } @@ -27,15 +23,22 @@ public class ParkCreatePayOrder implements Serializable{ } } - public String getUniqueParkOrderNumber() { + public Integer getFee() { + return fee; + } + + public String getParkOrderNumber() { + return parkOrderNumber; + } + + public static String getUniqueParkOrderNumber(String parkOrderNumber,EnumCarVendor carVendor) { if (!StringUtils.isBlank(parkOrderNumber)) { return carVendor.getMessage()+"_"+parkOrderNumber; } return null; } - - public Integer getFee() { - return fee; - } + public static String getRealParkOrderNumber(String uniqueParkOrderNumber,EnumCarVendor carVendor) { + return uniqueParkOrderNumber.replaceFirst(carVendor.getMessage()+"_", ""); + } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkNotifyPaid.java b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkNotifyPaid.java index 962c03e98..529a73a51 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkNotifyPaid.java +++ b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkNotifyPaid.java @@ -19,7 +19,9 @@ public class ParkNotifyPaid implements Serializable{ /*停车场返回的订单ID**/ private String tenantId; - /*停车场订单**/ + /*订单编号**/ + private String payOrderNo; + /*停车场订单编号**/ private String parkOrderNo; /*支付金额**/ private Integer fee; diff --git a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java index 7a58005d5..64eb9f21a 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java +++ b/mallinkService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java @@ -27,7 +27,7 @@ public class ParkStopFee implements Serializable{ /*给支付小程序的额外数据**/ private Map extraData=new HashMap(); /*备注**/ - private String remark=""; + private String remark="";//车场有可能返回的提示信息 private String sysNotice="";//系统提示,非车厂提示; diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java index 66ce092d1..a96ac72bb 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java @@ -122,7 +122,7 @@ public class BoLinkParkService extends BaseParkService implements ParkAdapterSer } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java index c970aa25d..1d7cbf140 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java @@ -205,7 +205,7 @@ public class CYFParkService extends BaseParkService implements ParkAdapterServic } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java index 0afd0bce8..7baa0808c 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java @@ -88,7 +88,7 @@ public class DaHuaParkService extends BaseParkService implements ParkAdapterServ } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkCallbackService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkCallbackService.java new file mode 100644 index 000000000..e4cd2ada1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkCallbackService.java @@ -0,0 +1,111 @@ +package com.iformall.service.park.impl.fute; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxCarJSOrder; +import com.iformall.domain.po.WxPark; +import com.iformall.domain.vo.WxCarCYFVo; +import com.iformall.enums.EnumCarVendor; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxCarJSOrderMapper; +import com.iformall.service.WxParkService; +import com.iformall.service.park.ParkBatchCallBackAdapterService; +import com.iformall.service.park.ParkCallBackAdapterService; +import com.iformall.service.park.entity.ParkNotifyParam; +import com.iformall.service.park.impl.BaseParkService; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class FuteParkCallbackService extends BaseParkService implements ParkCallBackAdapterService { + + + + @Autowired + WxParkService wxParkService; + + + /** + * {dataItems=[{"inTime":"2020-12-09 11:21:15","carNumber":"浙-AF81797","inCarPhoto":"p201127315/NISSP_IMG_PARK_IN/20201209/a9f1130651b9493f8eab64f14afbdd47","isReal":0,"itemId":"a9f1130651b9493f8eab64f14afbdd47","inOperator":"超级管理员","equipName":"东门入口","parkName":"杭州东站西子国际","vehicleInfo":"{\"plateNo\":\"浙-AF81797\",\"plateColor\":\"GREEN\",\"plateBackColor\":0,\"plateWordColor\":0,\"vehicleColor\":null,\"vehicleLogo\":null,\"vehicleModel\":null,\"mainModel\":0,\"subModel\":0,\"vehicleModelTrust\":0,\"mainModelTrust\":0,\"subModelTrust\":0,\"plateNoTrust\":1,\"vehicleLogoTrust\":0,\"vehicleColorTrust\":0}","equipCode":"208202496","parkCode":"p201127315"}], pno=dzxzgj, sn=6C958D99D2769AA16F3A3F06E962263F, tn=-2, ts=20201209112118886, ve=1.0} + */ + @Override + public ParkNotifyParam parseInNoticyParam(Object param) { + Map paramMap = (Map) param; + String carNumber = paramMap.get("car_number").toString(); + String parkCode = paramMap.get("park_id").toString(); + String parkName = ""; + + String synId = paramMap.get("order_id").toString(); + Long inTime = (Long)paramMap.get("in_time"); + + ParkNotifyParam p = new ParkNotifyParam(); + p.setCarNumber(carNumber); + p.setParkId(parkCode); + p.setParkName(parkName); + p.setSynId(synId); + try { + p.setEntranceTime(new Date(inTime)); + } catch (Exception e) { + log.error("fute entranceTime format error",e); + return null; + } + return p; + } + + @Override + public ParkNotifyParam parseOutNoticyParam(Object param) { + Map paramMap = (Map) param; + String carNumber = paramMap.get("car_number").toString(); + String parkCode = paramMap.get("park_id").toString(); + String parkName = ""; + + String synId = paramMap.get("order_id").toString(); + Long inTime = (Long)paramMap.get("in_time"); + Long outTime = (Long)paramMap.get("out_time"); + + ParkNotifyParam p = new ParkNotifyParam(); + p.setCarNumber(carNumber); + p.setParkId(parkCode); + p.setParkName(parkName); + p.setSynId(synId); + try { + p.setEntranceTime(new Date(inTime)); + } catch (Exception e) { + log.error("fute entranceTime format error",e); + return null; + } + try { + p.setOutTime(new Date(outTime)); + } catch (Exception e) { + log.error("fute outTime format error",e); + return null; + } + p.setFee(String.valueOf(paramMap.get("amount_receivable"))); + return p; + } + + @Override + public ParkNotifyParam parseUnbindNoticyParam(Object param) { + return null; + } + + @Override + public ParkNotifyParam parsePaidNoticyParam(Object param) { + return null; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkService.java new file mode 100644 index 000000000..88e40070e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteParkService.java @@ -0,0 +1,178 @@ +package com.iformall.service.park.impl.fute; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCarJSOrder; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxPark; +import com.iformall.domain.vo.WxCouponOrderCarCVo; +import com.iformall.domain.vo.WxParkCouponConfig; +import com.iformall.enums.EnumCarVendor; +import com.iformall.enums.EnumCouponUnit; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxCarJSOrderMapper; +import com.iformall.service.WxParkService; +import com.iformall.service.park.ParkAdapterService; +import com.iformall.service.park.entity.ParkCreatePayOrder; +import com.iformall.service.park.entity.ParkNotifyPaid; +import com.iformall.service.park.entity.ParkStopFee; +import com.iformall.service.park.impl.BaseParkService; +import com.iformall.service.park.impl.util.ParkHelper; +import com.iformall.service.park.utils.ParkCacheUtils; +import com.iformall.utils.RedisCacheUtils; +import com.iformall.utils.RedisLock; + +/** + * 福特停车 + * + */ +@Service +public class FuteParkService extends BaseParkService implements ParkAdapterService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + ParkHelper parkHelper; + + @Autowired + @Qualifier("objectCommonRedisTemplate") + RedisTemplate redisTemplate; + + @Autowired + RedisLock redisLock; + + FuteUtil fute = new FuteUtil(); + + + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + return null; + } + + @Override + public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ + return null; + } + + + @Override + public String bindCar(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ + return "fute"; + } + + + @Override + public void unbindCar(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ + } + + + /** + * 每一次查询都会产生订单,然后根据订单号查询 + */ + @Override + public ParkStopFee carStopFee(Map paramMap, WxPark park,String carNumber) throws Exception{ + //如果车牌号是鄂AAAAAA, 为测试车牌 + if (carNumber.equals("鄂AAAAAA")) { + return new ParkStopFee("-111",fute.utcToLocal("2020-12-16 00:00:00"),fute.utcToLocal("2020-12-17 00:00:00"), + "0.01",null,"payPath",null,"测试车牌,仅测试用",null); + }else if(carNumber.equals("鄂AAAAAB")) { + throw new MallinkException(21000,"车辆未入场"); + } + + String retCode = fute.getCarStopFee(park, carNumber); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "fute getCarStopFee error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + if (result.getInteger("state") != 1 ) { + String message = result.getString("errmsg"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "fute getCarStopFee error."+message); + } + return new ParkStopFee(result.getString("parking_order_id"),fute.utcToLocal(result.getString("intime")),fute.utcToLocal(result.getString("outtime")), + result.getString("price"),"appId","payPath",null,null,null); + + } + + /** + * @return + */ + @Override + public ResultData useCoupon(Map paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) throws Exception{ + if (null == userCar) { + return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(),"当前用户未查询到优惠券!"); + } + + if (StringUtils.isBlank(userCar.getCUserPhone())) { + return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(),"当前用户未查询到手机号!"+userCar.getcUserId()); + } + + Map valueMap = WxParkCouponConfig.parseValue(userCar.getVendorParams()); + if (null == valueMap) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置。"+coupon.getTitle()); + } + //String orderNo = paramMap.get("parkOrderId"); + String couponNo = valueMap.get("couponNo"); + if (StringUtils.isBlank(couponNo)) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置[couponNo]。"+coupon.getTitle()); + } + String ret = fute.useCoupon(park, couponNo, carNumber); + //打折登陆验证 + logger.info("fute useCoupon result:"+ret); + JSONObject retObj = JSON.parseObject(ret); + if (retObj.getIntValue("state") == 1){ + return new ResultData(); + }else { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前用户使用福特优惠券失败。"+retObj.getString("errmsg")); + } + } + + @Override + public ParkCreatePayOrder createPayOrder(Map paramMap, WxPark park, String carNumber) throws Exception { + String retCode = fute.getCarStopFee(park, carNumber); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "fute getCarStopFee error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + if (result.getInteger("state") != 1 ) { + String message = result.getString("errmsg"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "fute getCarStopFee error."+message); + } + String price = result.getString("price"); + Integer fee = new BigDecimal(price).multiply(new BigDecimal(100)).intValue(); + return new ParkCreatePayOrder(result.getString("parking_order_id"), fee); + } + + @Override + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { + fute.notifyPaid(park, notifyPaid.getParkOrderNo(), notifyPaid.getFee()); + } + + @Override + public ResultData getParkStatus(WxPark park) throws Exception{ + return new ResultData(); + } + + @Override + public boolean ignoreUseCouponCache() { + return false; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteUtil.java b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteUtil.java new file mode 100644 index 000000000..d76b7e167 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/fute/FuteUtil.java @@ -0,0 +1,234 @@ +package com.iformall.service.park.impl.fute; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.WxPark; +import com.iformall.exception.MallinkException; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + + +/** + * @author: furunxin + * @Date: 2020/7/1 17:16 + * @Description: 车易付接口对接参数类 + */ + +@Slf4j +public class FuteUtil { + + public static final String QUERY_PRICE = "http://s1.appykt.com/zld/parkapi/query_price"; + public static final String COUPON_USE = "http://s1.appykt.com/zld/useTicket"; + public static final String NOTIFY_PAID = "http://s1.appykt.com/zld/parkapi/pay_notify"; + + /** + * @description UTC时间转化为本地时间 + * @Params [utcTime] + * @return java.util.Date + * @Author furunxin + * @Date 2020/7/8 下午12:45 + **/ + public static Date utcToLocal(String seconds) throws ParseException { + String format = "yyyy-MM-dd HH:mm:ss"; + SimpleDateFormat sdf = new SimpleDateFormat(format); + Date date=sdf.parse(seconds); + return date; + } + + /** + * 查询停车费 + **/ + public String getCarStopFee(WxPark wxPark,String carNumber){ + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map param = new HashMap(); + param.put("access_type", "scan_center_pay");//scan_center_pay:中央缴费 scan_out_pay:出口支付 + param.put("carnum", carNumber); + param.put("parkid", wxPark.getParkingId()); + log.info("fute getCarStopFee :" + JSON.toJSONString(param)); + return ProcBussiness(QUERY_PRICE, param,vp.getString("signkey")); + } + + /** + * 使用优惠券 + **/ + public String useCoupon(WxPark wxPark,String couponNo,String carNumber){ + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map param = new HashMap(); + param.put("carNumber", carNumber);//商户编号 + param.put("code", couponNo);//优惠券编号 + param.put("parkid", wxPark.getParkingId()); + log.info("fute useCoupon :" + JSON.toJSONString(param)); + return ProcBussiness(COUPON_USE, param, vp.getString("signkey")); + } + + /** + * 支付成功通知车场 + * @param wxPark + * @param orderNo + * @param token + * @return + */ + public String notifyPaid(WxPark wxPark,String parkOrderNo,Integer fee) { + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map param = new HashMap(); + param.put("out_trade_no", parkOrderNo);//商户编号 + String feestr = new BigDecimal(fee).divide(new BigDecimal(100)).stripTrailingZeros().toPlainString(); + param.put("total_amount", feestr);//优惠券编号 + param.put("pay_channel", 1);//优惠券编号 + param.put("pay_status", 1);//优惠券编号 + log.info("fute notifyOrderResult :" + JSON.toJSONString(param)); + return ProcBussiness(NOTIFY_PAID, param,vp.getString("signkey")); + } + + private static String ProcBussiness(String url,Map param,String signKey) { + try { + String sign = sign(param, signKey); + param.put("sign", sign); + return Proc(url,param); + } catch (Exception e) { + log.error("fute request error.",e); + } + return null; + } + + private static String Proc(String url, Map param) { + CloseableHttpClient httpClient = HttpClients.createDefault(); + + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader(HTTP.CONTENT_TYPE,"application/json"); + httpPost.addHeader("Accept", "application/json"); + httpPost.addHeader("Accept-Encoding", "UTF-8"); + + if (null != param) { + httpPost.setEntity(new StringEntity(JSON.toJSONString(param),"UTF-8")); + } + + if (null != param) { + log.info("fute httpRequest:[url]"+url+"[params]"+JSON.toJSONString(param)); + }else { + log.info("fute httpRequest:[url]"+url); + } + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + + String result = null; + + //打印StatusLine + log.debug("StatusLine: " + response.getStatusLine()); + try{ + //获取实体 + HttpEntity httpEntity= response.getEntity(); + result = EntityUtils.toString(httpEntity, "UTF-8"); + log.debug(result); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + + try { //关闭流并释放资源 + httpClient.close(); + } catch (IOException e) { + log.error(e.getLocalizedMessage()); + } + return result; + } + + private static String sign(Map map, String signKey){ + if(map==null){ + return null; + } + if(map.containsKey("sign")) { + map.remove("sign"); + } + List keyList = new ArrayList(map.keySet()); + Collections.sort(keyList); + StringBuffer sb = new StringBuffer(); + for(int i=0;i>> 4 & 0xf]; + ac[j++] = hexDigits[byte0 & 0xf]; + } + return new String(ac); + } + private static final char hexDigits[] = { '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java index 341a5ec9b..05e2678cc 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java @@ -240,7 +240,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java index 6915c2794..c92c2e7a5 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java @@ -349,7 +349,7 @@ public class JieShunParkService extends BaseParkService implements ParkAdapterSe } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java index 98cf1bfbc..ca1ae806e 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java @@ -107,6 +107,6 @@ public class ShangAnParkService extends BaseParkService implements ParkAdapterSe } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java index 30f2b9bc4..adeb81114 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java @@ -268,6 +268,6 @@ public class TJDParkService extends BaseParkService implements ParkAdapterServic } @Override - public void notifyPaid(ParkNotifyPaid notifyPaid) throws Exception { + public void notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java index 5be97c9ef..51176c688 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java @@ -5,6 +5,7 @@ import java.util.Map; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxCarPayOrder; +import com.iformall.domain.po.WxPark; import com.iformall.domain.po.base.TenantEntity; import com.iformall.enums.EnumCarVendor; import com.iformall.service.pay.service.pay.entity.PayAdapterResult; @@ -18,7 +19,7 @@ public interface WxParkPayService { public String handlePaidCallBack(Map paramMap); - public void handlePaidSuccess(TenantEntity tenantEntity,Long cUserId,Integer carVendor,String carNumber,String parkOrderNo, + public void handlePaidSuccess(TenantEntity tenantEntity,WxPark wxPark,Long cUserId,Integer carVendor,String carNumber,String payOrderNo, Integer fee,Date paidTime,String transcationId,String merchantAccount,Long merchantId,String merchantName) throws Exception; public WxCarPayOrder detailWxCarPayOrder(Long id,String tenantId); diff --git a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java index 1f29f15d8..b7eb63ff0 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java @@ -9,6 +9,7 @@ import com.iformall.common.IdWorker; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxCarPayOrder; import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxPark; import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.WxRefundOrder; @@ -22,7 +23,9 @@ import com.iformall.mapper.WxCarPayOrderMapper; import com.iformall.mapper.WxPayAccountMapper; import com.iformall.pay.WxPayment; import com.iformall.service.ExcelService; +import com.iformall.service.WxParkService; import com.iformall.service.park.ParkFactory; +import com.iformall.service.park.entity.ParkCreatePayOrder; import com.iformall.service.park.entity.ParkNotifyPaid; import com.iformall.service.pay.service.pay.entity.PayAdapterResult; import com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay.WxMiniAppPayAdapterService; @@ -41,6 +44,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -69,7 +73,11 @@ public class WxParkPayServiceImpl implements WxParkPayService { @Autowired RedisLock redisLock; - + + @Lazy + @Autowired + WxParkService wxParkService; + @Override public PageInfo listPayOrderAsPage(WxCarPayOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCarPayOrderMapper.findList(record)); @@ -94,6 +102,13 @@ public class WxParkPayServiceImpl implements WxParkPayService { return XmlUtil.getRequestXml(resultMap); } + private WxPark getCurrentPark(TenantEntity tenantEntity) { + WxPark parkQ = new WxPark(); + parkQ.updateTenantInfo(tenantEntity); + WxPark wxPark = wxParkService.getByObj(parkQ); + return wxPark; + } + @Override public String handlePaidCallBack(Map paramMap) { //支付返回消息 @@ -106,7 +121,7 @@ public class WxParkPayServiceImpl implements WxParkPayService { Integer cashFee = Integer.parseInt(cashFeeStr); if (cashFee > 0 ) { try { - String parkOrderNo = paramMap.get("out_trade_no"); + String payOrderNo = paramMap.get("out_trade_no"); String time_end = paramMap.get("time_end"); String transcationId = paramMap.get("transaction_id"); @@ -117,6 +132,9 @@ public class WxParkPayServiceImpl implements WxParkPayService { TenantEntity te = new TenantEntity(); te.setTenantId(tenantId); te.setParentTenantId(parentTenantId); + + WxPark park = getCurrentPark(te); + Integer carVendor = attachObj.getInteger("v"); Long cUserId = attachObj.getLong("u"); String carNumber = attachObj.getString("car"); @@ -124,7 +142,7 @@ public class WxParkPayServiceImpl implements WxParkPayService { Long merchantId = attachObj.getLong("mid"); String merchantName = attachObj.getString("mn"); - handlePaidSuccess(te,cUserId,carVendor,carNumber,parkOrderNo,Integer.parseInt(cashFeeStr), + handlePaidSuccess(te,park,cUserId,carVendor,carNumber,payOrderNo,Integer.parseInt(cashFeeStr), DateUtils.string2Date(time_end, DateUtils.DATE_PATTERN_ALL_NOSPACE).getTime(),transcationId, merchantAccount,merchantId,merchantName); } catch (Exception e) { @@ -144,16 +162,17 @@ public class WxParkPayServiceImpl implements WxParkPayService { } @Override - public void handlePaidSuccess(TenantEntity tenantEntity,Long cUserId,Integer carVendor,String carNumber, - String parkOrderNo,Integer fee,Date paidTime,String transcationId,String merchantAccount, + public void handlePaidSuccess(TenantEntity tenantEntity,WxPark wxPark,Long cUserId,Integer carVendor,String carNumber, + String payOrderNo,Integer fee,Date paidTime,String transcationId,String merchantAccount, Long merchantId,String merchantName) throws Exception{ //查询该笔订单是否已经存在 - WxCarPayOrder payOrder = wxCarPayOrderMapper.findOneByParkOderNo(parkOrderNo, tenantEntity.getTenantId()); + WxCarPayOrder payOrder = wxCarPayOrderMapper.findOneByParkOderNo(payOrderNo, tenantEntity.getTenantId()); + String parkOrderNo = ParkCreatePayOrder.getRealParkOrderNumber(payOrderNo,EnumCarVendor.getEnum(carVendor)); if (null == payOrder) { //此处需要加锁,防止并发设置 long time = System.currentTimeMillis() + RedisLock.TIMEOUT; String timeStr = String.valueOf(time); - boolean stocksetlock = redisLock.lock("carPayOrderLock_"+parkOrderNo, timeStr); + boolean stocksetlock = redisLock.lock("carPayOrderLock_"+payOrderNo, timeStr); if (stocksetlock) { try { //创建停车支付订单记录 @@ -178,7 +197,7 @@ public class WxParkPayServiceImpl implements WxParkPayService { //通知车场支付成功 try { - parkFactory.getParkService(carVendor).notifyPaid(new ParkNotifyPaid(tenantEntity.getTenantId(), parkOrderNo, fee, paidTime)); + parkFactory.getParkService(carVendor).notifyPaid(wxPark,new ParkNotifyPaid(tenantEntity.getTenantId(),payOrderNo,parkOrderNo,fee,paidTime)); payOrder.setParkNotify(EnumYesOrNo.YES.getCode()); payOrder.setUpdateTime(new Date()); wxCarPayOrderMapper.updateById(payOrder); @@ -188,12 +207,11 @@ public class WxParkPayServiceImpl implements WxParkPayService { payOrder.setUpdateTime(new Date()); wxCarPayOrderMapper.updateById(payOrder); } - }catch(Exception e) { logger.error("handlePaidSuccess fail.",e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"支付同步失败"+parkOrderNo); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"支付同步失败"+payOrderNo); }finally { - redisLock.unlock("carPayOrderLock_"+parkOrderNo, timeStr); + redisLock.unlock("carPayOrderLock_"+payOrderNo, timeStr); } } }