diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java index 6abaaa174..a2c52cb56 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java @@ -12,6 +12,7 @@ public enum EnumCarVendor { CAR_JIESHUN(7,"JIESHUN",true),//捷顺老版本,西子用 CAR_JIESHUN_V2(10,"JIESHUNV2",true),//捷顺通用版本 CAR_HAIKANGWEISHI(8,"HAIKANGWEISHI",true), + CAR_HAIKANGWEISHI_V2(18,"HAIKANGWEISHIV2",true), CAR_FUTE(9,"FUTE",false),//深圳市福特智能科技有限公司 CAR_KETUO(11,"KETUO",false),//科拓停车 CAR_LIFANG(12,"LIFANG",false),// 立方【接口不支持未接通,不能使用】 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 f226a39ac..4982a237d 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java +++ b/mallinkService/src/main/java/com/iformall/service/park/ParkFactory.java @@ -12,6 +12,8 @@ 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.haikangweishiv2.HaiKangWeiShiV2ParkCallbackService; +import com.iformall.service.park.impl.haikangweishiv2.HaiKangWeiShiV2ParkService; import com.iformall.service.park.impl.jieshun.JieShunParkCallbackService; import com.iformall.service.park.impl.jieshun.JieShunParkService; import com.iformall.service.park.impl.jieshunV2.JieShunV2ParkCallbackService; @@ -48,6 +50,8 @@ public class ParkFactory { @Autowired HaiKangWeiShiParkService haikangWeishiService; @Autowired + HaiKangWeiShiV2ParkService haikangWeishiV2Service; + @Autowired FuteParkService futeParkService; @Autowired LiFangParkService lifangParkService; @@ -65,6 +69,8 @@ public class ParkFactory { @Autowired HaiKangWeiShiParkCallbackService haikangWeishiCallBackService; @Autowired + HaiKangWeiShiV2ParkCallbackService haikangWeishiV2CallBackService; + @Autowired FuteParkCallbackService futeParkCallbackService; @Autowired LiFangParkCallbackService lifangParkCallbackService; @@ -91,6 +97,7 @@ public class ParkFactory { parkServiceMap.put(EnumCarVendor.CAR_JIESHUN.getCode(), jieshunService); parkServiceMap.put(EnumCarVendor.CAR_JIESHUN_V2.getCode(), jieshunV2Service); parkServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI.getCode(), haikangWeishiService); + parkServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI_V2.getCode(), haikangWeishiV2Service); parkServiceMap.put(EnumCarVendor.CAR_FUTE.getCode(), futeParkService); parkServiceMap.put(EnumCarVendor.CAR_LIFANG.getCode(), lifangParkService); parkServiceMap.put(EnumCarVendor.CAR_KETUO.getCode(), keTuoParkService); @@ -116,6 +123,7 @@ public class ParkFactory { callBackServiceMap = new ConcurrentHashMap(); callBackServiceMap.put(EnumCarVendor.CAE_CYF.getCode(), cyfCallbackService); callBackServiceMap.put(EnumCarVendor.CAR_FUTE.getCode(), futeParkCallbackService); + callBackServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI_V2.getCode(), haikangWeishiV2CallBackService); callBackServiceMap.put(EnumCarVendor.CAR_LIFANG.getCode(), lifangParkCallbackService); callBackServiceMap.put(EnumCarVendor.CAR_KETUO.getCode(), keTuoParkCallbackService); callBackServiceMap.put(EnumCarVendor.CAR_DAHUA.getCode(), dahuaCallbackService); 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 119b434a9..9f7fcc19a 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 @@ -153,6 +153,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda String _createTime = attribute.getString("entranceTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss” String _endTime = attribute.getString("costTime");//离场时间,格式为“yyyy-MM-dd HH:mi:ss” String payPath = ""; + Integer freeMinute = (Integer)park.getVendorParamsByKey("freeMinute"); return new ParkStopFee(parkOrderId,haikang.utcToLocal(_createTime),haikang.utcToLocal(_endTime), String.valueOf(attribute.getDouble("shouldCost")),appId,payPath,null,null,"0元请勿使用优惠券,无法退回。支付后15分钟内离场"); } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2ParkCallbackService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2ParkCallbackService.java new file mode 100644 index 000000000..ea38f5ff0 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2ParkCallbackService.java @@ -0,0 +1,104 @@ +package com.iformall.service.park.impl.haikangweishiv2; + +import com.iformall.service.WxParkService; +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Map; + +@Slf4j +@Service +public class HaiKangWeiShiV2ParkCallbackService extends BaseParkService implements ParkCallBackAdapterService { + + + + @Autowired + WxParkService wxParkService; + + + /** + * {card_number=, user_name=, park_id=1101780001, sign=001b2dbfa21089a14274c4d3e330cd82, in_channel_id=营销中心入口, + * remark=正常入场, in_channel=2f48a7a9-1be5-406c-b078-51d3506adab2, park_flag=1, area_id=90221771-fe94-4cfd-80d7-c14e7c97e775, + * empty_plot=3490, user_no=, car_type=36, uid=001, in_time=1676563040, car_number=湘A87M0K, c_type=通道扫牌, in_optname=监控室, + * order_id=46eea0c8-8a0b-4583-9273-f9843a42ddec, in_image=} + */ + @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(); + Integer inTime = (Integer)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.longValue()*1000)); + } catch (Exception e) { + log.error("fute entranceTime format error",e); + return null; + } + return p; + } + + /** + * {out_channel=08497aa1-bc39-4223-9659-83fba2680082, sign=37316011fd7f4997f0937ae839246968, remark=正常出场, + * in_channel=cdb95bb9-b43e-4a4c-83cc-99d0e5e1f7d4, empty_plot=19, car_type=36, duration=99, uid=001, total=0.0000, + * freereasons=, out_image=, out_optname=监控室, pay_type=cash, in_optcode=001, reduce_amount=0.0000, out_time=1676562822, + * card_number=, park_id=1101780001, in_channel_id=南门入口相机, auth_code=, in_time=1676556899, ouid=001, out_type=通道扫牌, + * car_number=湘A67H9R, out_order_id=03d6973e-0276-4264-bd0a-5aee59e6cf98, c_type=通道扫牌, pay_channel=0, + * amount_receivable=0.0000, in_optname=监控室, out_channel_id=南门出口直行相机, order_id=03d6973e-0276-4264-bd0a-5aee59e6cf98} + */ + @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(); + Integer inTime = (Integer)paramMap.get("in_time"); + Integer outTime = (Integer)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.longValue()*1000)); + } catch (Exception e) { + log.error("fute entranceTime format error",e); + return null; + } + try { + p.setOutTime(new Date(outTime.longValue()*1000)); + } 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/haikangweishiv2/HaiKangWeiShiV2ParkService.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2ParkService.java new file mode 100644 index 000000000..d476ff6bc --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2ParkService.java @@ -0,0 +1,214 @@ +package com.iformall.service.park.impl.haikangweishiv2; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxCUserBasicInfo; +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.exception.MallinkException; +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.ParkPaidNotifyResult; +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.utils.DateUtils; +import com.iformall.utils.RedisCacheUtils; +import com.iformall.utils.RedisLock; +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 java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * 福特停车 + * http://hsh.appykt.com/ + * 1287230005_888888 123456 + */ +@Service +public class HaiKangWeiShiV2ParkService extends BaseParkService implements ParkAdapterService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + ParkHelper parkHelper; + + @Autowired + @Qualifier("objectCommonRedisTemplate") + RedisTemplate redisTemplate; + + @Autowired + RedisLock redisLock; + + HaiKangWeiShiV2Util haikangV2 = new HaiKangWeiShiV2Util(); + + private String getCacheToken(WxPark park) { + String token = RedisCacheUtils.getCacheString(redisTemplate, "carStop:haikangv2token:"+park.getId()); + if (StringUtils.isBlank(token)) { + String lockKey = "carStop:haikangv2tokenlock:"+park.getTenantId(); + long time = System.currentTimeMillis() + 2000; + String timeStr = String.valueOf(time); + if (redisLock.lock2(lockKey, timeStr)) { + token = haikangV2.getToken(park); + if (!StringUtils.isBlank(token)) { + setCacheToken(park, token); + } + redisLock.unlock(lockKey, timeStr); + } else { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + }finally { + redisLock.unlock(lockKey, timeStr); + } + } + } + return RedisCacheUtils.getCacheString(redisTemplate, "carStop:haikangv2token:"+park.getId()); + } + + private void setCacheToken(WxPark park,String token) { + RedisCacheUtils.cache(redisTemplate, "carStop:haikangv2token:"+park.getId(), token, 36000); + } + + + @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 "haikangV2"; + } + + + @Override + public void unbindCar(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ + } + + + @Override + public ParkStopFee carStopFee(Map paramMap, WxPark park,String carNumber) throws Exception{ + return haiKangWeiShiCarStopFee(paramMap, park,carNumber); + } + + private ParkStopFee haiKangWeiShiCarStopFee(Map paramMap, WxPark park,String carNumber) throws Exception{ + //如果车牌号是鄂AAAAAA, 为测试车牌 + if (carNumber.equals("鄂AAAAAA")) { + return new ParkStopFee("-111",haikangV2.utcToLocal("2020-12-16 00:00:00"),haikangV2.utcToLocal("2020-12-17 00:00:00"), + "0.01","","payPath",null,"测试车牌,仅测试用",null); + }else if(carNumber.equals("鄂AAAAAB")) { + throw new MallinkException(21000,"车辆未入场"); + } + + JSONObject attribute = haikangV2.getCarStopFee(park, carNumber, getCacheToken(park)); + + String appId = ""; + String parkOrderId = attribute.getString("billCode"); + Date _createTime = (Date) attribute.get("enterTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss” + Date _endTime = DateUtils.getSecondsTimeAfter(attribute.getIntValue("parkPeriodTime"), _createTime);//离场时间,格式为“yyyy-MM-dd HH:mi:ss” + String payPath = ""; + Integer freeMinute = (Integer)park.getVendorParamsByKey("freeMinute"); + return new ParkStopFee(parkOrderId,_createTime,_endTime, + String.valueOf(attribute.getDouble("payMoney")/100),appId,payPath,null,null,"0元请勿使用优惠券,无法退回。支付后"+freeMinute+"分钟内离场"); + } + + /** + * @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 reduceType = valueMap.get("reduceType"); + if (StringUtils.isBlank(reduceType)) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券未设置停车场优惠券配置参数[减免类型]。"+coupon.getTitle()); + } + if ((!"1".equals(reduceType)) && (!"2".equals(reduceType))) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券设置停车场优惠券配置参数[减免类型]值非法。"+coupon.getTitle()); + } + String reduceValueStr = valueMap.get("reduceValue"); + if (StringUtils.isBlank(reduceValueStr)) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券未设置停车场优惠券配置参数[减免数值]。"+coupon.getTitle()); + } + Integer reduceValue = 0; + try { + reduceValue = Integer.parseInt(reduceValueStr); + }catch(Exception e) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券设置停车场优惠券配置参数[减免数值]值非法。"+coupon.getTitle()); + } + boolean isTimeCash = false; + if ("1".equals(reduceType)) { + isTimeCash = true; + } + //查询临停信息,判断缓存是否已经存在 + JSONObject stopInfo = haikangV2.getCarStopFee(park, getCacheToken(park), carNumber); + String inRecordSyscode = stopInfo.getString("billCode"); + Integer used = RedisCacheUtils.getCacheInteger(redisTemplate, "carStop:haikangv2StopInfoUseCoupon:"+carNumber+":"+inRecordSyscode); + if (null == used || (null != used && used.intValue() < 1) ) { + //do nothing + }else { + return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "已经使用过优惠券, 不能重复使用."); + } + + JSONObject retObj = haikangV2.useCoupon(park,getCacheToken(park),carNumber,isTimeCash,reduceValue,coupon.getValidStartDate(),coupon.getValidEndDate()); + RedisCacheUtils.cache(redisTemplate, "carStop:haikangv2StopInfoUseCoupon:"+carNumber+":"+inRecordSyscode, 1, 24*3600); + return new ResultData(); + + } + + @Override + public ParkCreatePayOrder createPayOrder(Map paramMap, WxPark park, String carNumber) throws Exception { + JSONObject result = haikangV2.getCarStopFee(park, getCacheToken(park), carNumber); + Double price = result.getDouble("payMoney"); + Integer fee = new BigDecimal(price).intValue(); + return new ParkCreatePayOrder(result.getString("billCode"), fee); + } + + @Override + public ParkPaidNotifyResult notifyPaid(WxPark park,ParkNotifyPaid notifyPaid) throws Exception { + JSONObject result = haikangV2.notifyPaid(park, notifyPaid.getParkOrderNo(), notifyPaid.getFee(),getCacheToken(park)); + return new ParkPaidNotifyResult(true, result, null); + } + + @Override + public ResultData getParkStatus(WxPark park) throws Exception{ + return new ResultData(); + } + + @Override + public boolean ignoreUseCouponCache() { + return true; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2Util.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2Util.java new file mode 100644 index 000000000..a9943ac0f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishiv2/HaiKangWeiShiV2Util.java @@ -0,0 +1,301 @@ +package com.iformall.service.park.impl.haikangweishiv2; + +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 com.iformall.utils.DateUtils; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +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.util.*; + + +/** + * @author: furunxin + * @Date: 2020/7/1 17:16 + * @Description: 车易付接口对接参数类 + */ + +@Slf4j +public class HaiKangWeiShiV2Util { + + public static final String TOKEN_URL = "https://open.hikyun.com/artemis/oauth/token"; + public static final String QUERY_PRICE = "https://open.hikyun.com/artemis/api/v1/charge/getParkingPaymentInfo"; + public static final String COUPON_USE = "https://open.hikyun.com/artemis/api/v1/sendCoupon"; + public static final String NOTIFY_PAID = "https://open.hikyun.com/artemis/api/v1/charge/payment/notice"; + + /** + * @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 getToken(WxPark wxPark) { + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + String clientId = vp.getString("clientId"); + String clientSecret = vp.getString("clientSecret"); + return getToken(clientId,clientSecret); + } + + private String getToken(String clientId,String clientSecret) { + String result = ProcLogin(clientId, clientSecret); + if (StringUtils.isBlank(result)) { + return null; + } + JSONObject res = JSON.parseObject(result); + String accessToken = res.getString("access_token"); + if (null != accessToken ) { + return accessToken; + }else { + throw new MallinkException(500,"haikangv2 access_token error.["+res.getString("error")+"]"+res.getString("error_description")); + } + } + + /** + * 查询停车费 + **/ + public JSONObject getCarStopFee(WxPark wxPark,String carNumber,String token){ + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map params = new HashMap(); + params.put("plateNo", carNumber); + params.put("useCoupon", "1"); + String retCode = ProcBussiness(QUERY_PRICE, params,token); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 getCarStopInfo error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + String code = result.getString("code"); + if (!code.equals("200") ) { + String message = result.getString("msg"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 getCarStopInfo error.["+code+"]"+message); + } + return result; + } + + /** + * 使用优惠券 + **/ + public JSONObject useCoupon(WxPark wxPark,String token,String carNumber,boolean isTime,Integer cashValue,Date startTime,Date endTime){ + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + + Map params = new HashMap(); + params.put("parkCodes", vp.getString("parkCodes")); + params.put("generateObj", 1); + params.put("plateNo", carNumber); + if (isTime) { + params.put("couponType", 4); + params.put("deductContent", cashValue*60); + }else { + params.put("couponType", 1); + params.put("deductContent", 4); + } + params.put("startTime", startTime); + params.put("endTime", endTime); + params.put("couponSource", vp.getString("couponSource")); + String retCode = ProcBussiness(COUPON_USE, params,token); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 useCoupon error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + + String code = result.getString("code"); + if (!code.equals("200") ) { + String message = result.getString("msg"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 useCoupon error.["+code+"]"+message); + } + return result; + } + + /** + * 支付成功通知车场 + * @param wxPark + * @param orderNo + * @param token + * @return + */ + public JSONObject notifyPaid(WxPark wxPark,String parkOrderNo,Integer fee,String token) { + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map param = new HashMap(); + param.put("billNo", parkOrderNo);//商户编号 + param.put("thirdBillNo", parkOrderNo+wxPark.getId());//我们的单号 + param.put("payTime", DateUtils.format(new Date(),DateUtils.DATE_PATTERN_ALL_NOSPACE)); + param.put("payType", 3); + param.put("payMoney", fee); + String retCode = ProcBussiness(NOTIFY_PAID, param,token); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 notifyPaid error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + + String code = result.getString("code"); + if (!code.equals("200") ) { + String message = result.getString("msg"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikangv2 notifyPaid error.["+code+"]"+message); + } + return result; + } + + private static String ProcBussiness(String url,Map list,String token) { + try { + return Proc(url,list,token); + } catch (Exception e) { + log.error("haikangv2 request error.",e); + } + return null; + } + + private static String Proc(String url, Map pairs,String token) { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader(HTTP.CONTENT_TYPE,"application/json"); + if (!StringUtils.isBlank(token)) { + httpPost.addHeader("access_token",token); + } + + if (null != pairs) { + try { + StringEntity entity = new StringEntity(JSON.toJSONString(pairs),"UTF-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + } + + long currentTime = System.currentTimeMillis(); + StringBuffer requestlog = new StringBuffer(); + if (null != pairs) { + log.info("haikangweishiv2 httpRequest:[url]"+url+"[params]"+JSON.toJSONString(pairs)); + requestlog.append("haikangweishiv2 httpRequest:[url]").append(url).append("[params]").append(JSON.toJSONString(pairs)); + }else { + log.info("haikangweishiv2 httpRequest:[url]"+url); + requestlog.append("haikangweishiv2 httpRequest:[url]").append(url); + } + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + long responseCostTime = System.currentTimeMillis()-currentTime; + String result = null; + + //打印StatusLine + log.debug("StatusLine: " + response.getStatusLine()); + try{ + //获取实体 + HttpEntity httpEntity= response.getEntity(); + result = EntityUtils.toString(httpEntity, "UTF-8"); + requestlog.append("[response]").append(result).append("[costTime(ms)]").append(responseCostTime); + log.debug(requestlog.toString()); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + + try { //关闭流并释放资源 + httpClient.close(); + } catch (IOException e) { + log.error(e.getLocalizedMessage()); + } + return result; + } + + + private static String ProcLogin(String clientId,String clientSecret) { + ArrayList list = new ArrayList(); + list.add(new BasicNameValuePair("client_id", clientId)); + list.add(new BasicNameValuePair("client_secret", clientSecret)); + return formData(TOKEN_URL,list,null); + } + + private static String formData(String url,List pairs,String token) { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + if (!StringUtils.isBlank(token)) { + httpPost.addHeader("access_token",token); + } + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + if (null != pairs) { + for (NameValuePair nvp : pairs) { + builder.addPart(nvp.getName(), new StringBody(nvp.getValue(),ContentType.TEXT_PLAIN)); + } + } + HttpEntity entity = builder.build(); + httpPost.setEntity(entity); + long currentTime = System.currentTimeMillis(); + StringBuffer requestlog = new StringBuffer(); + if (null != pairs) { + log.info("haikangweishiv2 httpRequest start :[url]"+url+"[params]"+JSON.toJSONString(pairs)); + requestlog.append("haikangweishiv2 httpRequest:[url]").append(url).append("[params]").append(JSON.toJSONString(pairs)); + }else { + log.info("haikangweishiv2 httpRequest start :[url]"+url); + requestlog.append("haikangweishiv2 httpRequest:[url]").append(url); + } + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + long responseCostTime = System.currentTimeMillis()-currentTime; + String result = null; + + //打印StatusLine + log.debug("StatusLine: " + response.getStatusLine()); + try{ + //获取实体 + HttpEntity httpEntity= response.getEntity(); + result = EntityUtils.toString(httpEntity, "UTF-8"); + requestlog.append("[response]").append(result).append("[costTime(ms)]").append(responseCostTime); + log.debug(requestlog.toString()); + } catch (Exception e) { + log.error(e.getLocalizedMessage(),e); + } + + try { //关闭流并释放资源 + httpClient.close(); + } catch (IOException e) { + log.error(e.getLocalizedMessage()); + } + + return result; + } + +}