| @@ -64,20 +64,7 @@ public class WxCarJieShunCallBackController extends WxParkCallBackBaseController | |||
| /** | |||
| * @description 捷顺 车辆入场通知 | |||
| * “dataItems”: “[{ | |||
| \ “itemId\”: \”435FA12F3C4747B0BA48E945868FC420\”, | |||
| \ “parkName” : \”测试\”, | |||
| \ “parkCode\” : \” test\”, | |||
| \ “inTime\” : \”2017-08-28 15:40:41\”, | |||
| \ “inOperator\”: \”张山\” | |||
| \ “carNumber” : \”粤-A12345\”, | |||
| \ “idno” : \”1234455\”, | |||
| \ “equipCode\”: \”2312313\”, | |||
| \ “equipName” : \”入口\”, | |||
| … | |||
| }, | |||
| …… | |||
| ] | |||
| * {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} | |||
| * | |||
| * | |||
| * | |||
| @@ -88,7 +75,7 @@ public class WxCarJieShunCallBackController extends WxParkCallBackBaseController | |||
| **/ | |||
| @PostMapping(value = "/parkIn") | |||
| public Result parkInCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback parkIn: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.parkInCallBack(EnumCarVendor.CAR_JIESHUN, EnumCarCmd.CAR_JIESHUN_CALLBACK_PARK_IN, paramMap); | |||
| } | |||
| @@ -104,21 +91,21 @@ public class WxCarJieShunCallBackController extends WxParkCallBackBaseController | |||
| @PostMapping(value = "/parkOut") | |||
| public Result parkOutCallback(@RequestBody WxCarCYFVo param) { | |||
| String requestJson = JSONObject.toJSONString(param); | |||
| log.info("["+getIpAddr()+"jieshunCarCallback: " + requestJson); | |||
| log.info("["+getIpAddr()+"jieshunCarCallback parkOut: " + requestJson); | |||
| return super.parkOutCallBack(EnumCarVendor.CAE_CYF, EnumCarCmd.CAR_JIESHUN_CALLBACK_PARK_OUT, param); | |||
| } | |||
| @PostMapping(value = "/unbind") | |||
| public Result unbindCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback unbind: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.unbindCarCallBack(EnumCarVendor.CAR_JIESHUN, EnumCarCmd.CAR_JIESHUN_CALLBACK_UNBIND, paramMap); | |||
| } | |||
| @PostMapping(value = "/paid") | |||
| public Result paidCallback(@RequestBody Map<String, Object> paramMap) { | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback: " + paramMap.toString()); | |||
| log.info("["+getIpAddr()+"] jieshunCarCallback paid: " + paramMap.toString()); | |||
| //解析车易付参数 | |||
| return super.paidCallback(EnumCarVendor.CAR_JIESHUN, EnumCarCmd.CAR_JIESHUN_CALLBACK_PAID, paramMap); | |||
| } | |||
| @@ -50,27 +50,7 @@ public class JieShunParkCallbackService extends BaseParkService implements ParkB | |||
| } | |||
| /** | |||
| * { | |||
| “pno”:”平台编号”, | |||
| “tn”:”令牌”, | |||
| “ts”:”请求时间” | |||
| “sn”:”签名”, | |||
| “ve”:”版本号”, | |||
| “dataItems”:“[{ | |||
| \ “itemId\”: \”435FA12F3C4747B0BA48E945868FC420\”, | |||
| \ “parkName” : \”测试\”, | |||
| \ “parkCode\” : \” test\”, | |||
| \ “inTime\” : \”2017-08-28 15:40:41\”, | |||
| \ “inOperator\”: \”张山\” | |||
| \ “carNumber” : \”粤-A12345\”, | |||
| \ “idno” : \”1234455\”, | |||
| \ “equipCode\”: \”2312313\”, | |||
| \ “equipName” : \”入口\”, | |||
| … | |||
| }, | |||
| …… | |||
| ]” | |||
| } | |||
| * {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 List<ParkNotifyParam> parseInNoticyParam(Object param) { | |||
| @@ -107,7 +87,7 @@ public class JieShunParkCallbackService extends BaseParkService implements ParkB | |||
| try { | |||
| p.setEntranceTime(JieShunUtil.utcToLocal(entranceTime)); | |||
| } catch (ParseException e) { | |||
| log.error("cyf entranceTime format error",e); | |||
| log.error("jieshun entranceTime format error",e); | |||
| return null; | |||
| } | |||
| //下订单; | |||
| @@ -115,6 +95,10 @@ public class JieShunParkCallbackService extends BaseParkService implements ParkB | |||
| pq.setVendorType(EnumCarVendor.CAR_JIESHUN.getCode()); | |||
| pq.setParkId(parkCode); | |||
| WxPark park = wxParkService.getByObj(pq); | |||
| if (park == null ) { | |||
| log.error("wxPark jieshun parkCode :"+parkCode+" not fund"); | |||
| return null; | |||
| } | |||
| String retCode = jieshunParkService.createOrder(park, carNumber); | |||
| if (StringUtils.isBlank(retCode)) { | |||
| throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "jieshun createOrder error. has no result"); | |||
| @@ -68,29 +68,28 @@ public class JieShunParkService extends BaseParkService implements ParkAdapterSe | |||
| private String getCacheToken(WxPark park) { | |||
| // String token = RedisCacheUtils.getCacheString(baseCUserTokenRedisTemplate, "carStop:jieshuntoken:"+park.getId()); | |||
| // if (StringUtils.isBlank(token)) { | |||
| // String lockKey = "carStop:jieshuntokenlock:"+park.getTenantId(); | |||
| // long time = System.currentTimeMillis() + 2000; | |||
| // String timeStr = String.valueOf(time); | |||
| // if (redisLock.lock2(lockKey, timeStr)) { | |||
| // token = jieshun.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(baseCUserTokenRedisTemplate, "carStop:jieshuntoken:"+park.getId()); | |||
| return null; | |||
| String token = RedisCacheUtils.getCacheString(baseCUserTokenRedisTemplate, "carStop:jieshuntoken:"+park.getId()); | |||
| if (StringUtils.isBlank(token)) { | |||
| String lockKey = "carStop:jieshuntokenlock:"+park.getTenantId(); | |||
| long time = System.currentTimeMillis() + 2000; | |||
| String timeStr = String.valueOf(time); | |||
| if (redisLock.lock2(lockKey, timeStr)) { | |||
| token = jieshun.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(baseCUserTokenRedisTemplate, "carStop:jieshuntoken:"+park.getId()); | |||
| } | |||
| private void setCacheToken(WxPark park,String token) { | |||
| @@ -3,6 +3,7 @@ package com.iformall.service.park.impl.jieshun; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.domain.po.WxPark; | |||
| import com.iformall.exception.MallinkException; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| @@ -23,6 +24,7 @@ import org.apache.http.util.EntityUtils; | |||
| import java.io.IOException; | |||
| import java.io.UnsupportedEncodingException; | |||
| import java.net.URLEncoder; | |||
| import java.security.MessageDigest; | |||
| import java.security.NoSuchAlgorithmException; | |||
| import java.text.ParseException; | |||
| @@ -60,26 +62,12 @@ public class JieShunUtil { | |||
| public static final String TOKEN_URL = "http://www.jslife.com.cn/jsaims/login"; | |||
| public static final String CREATE_ORDER = ""; | |||
| public static final String CREATE_ORDER = "http://www.jslife.com.cn/jsaims/as"; | |||
| public static final String QUERY_ORDER = ""; | |||
| public static final String QUERY_ORDER = "http://www.jslife.com.cn/jsaims/as"; | |||
| public static final String GET_COUPON = ""; | |||
| public static final String COUPON_USE = ""; | |||
| //会员车辆信息注册接口地址 | |||
| public static final String REGISTER_CAR_URL = "http://open.cheyifu2016.com:8892/openapi/personCar"; | |||
| //获取停车费 | |||
| public static final String GET_CAR_STOPFEE = "http://open.cheyifu2016.com:8892/openapi/getFee"; | |||
| //解绑车辆 | |||
| public static final String UNBIND_CAR = "http://oepn.cheyifu2016.com:8892/openapi/personCar/delete"; | |||
| //优惠券缴费接口 | |||
| public static final String COUPON_FEE = "http://oepn.cheyifu2016.com:8892/openapi/couponFee"; | |||
| public static final String GET_COUPON = "http://www.jslife.com.cn/jsaims/as"; | |||
| public static final String COUPON_USE = "http://www.jslife.com.cn/jsaims/as"; | |||
| /** | |||
| * @description UTC时间转化为本地时间 | |||
| @@ -91,8 +79,7 @@ public class JieShunUtil { | |||
| public static Date utcToLocal(String seconds) throws ParseException { | |||
| String format = "yyyy-MM-dd HH:mm:ss"; | |||
| SimpleDateFormat sdf = new SimpleDateFormat(format); | |||
| String d = sdf.format(new Date(Long.valueOf(seconds+"000"))); | |||
| Date date=sdf.parse(d); | |||
| Date date=sdf.parse(seconds); | |||
| return date; | |||
| } | |||
| @@ -121,7 +108,8 @@ public class JieShunUtil { | |||
| JSONObject res = JSON.parseObject(result); | |||
| Integer code = res.getInteger("resultCode"); | |||
| if (null == code || code.intValue() != 0) { | |||
| return null; | |||
| String msg = res.getString("message"); | |||
| throw new MallinkException(code,msg); | |||
| } | |||
| return res.getString("token"); | |||
| } | |||
| @@ -157,7 +145,7 @@ public class JieShunUtil { | |||
| param.put("carNo", handleCarNumber(cardNumber)); | |||
| Map map = generateMap("3c.pay.createorderbycarno",param); | |||
| log.info("jieshun create order :" + JSON.toJSONString(map)); | |||
| return ProcBussiness(CREATE_ORDER, wxPark.getParkingId(), map, token,vp.getString("version")); | |||
| return ProcBussiness(CREATE_ORDER, wxPark.getParkingId(), map, token,vp.getString("version"),vp.getString("signkey")); | |||
| } | |||
| /** | |||
| @@ -170,7 +158,7 @@ public class JieShunUtil { | |||
| param.put("orderNo", orderNo);//商户编号 | |||
| Map map = generateMap("3c.pay.queryorder",param); | |||
| log.info("jieshun getCarStopFee :" + JSON.toJSONString(map)); | |||
| return ProcBussiness(QUERY_ORDER, wxPark.getParkingId(), map, token,vp.getString("version")); | |||
| return ProcBussiness(QUERY_ORDER, wxPark.getParkingId(), map, token,vp.getString("version"),vp.getString("signkey")); | |||
| } | |||
| @@ -188,7 +176,7 @@ public class JieShunUtil { | |||
| param.put("tel", phone);//商户编号 | |||
| Map map = generateMap("3c.coupons.receive.coupons",param); | |||
| log.info("jieshun getCoupon :" + JSON.toJSONString(map)); | |||
| return ProcBussiness(GET_COUPON, wxPark.getParkingId(), map, token,vp.getString("version")); | |||
| return ProcBussiness(GET_COUPON, wxPark.getParkingId(), map, token,vp.getString("version"),vp.getString("signkey")); | |||
| } | |||
| @@ -206,35 +194,43 @@ public class JieShunUtil { | |||
| param.put("parkCode", wxPark.getParkId()); | |||
| Map map = generateMap("3c.coupons.use.coupons",param); | |||
| log.info("jieshun useCoupon :" + JSON.toJSONString(map)); | |||
| return ProcBussiness(COUPON_USE, wxPark.getParkingId(), map, token,vp.getString("version")); | |||
| return ProcBussiness(COUPON_USE, wxPark.getParkingId(), map, token,vp.getString("version"),vp.getString("signkey")); | |||
| } | |||
| private static String ProcLogin(String cid,String user,String password) { | |||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| list.add(new BasicNameValuePair("cid", cid)); | |||
| list.add(new BasicNameValuePair("usr", user)); | |||
| list.add(new BasicNameValuePair("psw",password)); | |||
| return Proc(TOKEN_URL,list); | |||
| String url = TOKEN_URL +"?cid="+cid+"&usr="+user+"&psw="+password; | |||
| // ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| // list.add(new BasicNameValuePair("cid", cid)); | |||
| // list.add(new BasicNameValuePair("usr", user)); | |||
| // list.add(new BasicNameValuePair("psw",password)); | |||
| return Proc(url,null); | |||
| } | |||
| private static String ProcBussiness(String url,String cid,Map<String,Object> param,String token,String version) { | |||
| private static String ProcBussiness(String url,String cid,Map<String,Object> param,String token,String version,String signKey) { | |||
| try { | |||
| MessageDigest md5Tool = MessageDigest.getInstance("MD5"); | |||
| String p = JSON.toJSONString(param); | |||
| byte[] md5Data = md5Tool.digest(p.getBytes("UTF-8")); | |||
| String p = JSON.toJSONString(param); | |||
| byte[] md5Data = md5Tool.digest((p+signKey).getBytes("UTF-8")); | |||
| String sn = toHexString(md5Data); | |||
| ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| list.add(new BasicNameValuePair("cid", cid)); | |||
| list.add(new BasicNameValuePair("v", version));//版本号 | |||
| list.add(new BasicNameValuePair("p",p)); | |||
| list.add(new BasicNameValuePair("sn",sn)); | |||
| if (!StringUtils.isBlank(token)) { | |||
| list.add(new BasicNameValuePair("tn",token)); | |||
| if (url.contains("?")) { | |||
| url = url + "&"; | |||
| }else { | |||
| url = url + "?"; | |||
| } | |||
| return Proc(url,list); | |||
| url = url+"cid="+cid+"&tn="+token+"&sn="+sn+"&v="+version+"&p="+URLEncoder.encode(p, "UTF-8"); | |||
| // | |||
| // ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); | |||
| // list.add(new BasicNameValuePair("cid", cid)); | |||
| // list.add(new BasicNameValuePair("v", version));//版本号 | |||
| // list.add(new BasicNameValuePair("p",p)); | |||
| // list.add(new BasicNameValuePair("sn",sn)); | |||
| // if (!StringUtils.isBlank(token)) { | |||
| // list.add(new BasicNameValuePair("tn",token)); | |||
| // } | |||
| return Proc(url,null); | |||
| } catch (NoSuchAlgorithmException e) { | |||
| log.error("jieshun request error.",e); | |||
| } catch (UnsupportedEncodingException e) { | |||
| @@ -271,11 +267,16 @@ public class JieShunUtil { | |||
| } | |||
| if (null != pairs) { | |||
| log.info("jieshun httpRequest:[url]"+url+"[params]"+JSON.toJSONString(pairs)); | |||
| }else { | |||
| log.info("jieshun httpRequest:[url]"+url); | |||
| } | |||
| HttpResponse response = null; | |||
| try { | |||
| response = httpClient.execute(httpPost); | |||
| } catch (Exception e) { | |||
| log.error(e.getLocalizedMessage()); | |||
| log.error(e.getLocalizedMessage(),e); | |||
| } | |||
| String result = null; | |||