From 237904bd9a81280a9780e59454b4bcf36a5bd4df Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Wed, 8 Dec 2021 16:18:36 +0800 Subject: [PATCH 1/4] fix haikangweishi --- .../iformall/controller/WxCarController.java | 16 +++++++++++++++ .../service/park/ParkAdapterService.java | 2 ++ .../park/impl/bolink/BoLinkParkService.java | 6 ++++++ .../service/park/impl/cyf/CYFParkService.java | 5 +++++ .../park/impl/dahua/DaHuaParkService.java | 6 ++++++ .../HaiKangWeiShiParkService.java | 20 +++++++++++++++++++ .../impl/haikangweishi/HaiKangWeiShiUtil.java | 15 ++++++++++---- .../park/impl/jieshun/JieShunParkService.java | 8 +++++++- .../park/impl/shangan/ShangAnParkService.java | 5 +++++ .../service/park/impl/tjd/TJDParkService.java | 6 +++++- 10 files changed, 83 insertions(+), 6 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java index 581e47643..284019543 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java @@ -85,6 +85,22 @@ public class WxCarController extends BaseController { return wxPark; } + @ApiOperation(value = "车厂初始化配置", notes = "返回\n{\"vendor\":integer}") + @GetMapping("/parkInitConfig") + public ResultData parkInitConfig() { + // 1, get mall's park + WxPark park = getCurrentPark(getTenantInfo()); + if (park.getVendorType().equals(EnumCarVendor.CAR_ETCP.getCode())) { + return new ResultData(); + }else { + try { + return parkFactory.getParkService(park.getVendorType()).parkInitConfig(park); + } catch (Exception e) { + return new ResultData(Result.ERROR,"车厂初始化配置失败。"+e.getMessage()); + } + } + } + @ApiOperation(value = "获取车场支持的厂家", notes = "返回\n{\"vendor\":integer}") @GetMapping("/getVendor") public ResultData getVendor() { 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 0be887611..f032410e2 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java +++ b/mallinkService/src/main/java/com/iformall/service/park/ParkAdapterService.java @@ -15,6 +15,8 @@ import com.iformall.domain.vo.WxCouponOrderCarCVo; */ public interface ParkAdapterService { + ResultData parkInitConfig(WxPark park) throws Exception; + /** * 停车场初始化登陆 * @param paramMap 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 e0655dcad..930b4c757 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 @@ -21,6 +21,12 @@ import com.iformall.service.park.impl.BaseParkService; @Service public class BoLinkParkService extends BaseParkService implements ParkAdapterService { + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } + @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) { return null; 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 b7e01b111..b10b25733 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 @@ -37,6 +37,11 @@ public class CYFParkService extends BaseParkService implements ParkAdapterServic CYFUtil cyf = new CYFUtil(); + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) 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 f3e592338..051965ac4 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 @@ -21,6 +21,12 @@ public class DaHuaParkService extends BaseParkService implements ParkAdapterServ private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } + @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) { return null; 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 d2446cde0..2bdefa03d 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 @@ -17,6 +17,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; +import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCarJSOrder; @@ -90,6 +91,24 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda RedisCacheUtils.cache(redisTemplate, "carStop:haikangtoken:"+park.getId(), token, 36000); } + + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + Map retMap = new HashMap(); + try { + JSONObject retObj = haikang.subscription(park, getCacheToken(park)); + if (retObj.getIntValue("code") == 0){ + return new ResultData(); + }else { + logger.error("haikangweishi parkInitConfig error. haikangResult: {}",retObj); + String msg = retObj.getString("msg"); + return new ResultData(retObj.getIntValue("code"), "当前海康威视停车场初始化配置失败:"+msg); + } + }catch(Exception e) { + return new ResultData(Result.ERROR, "当前海康威视停车场初始化配置失败:"+e.getMessage()); + } + } + @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ return null; @@ -177,5 +196,6 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda public ResultData getParkStatus(WxPark park) throws Exception{ return new ResultData(); } + } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java index d245a1c95..1ad2b54d7 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java @@ -148,26 +148,33 @@ public class HaiKangWeiShiUtil { /** * 消息订阅 3.1.8 + * * 这个接口需要你们实现的时候规定下: +1、POST格式, +2、接口返回参数JSON格式:{errcode:0, errmsg: "success",data:null} +3、接口建议接收到过车事件,立即返回接收成功 + +我这边根据这个 0 状态来判断你们是否接收成功,如果没成功,我这边会重发3次的 + * * @param clientId * @param clientSecret * @return */ - public JSONObject subscription(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token){ + public JSONObject subscription(WxPark wxPark,String token){ String vendroParams = wxPark.getVendorParams(); JSONObject vp = JSON.parseObject(vendroParams); ArrayList list = new ArrayList(); list.add(new BasicNameValuePair("partnerAppKey", vp.getString("AppKey")));//商户编号 list.add(new BasicNameValuePair("projectId", vp.getString("projectId"))); - list.add(new BasicNameValuePair("eventTypes", carNumber)); + list.add(new BasicNameValuePair("eventTypes", "[\"771760131\",\"771760134\"]")); list.add(new BasicNameValuePair("subUrl", vp.getString("subUrl"))); String retCode = ProcBussiness(SUBSCRIPTION, list,token); if (StringUtils.isBlank(retCode)) { - throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang useCoupon error. has no result"); + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang subscription error. has no result"); } JSONObject result = JSON.parseObject(retCode); if (result.getInteger("code") != 0 ) { String message = result.getString("msg"); - throw new MallinkException(result.getInteger("code"), "haikang useCoupon error."+message); + throw new MallinkException(result.getInteger("code"), "haikang subscription error."+message); } return result; } 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 d02705287..0bad0cd8d 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 @@ -101,7 +101,6 @@ public class JieShunParkService extends BaseParkService implements ParkAdapterSe RedisCacheUtils.cache(redisTemplate, "carStop:jieshuntoken:"+park.getId(), token, 3600); } - /** * 先去捷顺注册,调用登陆获取令牌,然后根据令牌调用别的接口 * http://ap.jieshun.cn:9088/apply/ 注册信息地址 fumao/iformall2020 @@ -117,6 +116,13 @@ public class JieShunParkService extends BaseParkService implements ParkAdapterSe 3、所有接口要带车牌的一律带横杠。格式如:粤-B12345。 4、无效的数据签名是指sn加密方式不对。sn加密方式是对p+signkey进行Md5加密,加密后的字符串大写。 */ + + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } + @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{ return null; 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 15bcd427d..78b54f9ee 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 @@ -29,6 +29,11 @@ public class ShangAnParkService extends BaseParkService implements ParkAdapterSe @Autowired WxCouponOrderService wxCouponOrderService; + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) { 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 03f3fbc4f..ac40928a3 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 @@ -55,6 +55,11 @@ public class TJDParkService extends BaseParkService implements ParkAdapterServic @Autowired WxCouponService couponService; + @Override + public ResultData parkInitConfig(WxPark park) throws Exception { + // TODO Auto-generated method stub + return null; + } @Override public String initLogin(Map paramMap, WxPark park, WxCUserBasicInfo member) { @@ -249,5 +254,4 @@ public class TJDParkService extends BaseParkService implements ParkAdapterServic public ResultData getParkStatus(WxPark park) { return null; } - } From 5392fb1d969fc07679b73c05bf78539279c1f0b3 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 14 Dec 2021 20:16:44 +0800 Subject: [PATCH 2/4] fix haikang --- .../HaiKangWeiShiParkService.java | 15 +- .../impl/haikangweishi/HaiKangWeiShiUtil.java | 236 +++++++++++++++--- .../haikangweishi/entity/ChallengeCode.java | 15 ++ 3 files changed, 222 insertions(+), 44 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java 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 2bdefa03d..30ce95985 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 @@ -40,7 +40,16 @@ import com.iformall.utils.RedisLock; /** * 认证平台 https://www.hikyun.com 武汉富茂链客/zfy151431113 + * + * pms.hikyun.com 停车场管理云平台 账号sdw1112131,密码mcgc123456 + * https://open.hikyun.com/1/document/0 + + @配置说明 + clientId,clientSecret 停车场管理系统控制台的。 + productCode: 停车场管理系统产品在云耀注册的id,固定。 + pmsName,pmsPassword : 停车场管理系统pms.hikyun.com 的账号密码 + projectId,ak : 停车场管理系统在云曜推送接口上创建的一个认证标识,联系 超云(开发)给提供 * @author alascor * */ @@ -96,7 +105,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda public ResultData parkInitConfig(WxPark park) throws Exception { Map retMap = new HashMap(); try { - JSONObject retObj = haikang.subscription(park, getCacheToken(park)); + JSONObject retObj = haikang.subscription(park, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park))); if (retObj.getIntValue("code") == 0){ return new ResultData(); }else { @@ -148,7 +157,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda return new ResultData(21000,"车辆未入场"); } - JSONObject attribute = haikang.getFee(park, carNumber, getCacheToken(park)); + JSONObject attribute = haikang.getFee(park, carNumber, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park))); String appId = ""; String parkOrderId = attribute.getString("id"); @@ -182,7 +191,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda if (StringUtils.isBlank(planNo)) { return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置[planNo]。"+coupon.getTitle()); } - JSONObject retObj = haikang.useCoupon(park,planNo,carNumber,orderNo, getCacheToken(park)); + JSONObject retObj = haikang.useCoupon(park,planNo,carNumber,orderNo, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park))); if (retObj.getIntValue("code") == 0){ return new ResultData(); }else { diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java index 1ad2b54d7..f35fde5b5 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java @@ -6,20 +6,35 @@ import com.alibaba.fastjson.JSONObject; import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxPark; import com.iformall.exception.MallinkException; +import com.iformall.service.park.impl.haikangweishi.entity.ChallengeCode; +import com.iformall.utils.HashUtil; + 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.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; 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.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntity; +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.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; @@ -41,6 +56,8 @@ import java.util.Map; public class HaiKangWeiShiUtil { public static final String TOKEN_URL = "https://open.hikyun.com/artemis/oauth/token"; + public static final String CHALLENGE_CODE = "https://open.hikyun.com/artemis/api/eits/v1/challengeCode"; + public static final String AUTHROZITAION = "https://open.hikyun.com/artemis/api/eits/v1/login"; public static final String GET_FEE = "https://open.hikyun.com/api/pmsc/v1/pay/ quickGetVehicleBill"; public static final String COUPON_USE = "https://open.hikyun.com/api/pmsc/v1/coupon/addition"; public static final String SUBSCRIPTION = "https://open.hikyun.com/api/pmsc/v1/sub/subscription"; @@ -70,43 +87,120 @@ public class HaiKangWeiShiUtil { public String getToken(WxPark wxPark) { String vendroParams = wxPark.getVendorParams(); JSONObject vp = JSON.parseObject(vendroParams); - String clientId = vp.getString("AppKey"); - String clientSecret = vp.getString("SecretKey"); + String clientId = vp.getString("clientId"); + String clientSecret = vp.getString("clientSecret"); return getToken(clientId,clientSecret); } + private ChallengeCode getChallengeCode(WxPark wxPark,String accessToken) { + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + Map params = new HashMap(); + params.put("name", vp.getString("pmsName"));//pms.hikyun.com 的账号 + params.put("productCode", vp.getString("productCode")); + params.put("type", "1"); + String retCode = ProcBussiness(CHALLENGE_CODE, params,accessToken,null); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getChallengeCode error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + + Integer errStatus = result.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang getChallengeCode error.["+result.getString("error")+"]"+result.getString("message")); + } + + if (!result.getString("code").equals("200") ) { + String message = result.getString("msg"); + throw new MallinkException(result.getInteger("code"), "haikang getChallengeCode error."+message); + } + JSONObject attribute = result.getJSONObject("data"); + if (null == attribute) { + throw new MallinkException(result.getInteger("code"), "haikang getChallengeCode error. no result"); + } + return new ChallengeCode(attribute.getString("pwdStatus"),attribute.getString("codeId"),attribute.getString("salt"),attribute.getString("vCode")); + } + + private static String entryPmsPassword(String password,String salt,String vCode) { + return HashUtil.sha256(HashUtil.sha256(password+salt)+vCode); + } + + //使用后不能再次使用,并且有很短的过期时间 + public String getAuthorization(WxPark wxPark,String accessToken) { + String vendroParams = wxPark.getVendorParams(); + JSONObject vp = JSON.parseObject(vendroParams); + ChallengeCode challengeCode = getChallengeCode(wxPark,accessToken); + Map params = new HashMap(); + params.put("name", vp.getString("pmsName"));//pms.hikyun.com 的账号 + params.put("productCode", vp.getString("productCode")); + params.put("type", "1"); + params.put("codeId", challengeCode.getCodeId()); + params.put("password", entryPmsPassword(vp.getString("pmsPassword"),challengeCode.getSalt(),challengeCode.getVCode())); + String retCode = ProcBussiness(AUTHROZITAION, params,accessToken,null); + if (StringUtils.isBlank(retCode)) { + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getAuthorization error. has no result"); + } + JSONObject result = JSON.parseObject(retCode); + + Integer errStatus = result.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang getAuthorization error.["+result.getString("error")+"]"+result.getString("message")); + } + + if (!result.getString("code").equals("200") ) { + String message = result.getString("msg"); + throw new MallinkException(result.getInteger("code"), "haikang getAuthorization error."+message); + } + JSONObject attribute = result.getJSONObject("data"); + if (null == attribute) { + throw new MallinkException(result.getInteger("code"), "haikang getAuthorization error. no result"); + } + return attribute.getString("Authorization"); + + } + private String getToken(String clientId,String clientSecret) { String result = ProcLogin(clientId, clientSecret); - log.info("haikang token clientId:"+clientId+" clientSecret:"+clientSecret+" result: "+result); if (StringUtils.isBlank(result)) { return null; } JSONObject res = JSON.parseObject(result); - Integer code = res.getInteger("code"); - if (null == code || code.intValue() != 0) { - String msg = res.getString("msg"); - throw new MallinkException(code,msg); + Integer errStatus = res.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang access_token error.["+res.getString("error")+"]"+res.getString("message")); + } + + String accessToken = res.getString("access_token"); + if (null != accessToken ) { + return accessToken; + }else { + throw new MallinkException(500,"haikang access_token error.["+res.getString("error")+"]"+res.getString("error_description")); } - return res.getString("access_token"); } /** * 查询停车费 3.5.5 快速获取账单接口 * @return */ - public JSONObject getFee(WxPark wxPark,String carNumber,String token) { + public JSONObject getFee(WxPark wxPark,String carNumber,String token,String Authrozitaion) { String vendroParams = wxPark.getVendorParams(); JSONObject vp = JSON.parseObject(vendroParams); - ArrayList list = new ArrayList(); - list.add(new BasicNameValuePair("chargeSource", "THIRD"));//商户编号 - list.add(new BasicNameValuePair("parkId", wxPark.getParkingId())); - list.add(new BasicNameValuePair("plateNo", carNumber)); - String retCode= ProcBussiness(GET_FEE, list, token); + Map params = new HashMap(); + params.put("chargeSource", "THIRD");//商户编号 + params.put("parkId", wxPark.getParkingId()); + params.put("plateNo", carNumber); + String retCode= ProcBussiness(GET_FEE, params, token,Authrozitaion); if (StringUtils.isBlank(retCode)) { throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getFee error. has no result"); } JSONObject result = JSON.parseObject(retCode); - if (result.getInteger("code") != 0 ) { + + Integer errStatus = result.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang getFee error.["+result.getString("error")+"]"+result.getString("message")); + } + + if (!result.getString("code").equals("200") ) { String message = result.getString("msg"); throw new MallinkException(result.getInteger("code"), "haikang getFee error."+message); } @@ -126,20 +220,26 @@ public class HaiKangWeiShiUtil { 完成一次优惠缴费 * 使用优惠券 3.5.9.1接口进行车牌和优惠信息绑定优惠券后,车辆出场时会自动抵扣 **/ - public JSONObject useCoupon(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token){ + public JSONObject useCoupon(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token,String Authrozitaion){ String vendroParams = wxPark.getVendorParams(); JSONObject vp = JSON.parseObject(vendroParams); - ArrayList list = new ArrayList(); + Map params = new HashMap(); Map couponmap = new HashMap(); couponmap.put("plateNo", carNumber); couponmap.put("ruleId", couponNo); - list.add(new BasicNameValuePair("coupons", "["+JSON.toJSONString(couponmap)+"]") );//商户编号 - String retCode = ProcBussiness(COUPON_USE, list,token); + params.put("coupons", "["+JSON.toJSONString(couponmap)+"]");//商户编号 + String retCode = ProcBussiness(COUPON_USE, params,token,Authrozitaion); if (StringUtils.isBlank(retCode)) { throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang useCoupon error. has no result"); } JSONObject result = JSON.parseObject(retCode); - if (result.getInteger("code") != 0 ) { + + Integer errStatus = result.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang useCoupon error.["+result.getString("error")+"]"+result.getString("message")); + } + + if (!result.getString("code").equals("200") ) { String message = result.getString("msg"); throw new MallinkException(result.getInteger("code"), "haikang useCoupon error."+message); } @@ -159,20 +259,26 @@ public class HaiKangWeiShiUtil { * @param clientSecret * @return */ - public JSONObject subscription(WxPark wxPark,String token){ + public JSONObject subscription(WxPark wxPark,String token,String Authrozitaion){ String vendroParams = wxPark.getVendorParams(); JSONObject vp = JSON.parseObject(vendroParams); - ArrayList list = new ArrayList(); - list.add(new BasicNameValuePair("partnerAppKey", vp.getString("AppKey")));//商户编号 - list.add(new BasicNameValuePair("projectId", vp.getString("projectId"))); - list.add(new BasicNameValuePair("eventTypes", "[\"771760131\",\"771760134\"]")); - list.add(new BasicNameValuePair("subUrl", vp.getString("subUrl"))); - String retCode = ProcBussiness(SUBSCRIPTION, list,token); + Map params = new HashMap(); + params.put("partnerAppKey", vp.getString("ak"));//商户编号 + params.put("projectId", vp.getString("projectId")); + params.put("eventTypes", "[\"771760131\",\"771760134\"]"); + params.put("subUrl", vp.getString("subUrl")); + String retCode = ProcBussiness(SUBSCRIPTION, params,token,Authrozitaion); if (StringUtils.isBlank(retCode)) { throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang subscription error. has no result"); } JSONObject result = JSON.parseObject(retCode); - if (result.getInteger("code") != 0 ) { + + Integer errStatus = result.getInteger("status"); + if (null != errStatus) { + throw new MallinkException(errStatus,"haikang subscription error.["+result.getString("error")+"]"+result.getString("message")); + } + + if (!result.getString("code").equals("200") ) { String message = result.getString("msg"); throw new MallinkException(result.getInteger("code"), "haikang subscription error."+message); } @@ -184,12 +290,13 @@ public class HaiKangWeiShiUtil { ArrayList list = new ArrayList(); list.add(new BasicNameValuePair("client_id", clientId)); list.add(new BasicNameValuePair("client_secret", clientSecret)); - return Proc(TOKEN_URL,list,null,null); + return formData(TOKEN_URL,list,null,null); } - private static String ProcBussiness(String url,ArrayList list,String token) { + + + private static String ProcBussiness(String url,Map list,String token,String authorization) { try { - String authorization = ""; return Proc(url,list,token,authorization); } catch (Exception e) { log.error("haikang request error.",e); @@ -197,13 +304,10 @@ public class HaiKangWeiShiUtil { return null; } - private static String Proc(String url, List pairs,String token,String authorization) { + private static String Proc(String url, Map pairs,String token,String authorization) { 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 (!StringUtils.isBlank(token)) { httpPost.addHeader("access_token",token); } @@ -212,15 +316,13 @@ public class HaiKangWeiShiUtil { } if (null != pairs) { - HttpEntity en; - try { - en = new UrlEncodedFormEntity(pairs, HTTP.UTF_8); - httpPost.setEntity(en); + try { + StringEntity entity = new StringEntity(JSON.toJSONString(pairs)); + entity.setContentType("application/json"); + httpPost.setEntity(entity); } catch (UnsupportedEncodingException e) { log.error(e.getLocalizedMessage(),e); - return null; } - } if (null != pairs) { @@ -255,4 +357,56 @@ public class HaiKangWeiShiUtil { } return result; } + + private static String formData(String url,List pairs,String token,String authorization) { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + if (!StringUtils.isBlank(token)) { + httpPost.addHeader("access_token",token); + } + if (!StringUtils.isBlank(authorization)) { + httpPost.addHeader("Authorization",authorization); + } + 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); + + if (null != pairs) { + log.info("haikangweishi httpRequest:[url]"+url+"[params]"+JSON.toJSONString(pairs)); + }else { + log.info("haikangweishi 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; + } } diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java new file mode 100644 index 000000000..a36022e32 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java @@ -0,0 +1,15 @@ +package com.iformall.service.park.impl.haikangweishi.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ChallengeCode { + + private String pwdStatus; + private String codeId; + private String salt; + private String vCode; + +} From 163a0b75019777dcc298fb132c04a455f89f0063 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Wed, 15 Dec 2021 11:03:42 +0800 Subject: [PATCH 3/4] fix bug --- .../park/impl/haikangweishi/HaiKangWeiShiParkService.java | 2 +- .../service/park/impl/haikangweishi/HaiKangWeiShiUtil.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 30ce95985..950748703 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 @@ -106,7 +106,7 @@ public class HaiKangWeiShiParkService extends BaseParkService implements ParkAda Map retMap = new HashMap(); try { JSONObject retObj = haikang.subscription(park, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park))); - if (retObj.getIntValue("code") == 0){ + if (retObj.getString("code").equals("0")){ return new ResultData(); }else { logger.error("haikangweishi parkInitConfig error. haikangResult: {}",retObj); diff --git a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java index f35fde5b5..da6727a78 100644 --- a/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java +++ b/mallinkService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java @@ -60,7 +60,7 @@ public class HaiKangWeiShiUtil { public static final String AUTHROZITAION = "https://open.hikyun.com/artemis/api/eits/v1/login"; public static final String GET_FEE = "https://open.hikyun.com/api/pmsc/v1/pay/ quickGetVehicleBill"; public static final String COUPON_USE = "https://open.hikyun.com/api/pmsc/v1/coupon/addition"; - public static final String SUBSCRIPTION = "https://open.hikyun.com/api/pmsc/v1/sub/subscription"; + public static final String SUBSCRIPTION = "https://open.hikyun.com/artemis/api/pmsc/v1/sub/subscription"; /** @@ -265,7 +265,7 @@ public class HaiKangWeiShiUtil { Map params = new HashMap(); params.put("partnerAppKey", vp.getString("ak"));//商户编号 params.put("projectId", vp.getString("projectId")); - params.put("eventTypes", "[\"771760131\",\"771760134\"]"); + params.put("eventTypes", new Integer[] {771760131,771760134}); params.put("subUrl", vp.getString("subUrl")); String retCode = ProcBussiness(SUBSCRIPTION, params,token,Authrozitaion); if (StringUtils.isBlank(retCode)) { @@ -278,7 +278,7 @@ public class HaiKangWeiShiUtil { throw new MallinkException(errStatus,"haikang subscription error.["+result.getString("error")+"]"+result.getString("message")); } - if (!result.getString("code").equals("200") ) { + if (!result.getString("code").equals("0") ) { String message = result.getString("msg"); throw new MallinkException(result.getInteger("code"), "haikang subscription error."+message); } From b3738a42e345db2817dbff4168414be89997ba45 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Wed, 15 Dec 2021 15:39:13 +0800 Subject: [PATCH 4/4] fix bug --- .../WxCarHaiKangWeiShiCallBackController.java | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/car/haikangweishi/WxCarHaiKangWeiShiCallBackController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/haikangweishi/WxCarHaiKangWeiShiCallBackController.java index 93652bd62..d61e1f311 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/car/haikangweishi/WxCarHaiKangWeiShiCallBackController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/car/haikangweishi/WxCarHaiKangWeiShiCallBackController.java @@ -191,31 +191,37 @@ public class WxCarHaiKangWeiShiCallBackController extends WxParkCallBackBaseCont */ @PostMapping(value = "/notify") public Map notify(@RequestBody Map paramMap) { - log.info("["+getIpAddr()+"] hkwsCarCallback notify: " + paramMap.toString()); - - Map params = (Map)paramMap.get("params"); - String eventType = params.get("eventType").toString(); - Result result = null; - if ("771760131".equals(eventType)) { - //解析车易付参数 - result = super.parkInCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_IN, paramMap); - }else if ("771760134".equals(eventType)) { - result = super.parkOutCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_OUT, paramMap); - } - Map retMap = new HashMap(); - int errcode = 0; - String msg = "success"; - if (null != result) { - if (result.code != Result.SUCCESS) { - errcode = result.code; - msg = result.message; - } - }else { - errcode = Result.ERROR; - msg = "no result.eventType["+eventType+"]"; - } - retMap.put("errcode", errcode); - retMap.put("errmsg", msg); + Map retMap = new HashMap(); + try { + log.info("["+getIpAddr()+"] hkwsCarCallback notify: " + paramMap.toString()); + + Map params = (Map)paramMap.get("params"); + String eventType = params.get("eventType").toString(); + Result result = null; + if ("771760131".equals(eventType)) { + //解析车易付参数 + result = super.parkInCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_IN, paramMap); + }else if ("771760134".equals(eventType)) { + result = super.parkOutCallBack(EnumCarVendor.CAR_HAIKANGWEISHI, EnumCarCmd.CAR_HAIKANGWEISHI_CALLBACK_PARK_OUT, paramMap); + } + + int errcode = 0; + String msg = "success"; + if (null != result) { + if (result.code != Result.SUCCESS) { + errcode = result.code; + msg = result.message; + } + }else { + errcode = Result.ERROR; + msg = "no result.eventType["+eventType+"]"; + } + retMap.put("errcode", errcode); + retMap.put("errmsg", msg); + } catch(Exception e) { + retMap.put("errcode", Result.ERROR); + retMap.put("errmsg", "notify error."+e.getLocalizedMessage()); + } retMap.put("data", null); return retMap; }