瀏覽代碼

//pay bug

photo
xhxu 1 年之前
父節點
當前提交
2dd20aa403
共有 30 個文件被更改,包括 50 次插入6182 次删除
  1. +0
    -63
      suimangService/src/main/java/com/iformall/service/park/ParkAdapterService.java
  2. +0
    -38
      suimangService/src/main/java/com/iformall/service/park/ParkBatchCallBackAdapterService.java
  3. +0
    -37
      suimangService/src/main/java/com/iformall/service/park/ParkCallBackAdapterService.java
  4. +0
    -126
      suimangService/src/main/java/com/iformall/service/park/ParkFactory.java
  5. +0
    -35
      suimangService/src/main/java/com/iformall/service/park/entity/ParkNotifyParam.java
  6. +0
    -121
      suimangService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java
  7. +0
    -20
      suimangService/src/main/java/com/iformall/service/park/impl/BaseParkService.java
  8. +0
    -119
      suimangService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java
  9. +0
    -258
      suimangService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkUtil.java
  10. +0
    -88
      suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkCallbackService.java
  11. +0
    -203
      suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java
  12. +0
    -190
      suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFUtil.java
  13. +0
    -80
      suimangService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java
  14. +0
    -54
      suimangService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaUtil.java
  15. +0
    -987
      suimangService/src/main/java/com/iformall/service/park/impl/etcp/ETCPUtil.java
  16. +0
    -488
      suimangService/src/main/java/com/iformall/service/park/impl/etcp/EtcpHelper.java
  17. +0
    -235
      suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkCallbackService.java
  18. +0
    -250
      suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java
  19. +0
    -464
      suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java
  20. +0
    -15
      suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java
  21. +0
    -190
      suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkCallbackService.java
  22. +0
    -359
      suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java
  23. +0
    -378
      suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunUtil.java
  24. +0
    -98
      suimangService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java
  25. +0
    -186
      suimangService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnUtil.java
  26. +0
    -262
      suimangService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java
  27. +0
    -687
      suimangService/src/main/java/com/iformall/service/park/impl/tjd/TJDUtil.java
  28. +0
    -122
      suimangService/src/main/java/com/iformall/service/park/impl/util/ParkHelper.java
  29. +0
    -29
      suimangService/src/main/java/com/iformall/service/park/utils/ParkCacheUtils.java
  30. +50
    -0
      suimangService/src/main/java/com/iformall/utils/MaUtil.java

+ 0
- 63
suimangService/src/main/java/com/iformall/service/park/ParkAdapterService.java 查看文件

@@ -1,63 +0,0 @@
package com.iformall.service.park;

import java.util.Map;

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;

/**
* 新的用NewParkAdapterService
* @author alascor
*
*/
public interface ParkAdapterService {
ResultData parkInitConfig(WxPark park) throws Exception;
/**
* 停车场初始化登陆
* @param paramMap
* @param park
* @param member
* @return vendorPersonId 停车场的会员编号
*/
String initLogin(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception;

/**
* 绑定车牌
* @param paramMap
* @param park
* @param cuUserId
* @return vendorPersonId 停车场的会员编号
*/
String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception;
/**
* 解绑车牌
*/
void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception;
/**
* 获取停车费, 给老的集成用
*/
ResultData carStopFee(Map<String, String> paramMap, WxPark park) throws Exception;
/**
* 是否忽略使用券缓存,不忽略,则走系统,根据停车场出入场通知来控制。忽略,则不需要此判断来判定停车券是否已经使用
* @return
*/
boolean ignoreUseCouponCache();
/**
* 停车券使用, 给老的集成用
*/
ResultData useCoupon(Map<String, String> paramMap,WxPark park,WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) throws Exception;
/**
* 查询停车场状态, 给老的集成用
*/
ResultData getParkStatus(WxPark park) throws Exception;
}

+ 0
- 38
suimangService/src/main/java/com/iformall/service/park/ParkBatchCallBackAdapterService.java 查看文件

@@ -1,38 +0,0 @@
package com.iformall.service.park;

import java.util.List;
import java.util.Map;

import com.iformall.service.park.entity.ParkNotifyParam;

/**
* 停车场回调 -- 批量传回
* @author alascor
*
*/
public interface ParkBatchCallBackAdapterService {

/**
* 解析车辆入场通知参数
* @param param
*/
List<ParkNotifyParam> parseInNoticyParam(Object param);
/**
* 解析车辆出场通知参数
* @param param
*/
List<ParkNotifyParam> parseOutNoticyParam(Object param);
/**
* 解析车辆解绑通知参数
* @param param
*/
List<ParkNotifyParam> parseUnbindNoticyParam(Object param);
/**
* 解析支付结果通知参数
* @param param
*/
List<ParkNotifyParam> parsePaidNoticyParam(Object param);
}

+ 0
- 37
suimangService/src/main/java/com/iformall/service/park/ParkCallBackAdapterService.java 查看文件

@@ -1,37 +0,0 @@
package com.iformall.service.park;

import java.util.Map;

import com.iformall.service.park.entity.ParkNotifyParam;

/**
* 停车场回调
* @author alascor
*
*/
public interface ParkCallBackAdapterService {

/**
* 解析车辆入场通知参数
* @param param
*/
ParkNotifyParam parseInNoticyParam(Object param);
/**
* 解析车辆出场通知参数
* @param param
*/
ParkNotifyParam parseOutNoticyParam(Object param);
/**
* 解析车辆解绑通知参数
* @param param
*/
ParkNotifyParam parseUnbindNoticyParam(Object param);
/**
* 解析支付结果通知参数
* @param param
*/
ParkNotifyParam parsePaidNoticyParam(Object param);
}

+ 0
- 126
suimangService/src/main/java/com/iformall/service/park/ParkFactory.java 查看文件

@@ -1,126 +0,0 @@
package com.iformall.service.park;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iformall.common.ErrorCode;
import com.iformall.enums.EnumCarVendor;
import com.iformall.exception.MallinkException;
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.haikangweishi.HaiKangWeiShiParkCallbackService;
import com.iformall.service.park.impl.haikangweishi.HaiKangWeiShiParkService;
import com.iformall.service.park.impl.jieshun.JieShunParkCallbackService;
import com.iformall.service.park.impl.jieshun.JieShunParkService;
import com.iformall.service.park.impl.shangan.ShangAnParkService;
import com.iformall.service.park.impl.tjd.TJDParkService;

@Service
public class ParkFactory {
@Autowired
CYFParkService cyfService;
@Autowired
BoLinkParkService bolinkService;
@Autowired
DaHuaParkService daHuaService;
@Autowired
ShangAnParkService shangAnService;
@Autowired
TJDParkService tjdService;
@Autowired
JieShunParkService jieshunService;
@Autowired
HaiKangWeiShiParkService haikangWeishiService;
@Autowired
CYFParkCallbackService cyfCallbackService;
@Autowired
JieShunParkCallbackService jieshunCallBackService;
@Autowired
HaiKangWeiShiParkCallbackService haikangWeishiCallBackService;
private Map<Integer,ParkAdapterService> parkServiceMap ;
private Map<Integer,EnumCarVendor> enumMap ;
private Map<Integer,ParkCallBackAdapterService> callBackServiceMap;//推送单条
private Map<Integer,ParkBatchCallBackAdapterService> batchCallBackServiceMap;//推送多条
private Map<Integer,ParkAdapterService> getServiceMap() {
if (null != parkServiceMap ) {
return parkServiceMap;
}
parkServiceMap = new ConcurrentHashMap<Integer,ParkAdapterService>();
//车易付
parkServiceMap.put(EnumCarVendor.CAE_CYF.getCode(), cyfService);
parkServiceMap.put(EnumCarVendor.CAR_BOLINK.getCode(), bolinkService);
parkServiceMap.put(EnumCarVendor.CAR_DAHUA.getCode(), daHuaService);
parkServiceMap.put(EnumCarVendor.CAR_SHANGAN.getCode(), shangAnService);
parkServiceMap.put(EnumCarVendor.CAR_TJD.getCode(), tjdService);
parkServiceMap.put(EnumCarVendor.CAR_JIESHUN.getCode(), jieshunService);
parkServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI.getCode(), haikangWeishiService);
return parkServiceMap;
}
private Map<Integer,EnumCarVendor> getEnumMap() {
if (null != enumMap) {
return enumMap;
}
enumMap = new ConcurrentHashMap<Integer,EnumCarVendor>();
for (EnumCarVendor v : EnumCarVendor.values()) {
enumMap.put(v.getCode(), v);
}
return enumMap;
}
private Map<Integer,ParkCallBackAdapterService> getCallBackServiceMap() {
if (null != callBackServiceMap) {
return callBackServiceMap;
}
callBackServiceMap = new ConcurrentHashMap<Integer, ParkCallBackAdapterService>();
callBackServiceMap.put(EnumCarVendor.CAE_CYF.getCode(), cyfCallbackService);
return callBackServiceMap;
}
private Map<Integer,ParkBatchCallBackAdapterService> getBatchCallBackServiceMap() {
if (null != batchCallBackServiceMap) {
return batchCallBackServiceMap;
}
batchCallBackServiceMap = new ConcurrentHashMap<Integer, ParkBatchCallBackAdapterService>();
batchCallBackServiceMap.put(EnumCarVendor.CAR_JIESHUN.getCode(), jieshunCallBackService);
batchCallBackServiceMap.put(EnumCarVendor.CAR_HAIKANGWEISHI.getCode(), haikangWeishiCallBackService);
return batchCallBackServiceMap;
}
public ParkAdapterService getParkService(Integer code) {
EnumCarVendor vendor = getEnumMap().get(code);
if (null == vendor) {
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "车厂["+code+"]不持支。");
}
return getServiceMap().get(vendor.getCode());
}
public ParkCallBackAdapterService getParkCallbackService(Integer code) {
EnumCarVendor vendor = getEnumMap().get(code);
if (null == vendor) {
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "车厂["+code+"]不支持.");
}
return getCallBackServiceMap().get(vendor.getCode());
}
public ParkBatchCallBackAdapterService getParkBatchCallbackService(Integer code) {
EnumCarVendor vendor = getEnumMap().get(code);
if (null == vendor) {
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "车厂["+code+"]不支持.");
}
return getBatchCallBackServiceMap().get(vendor.getCode());
}

}

+ 0
- 35
suimangService/src/main/java/com/iformall/service/park/entity/ParkNotifyParam.java 查看文件

@@ -1,35 +0,0 @@
package com.iformall.service.park.entity;

import java.io.Serializable;
import java.util.Date;

import lombok.Data;

@Data
public class ParkNotifyParam implements Serializable{

private static final long serialVersionUID = -8295607395328571534L;

String parkId;
String synId;
String parkName;
String carNumber;
Date entranceTime;
Date outTime;
String fee;
String parkOrderId;
Date payTime;
String paidServiceFee;//支付服务费
Object sourceParam;
}

+ 0
- 121
suimangService/src/main/java/com/iformall/service/park/entity/ParkStopFee.java 查看文件

@@ -1,121 +0,0 @@
package com.iformall.service.park.entity;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

public class ParkStopFee implements Serializable{

private static final long serialVersionUID = 6478840764729191197L;

/*停车场返回的订单ID**/
private String orderId="";
/*入场时间 格式:yyyy-MM-dd HH:mm:ss**/
private String entranceTime="";
/*计费结束时间 格式:yyyy-MM-dd HH:mm:ss**/
private String exitTime="";
/*停车费**/
private String remainingFee="";
/*跳转的停车费支付小程序appId**/
private String appId="";
/*支付小程序页面路径**/
private String payPath="";
/*给支付小程序的额外数据**/
private Map extraData=new HashMap();
/*备注**/
private String remark="";
private String sysNotice="";//系统提示,非车厂提示;
public ParkStopFee(String orderId,Date startTime,Date endTime,String fee,String appId,String payPath,Map extraData,String remark,String sysNotice) {
if (!StringUtils.isBlank(orderId)) {
this.orderId = orderId;
}
if (null != startTime) {
this.entranceTime = getLocalDate(startTime);
}
if (null != endTime) {
this.exitTime = getLocalDate(endTime);
}
if (!StringUtils.isBlank(fee)) {
this.remainingFee = fee;
}
if (!StringUtils.isBlank(appId)) {
this.appId = appId;
}
if (!StringUtils.isBlank(payPath)) {
this.payPath = payPath;
}
if (null != extraData) {
this.extraData = extraData;
}
if (!StringUtils.isBlank(remark)) {
this.remark = remark;
}
if (!StringUtils.isBlank(sysNotice)) {
this.sysNotice = sysNotice;
}
}
private String getLocalDate(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getEntranceTime() {
return entranceTime;
}
public void setEntranceTime(String entranceTime) {
this.entranceTime = entranceTime;
}
public String getExitTime() {
return exitTime;
}
public void setExitTime(String exitTime) {
this.exitTime = exitTime;
}
public String getRemainingFee() {
return remainingFee;
}
public void setRemainingFee(String remainingFee) {
this.remainingFee = remainingFee;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getPayPath() {
return payPath;
}
public void setPayPath(String payPath) {
this.payPath = payPath;
}
public Map getExtraData() {
return extraData;
}
public void setExtraData(Map extraData) {
this.extraData = extraData;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getSysNotice() {
return sysNotice;
}
}

+ 0
- 20
suimangService/src/main/java/com/iformall/service/park/impl/BaseParkService.java 查看文件

@@ -1,20 +0,0 @@
package com.iformall.service.park.impl;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxPark;
import com.iformall.service.park.impl.util.ParkHelper;

@Service
public class BaseParkService {

@Autowired
ParkHelper parkHelper;
}

+ 0
- 119
suimangService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkParkService.java 查看文件

@@ -1,119 +0,0 @@
package com.iformall.service.park.impl.bolink;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import com.alibaba.fastjson.JSON;
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.enums.EnumCouponUnit;
import com.iformall.service.park.ParkAdapterService;
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<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return member.getId().toString();
}

@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
}

@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) {
return bolinkCarStopFee(paramMap, park);
}
private ResultData bolinkCarStopFee(Map<String, String> paramMap, WxPark park) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString(BoLinkUtil.BOLINK_URL);
String comid = objParams.getString(BoLinkUtil.BOLINK_COMID);
String unionId = objParams.getString(BoLinkUtil.BOLINK_UNION_ID);
String key = objParams.getString(BoLinkUtil.BOLINK_KEY);
String ret = BoLinkUtil.getStopFee(url, comid, unionId, key, carNumber);
if (ret != null) {
JSONObject retObj = JSON.parseObject(ret);
JSONObject dataObj = retObj.getJSONObject(BoLinkUtil.BOLINK_DATA);
if (dataObj.getIntValue(BoLinkUtil.BOLINK_STATE) == BoLinkUtil.BOLINK_SUCCESS) {
return new ResultData(dataObj);
} else {
return new ResultData(ErrorCode.BOLINK_STOP_FEE_FAIL);
}
} else {
return new ResultData(ErrorCode.BOLINK_STOP_FEE_FAIL);
}
}

@Override
public ResultData useCoupon(Map<String, String> paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) {
String orderId = paramMap.get("orderId");
if (StringUtils.isBlank(orderId)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString(BoLinkUtil.BOLINK_URL);
String comid = objParams.getString(BoLinkUtil.BOLINK_COMID);
String unionId = objParams.getString(BoLinkUtil.BOLINK_UNION_ID);
String key = objParams.getString(BoLinkUtil.BOLINK_KEY);

String amount = "";
if (coupon.getUnit().equals(EnumCouponUnit.MONEY.getCode())) {
amount = coupon.getPriceStr();
} else {
amount = String.valueOf(coupon.getPrice()* 60);
}

String ret = BoLinkUtil.couponSend(url, comid, unionId, key,
carNumber,
orderId,
coupon.getUnit().toString(), amount);
JSONObject retObj = JSON.parseObject(ret);
JSONObject dataObj = retObj.getJSONObject(BoLinkUtil.BOLINK_DATA);
if (dataObj.getIntValue(BoLinkUtil.BOLINK_STATE) == BoLinkUtil.BOLINK_SUCCESS) {
return new ResultData(dataObj);
} else {
return new ResultData(ErrorCode.CAR_DEDUCE_FEE_FAIL);
}
}

@Override
public ResultData getParkStatus(WxPark park) {
return null;
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}



}

+ 0
- 258
suimangService/src/main/java/com/iformall/service/park/impl/bolink/BoLinkUtil.java 查看文件

@@ -1,258 +0,0 @@
package com.iformall.service.park.impl.bolink;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.enums.EnumCouponUnit;
import com.iformall.exception.MallinkException;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
* 尚安停车
*/
public class BoLinkUtil {
private final static Logger logger = LoggerFactory.getLogger(BoLinkUtil.class);

public static final String BOLINK_URL = "url";
public static final String BOLINK_COMID = "comid";
public static final String BOLINK_UNION_ID = "union_id";
public static final String BOLINK_KEY = "key";
public static final String BOLINK_CAR_NUMBER = "car_number";
public static final String BOLINK_ORDER_ID = "order_id";
public static final String BOLINK_PAY_TIME = "pay_time";
public static final String BOLINK_ACT_TOTAL = "act_total";
public static final String BOLINK_DEDUCTION_TIME = "deduction_time";
public static final String BOLINK_DEDUCTION_MONEY = "deduction_money";

public static final String URL = "https://yun.bolink.club";
public static final String COMID = "30536";
public static final String UNION_ID = "200389";
public static final String KEY = "Y29PZH9KDT1V7Y1E";
public static final String PARK_NUM = "京88888";

public static final String BOLINK_DATA = "data";
public static final String BOLINK_STATE = "state";
public static final int BOLINK_SUCCESS = 1;
public static final int BOLINK_FAIL = 0;
public static final String BOLINK_ERROR = "errmsg";


public static void main(String[] args) throws Exception {
String carNumber = "京88888";

String result = getStopFee(URL, COMID, UNION_ID, KEY, carNumber);


}

/**
* md5算法
* @param data
* @return
* @throws NoSuchAlgorithmException
*/

public static String md5(String data) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(data.getBytes());
StringBuilder buf = new StringBuilder();
byte[] bits = md.digest();
for(int i=0;i<bits.length;i++){
int a = bits[i];
if(a<0) a+=256;
if(a<16) buf.append("0");
buf.append(Integer.toHexString(a));
}
return buf.toString();
}

/**
* 签名
* @param key
* @param dataStr
* @return
* @throws NoSuchAlgorithmException
*/
public static String getSign(String key, String dataStr) throws NoSuchAlgorithmException {
StringBuilder sb = new StringBuilder();
sb.append(dataStr).append(BOLINK_KEY).append("=").append(key);
logger.debug(sb.toString());
String signValue = md5(sb.toString()).toUpperCase();
logger.debug("sign: " + signValue);
return signValue;
}

public static boolean checkRespFailed(String resp) {
if(resp.startsWith("<html>") || resp.startsWith("<!DOCTYPE html>")) {
return true;
}
return false;
}

public static String getStopFee(String baseUrl, String comid, String unionId, String key, String carNumber) {
String stopFeeUrl = "/zld/queryorderprice";
String url = baseUrl + stopFeeUrl;
Map<String, Object> params = new HashMap<>();
params.put(BOLINK_COMID, comid);
params.put(BOLINK_UNION_ID, unionId);
params.put(BOLINK_CAR_NUMBER, carNumber);
try {
String sign = getSign(key, JSON.toJSONString(params));
} catch (Exception e) {
logger.error(e.getMessage());
}

try {
String result = Proc(url, key, params);
if(result == null) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
if(checkRespFailed(result)) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
return result;
} catch (Exception e) {
return null;
}
}

public static String couponSend(String baseUrl, String comid, String unionId, String key,
String carNumber,
String orderId,
String unit, String amount) {
String couponUrl = "/zld/openservice/paynoticetopark";
String url = baseUrl + couponUrl;
Map<String, Object> params = new HashMap<>();
params.put(BOLINK_COMID, comid);
params.put(BOLINK_UNION_ID, unionId);
params.put(BOLINK_CAR_NUMBER, carNumber);
params.put(BOLINK_ORDER_ID, orderId);
params.put(BOLINK_PAY_TIME, new Date().getTime());
params.put(BOLINK_ACT_TOTAL, "0");
if (unit.equals(EnumCouponUnit.MONEY.getCode())) {
// 金额
params.put(BOLINK_DEDUCTION_MONEY, amount);
} else {
// 小时
params.put(BOLINK_DEDUCTION_TIME, amount);
}
try {
String sign = getSign(key, JSON.toJSONString(params));
} catch (Exception e) {
logger.error(e.getMessage());
}

try {
String result = Proc(url, key, params);
if(result == null) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
if(checkRespFailed(result)) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
return result;
} catch (Exception e) {
return null;
}
}

private static String Proc(String url, String key, Map<String, Object> paramMap) {
CloseableHttpClient httpClient = HttpClients.createDefault();

HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Accept-Encoding", "UTF-8");

StringBuilder sb = new StringBuilder();
String sign = null;
try{
String dataStr = JSON.toJSONString(paramMap);
sb.append("{\"data\":").append(dataStr);
sign = getSign(key, dataStr);
sb.append(",\"sign\":\"").append(sign).append("\"}");
}catch(NoSuchAlgorithmException e) {
logger.error(e.getLocalizedMessage());
}

String bodyStr = sb.toString();
logger.info(bodyStr);

final Base64.Encoder encoder = Base64.getEncoder();
final Base64.Decoder decoder = Base64.getDecoder();

try {
byte[] bodyByte = bodyStr.getBytes("UTF-8");
String encodeStr = encoder.encodeToString(bodyByte);
StringEntity se = new StringEntity(encodeStr, Consts.UTF_8);
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
httpPost.setEntity(se);
} catch (Exception e) {
logger.error(e.getMessage());
}

HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

String result = null;

//打印StatusLine
logger.debug("StatusLine: " + response.getStatusLine());
if (response.getStatusLine().getStatusCode() != 200) {
logger.error("status error: " + response.getStatusLine().getReasonPhrase());
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
try{
//获取实体
HttpEntity httpEntity= response.getEntity();
String encodeResStr = EntityUtils.toString(httpEntity, "UTF-8");
result = new String(decoder.decode(encodeResStr), "UTF-8");
logger.debug(result);
// {"data":{"errmsg":"查询价格返回超时,请联系车场管理员","state":0,"plate_number":"京88888"},"sign":"DE81DCA41E6C1ACA978906F998A7BC1D"}

} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

try { //关闭流并释放资源
httpClient.close();
} catch (IOException e) {
logger.error(e.getLocalizedMessage());
}

JSONObject resultObj = JSON.parseObject(result);
String resSign = resultObj.getString("sign");
if (!resSign.equals(sign)) {
logger.error("data sign: " + resSign);
throw new MallinkException(ErrorCode.BOLINK_SIGN_ERR);
}

return result;
}




}


+ 0
- 88
suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkCallbackService.java 查看文件

@@ -1,88 +0,0 @@
package com.iformall.service.park.impl.cyf;

import java.text.ParseException;
import java.util.Date;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.iformall.domain.vo.WxCarCYFVo;
import com.iformall.service.park.ParkCallBackAdapterService;
import com.iformall.service.park.entity.ParkNotifyParam;
import com.iformall.service.park.impl.BaseParkService;
import com.iformall.service.park.impl.tjd.TJDUtil;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class CYFParkCallbackService extends BaseParkService implements ParkCallBackAdapterService {

@Override
public ParkNotifyParam parseInNoticyParam(Object param) {
Map<String, Object> paramMap = (Map<String, Object>) param;
String carNumber = paramMap.get(CYFUtil.CYF_CAR_NUMBER).toString();
String cyfParkId = paramMap.get(CYFUtil.CYF_PARK_ID).toString();
String parkName = paramMap.get(CYFUtil.CYF_PARK_NAME).toString();
String synId = paramMap.get(CYFUtil.CYF_SYN_ID).toString();
String entranceTime = paramMap.get(CYFUtil.CYF_ENTRANCE_TIME).toString();
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(carNumber);
p.setParkId(cyfParkId);
p.setParkName(parkName);
p.setSynId(synId);
try {
p.setEntranceTime(CYFUtil.utcToLocal(entranceTime));
} catch (ParseException e) {
log.error("cyf entranceTime format error",e);
return null;
}
return p;
}

@Override
public ParkNotifyParam parseOutNoticyParam(Object param) {
WxCarCYFVo vo = (WxCarCYFVo) param;
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(vo.getPlate());
p.setParkId(String.valueOf(vo.getParkingId()));
p.setParkName(vo.getRecordOrderId());
p.setSynId(vo.getRecordOrderId());
try {
p.setEntranceTime(TJDUtil.dateOutFormat.parse(vo.getInInfo().getTime()));
} catch (ParseException e) {
log.error("cyf entranceTime format error",e);
return null;
}
try {
p.setOutTime(TJDUtil.dateOutFormat.parse(vo.getOutInfo().getTime()));
} catch (ParseException e) {
log.error("cyf outTime format error",e);
return null;
}
p.setFee(String.valueOf(vo.getPayInfoList().getActualFee()));
return p;
}

@Override
public ParkNotifyParam parseUnbindNoticyParam(Object param) {
return null;
}

@Override
public ParkNotifyParam parsePaidNoticyParam(Object param) {
Map vo = (Map) param;
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber((String) vo.get("plate"));
p.setParkId(String.valueOf(vo.get("parkId")));
p.setParkOrderId((String) vo.get("orderNo"));
p.setSynId((String) vo.get("orderNo"));
p.setFee(vo.get("fee").toString());
p.setPayTime((Date) vo.get("payTime"));
return p;
}



}

+ 0
- 203
suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFParkService.java 查看文件

@@ -1,203 +0,0 @@
package com.iformall.service.park.impl.cyf;

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.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import com.alibaba.fastjson.JSON;
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.WxCUserCar;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxPark;
import com.iformall.domain.vo.WxCouponOrderCarCVo;
import com.iformall.enums.EnumCarVendor;
import com.iformall.enums.EnumCouponUnit;
import com.iformall.exception.MallinkException;
import com.iformall.service.park.ParkAdapterService;
import com.iformall.service.park.entity.ParkStopFee;
import com.iformall.service.park.impl.BaseParkService;
import com.iformall.service.park.impl.util.ParkHelper;

@Service
public class CYFParkService extends BaseParkService implements ParkAdapterService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
ParkHelper parkHelper;
CYFUtil cyf = new CYFUtil();
@Override
public ResultData parkInitConfig(WxPark park) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String initLogin(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
WxCUserCar car = parkHelper.getOne(park, member.getId(), carNumber, EnumCarVendor.CAE_CYF);
if (null != car) {
return car.getVendorPersonId();
}
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
return cyfBindCar(paramMap,park,member);
}
/**
* @description 车易付会员车辆信息注册
* @Params [paramMap, park, wxCUser]
* @return com.iformall.common.ResultData
* @Author furunxin
* @Date 2020/7/8 下午10:23
**/
private String cyfBindCar(Map<String, String> paramMap, WxPark park,WxCUserBasicInfo member) throws Exception {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String token = objParams.getString("token");
int feeGroupId = objParams.getIntValue("feeGroupId");
String ret = cyf.registerCar(token,park.getNumber(),feeGroupId,park.getParkingId(),carNumber,null,member.getNickName());
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("result") == 1){
return retObj.get("localPersonId").toString();
}else {
logger.error("cyfBindCar error. paramMap: {} . cyfResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("strError");
throw new MallinkException(ErrorCode.CAR_BIND_FAIL.getCode(), "绑车牌失败:"+msg);
//return new ResultData(, "绑车牌失败", retObj);
}
}


@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String vendorPersonId = paramMap.get("vendorPersonId");
if (StringUtils.isBlank(vendorPersonId)) {
logger.error("vendorPersonId为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "vendorPersonId为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String token = objParams.getString("token");
String ret = cyf.unbindCar(token, park.getParkingId(), vendorPersonId);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("result") == 1){
}else {
logger.error("cyfUnbindCar error. paramMap: {} . cyfResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("strError");
throw new MallinkException(ErrorCode.CAR_BIND_FAIL.getCode(), "解绑车牌失败:"+msg);
//return new ResultData(, "绑车牌失败", retObj);
}
}


@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
return cyfCarStopFee(paramMap, park);
}
private ResultData cyfCarStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String token = objParams.getString("token");
String ret = cyf.getCarStopFee(token,park.getParkingId(),carNumber);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("result") == 1){
Integer createTime = retObj.getInteger("inTime");//计费时间
Integer endTime = retObj.getInteger("endTime");//离场时间
String msg = retObj.getString("warmPrompt");
String appId = "";
String payPath = "http://wechat.cheyifu2016.com/fm-pay/#/transit?encodeURIComponent('orderNo=123&couponFee=2&actualFee=20')";
return new ResultData(new ParkStopFee(retObj.getString("orderId"), cyf.utcToLocal(String.valueOf(createTime)),
cyf.utcToLocal(String.valueOf(endTime)), String.valueOf(retObj.getDouble("fee")),appId,payPath,null,msg,null));
}else {
logger.error("cyfCarStopFee error. paramMap: {} . cyfResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("strError");
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "停车费获取失败:"+msg);
}
}

/**
* 优惠券支付流程:(1):调取openapi/getFee路径获取当前停车费,入参:plate,parkingId,token
(2):调用地址:http://wechat.cheyifu2016.com/fm-pay/#/transit?encodeURIComponent('orderNo=123&couponFee=2&actualFee=20')
注: 详细参考接口文档参数
* @param token
* @param orderNo
* @param couponFee
* @param actualFee
* @return
*/
@Override
public ResultData useCoupon(Map<String, String> paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) throws Exception{
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String token = objParams.getString("token");
//先获取停车费,然后再提交停车费
String ret = cyf.getCarStopFee(token,park.getParkingId(),carNumber);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("result") == 1){
String orderId = retObj.getString("orderId");
if (StringUtils.isBlank(orderId)) {
logger.error("cyfCarStopFee error. paramMap: {} . cyfResult: {}",JSON.toJSONString(paramMap),ret);
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "车易付停车费查询未返回订单编号:"+orderId);
}
if (!coupon.getUnit().equals(EnumCouponUnit.MONEY.getCode())) {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "车易付只能支持金额券,不能使用小时券:"+orderId);
}
int fee = retObj.getInteger("fee");
int amount = Integer.parseInt(coupon.getPriceStr());
Map retmap = new HashMap();
retmap.put("orderNo", orderId);
retmap.put("couponFee", amount);
retmap.put("actualFee", fee-amount);
return new ResultData();
}else {
logger.error("cyfCarStopFee error. paramMap: {} . cyfResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("strError");
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "停车费获取失败:"+msg);
}
}

@Override
public ResultData getParkStatus(WxPark park) throws Exception{
return new ResultData();
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}

}

+ 0
- 190
suimangService/src/main/java/com/iformall/service/park/impl/cyf/CYFUtil.java 查看文件

@@ -1,190 +0,0 @@
package com.iformall.service.park.impl.cyf;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;


/**
* @author: furunxin
* @Date: 2020/7/1 17:16
* @Description: 车易付接口对接参数类
*/

@Slf4j
public class CYFUtil {

public static final String CYF_PARK_ID = "parkingId";
public static final String CYF_CAR_NUMBER = "plate";
public static final String CYF_PARK_NAME = "parking";
public static final String CYF_SYN_ID = "recordOrderId";
public static final String CYF_ENTRANCE_TIME = "inTime";

public static final String CYF_IS_RESULT = "result";
public static final String CYF_ERR_MSG = "strError";
public static final int CYF_SUC = 1;
public static final int CYF_ERR = 0;


//会员车辆信息注册接口地址
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";


/**
* @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);
String d = sdf.format(new Date(Long.valueOf(seconds+"000")));
Date date=sdf.parse(d);
return date;
}

public static String getLocalDate(){
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowDate = ldt.format(dtf);
return nowDate;
}



/**
* @description 会员车辆信息注册
* @Params [token, carport, feeGroupId, parkingId, plates, personId, personName]
* @return java.lang.String
* @Author furunxin
* @Date 2020/7/8 下午10:12
**/
public String registerCar(String token,int carport,int feeGroupId,String parkingId,String plates,Long personId,String personName){
String[] plate = new String[1];
plate[0] = plates;
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("token",token);
paramMap.put("parkingId",Integer.valueOf(parkingId));
paramMap.put("beginTime",getLocalDate());
paramMap.put("endTime",getLocalDate());
paramMap.put("feeGroupId",feeGroupId);
paramMap.put("lotNumber",carport);
//paramMap.put("personId",personId);
paramMap.put("personName",personName);
paramMap.put("plates",plate);
String result = Proc(REGISTER_CAR_URL, paramMap);
return result;
}

/**
* @description 根据车牌号获取停车费
* @Params [token, parkingId, plates]
* @return java.lang.String
* @Author furunxin
* @Date 2020/7/12 下午3:51
**/
public String getCarStopFee(String token,String parkingId,String plates){
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("token",token);
paramMap.put("parkingId",Integer.valueOf(parkingId));
paramMap.put("plate",plates);
paramMap.put("carOutTime",0);
String result = Proc(GET_CAR_STOPFEE, paramMap);
return result;
}
/**
* @description 解绑车辆
* @param token
* @param parkingId
* @param personId
* @return
*/
public String unbindCar(String token,String parkingId,String vendorPersonId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("token",token);
paramMap.put("parkingId",Integer.valueOf(parkingId));
paramMap.put("personId",Integer.valueOf(vendorPersonId));
String result = Proc(UNBIND_CAR, paramMap);
return result;
}

private static String Proc(String url, Map<String, Object> paramMap) {
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");

String jsonstr = JSON.toJSONString(paramMap);
log.info("请求报文:"+jsonstr);

try {
StringEntity se = new StringEntity(jsonstr, Consts.UTF_8);
se.setContentType("application/json");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
httpPost.setEntity(se);
} catch (Exception e) {
log.error(e.getMessage());
}

HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (Exception e) {
log.error(e.getLocalizedMessage());
}

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());
}

try { //关闭流并释放资源
httpClient.close();
} catch (IOException e) {
log.error(e.getLocalizedMessage());
}
return result;
}
}

+ 0
- 80
suimangService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaParkService.java 查看文件

@@ -1,80 +0,0 @@
package com.iformall.service.park.impl.dahua;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

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.service.park.ParkAdapterService;
import com.iformall.service.park.impl.BaseParkService;

@Service
public class DaHuaParkService extends BaseParkService implements ParkAdapterService {

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<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return member.getId().toString();
}

@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
}

@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) {
return dahuaCarStopFee(paramMap, park);
}
private ResultData dahuaCarStopFee(Map<String, String> paramMap, WxPark park) {
String carNumber = paramMap.get("carNumber");
String result = DaHuaUtil.plateCharge(carNumber, park.getParkId());
logger.info("大华查询车辆费用接口返回值:{}", result);
JSONObject jsonObject = JSONObject.parseObject(result);
String code = jsonObject.getString("code");
if (!code.equals(DaHuaUtil.SUCCESS_CODE)) {
return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "停车费获取失败");
}
Object data = jsonObject.get("data");
return new ResultData(data);
}

@Override
public ResultData useCoupon(Map<String, String> paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) {
return new ResultData();
}


@Override
public ResultData getParkStatus(WxPark park) {
return new ResultData();
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}

}

+ 0
- 54
suimangService/src/main/java/com/iformall/service/park/impl/dahua/DaHuaUtil.java 查看文件

@@ -1,54 +0,0 @@
package com.iformall.service.park.impl.dahua;

import com.alibaba.fastjson.JSONObject;
import com.iformall.utils.AesUtils;
import com.iformall.utils.HttpUtil;

import java.util.HashMap;
import java.util.Map;

/**
* 大华 停车管理
*/
public class DaHuaUtil {

public static final String KEY = "8G5M4Ff9hel6fUA7";

public static final String IV = "g8v90drvOmIx1PuR";

public static final String URL = "http://47.106.104.196:8025/external/common";

public static final String SUCCESS_CODE = "0000";

public static String parkInfo(String appId) {
Map<String, Object> requestParams = new HashMap<>();
requestParams.put("method", "parkInfo");
return request(requestParams, appId);
}

public static String plateCharge(String carNum, String appId) {
Map<String, Object> requestParams = new HashMap<>();
Map<String, Object> data = new HashMap<>();
data.put("carNum", carNum);
requestParams.put("data", data);
requestParams.put("method", "plateCharge");
return request(requestParams, appId);
}

public static String request(Map<String, Object> requestParams, String appId) {
String cipher = AesUtils.encryptCtrMode(JSONObject.toJSONString(requestParams), KEY, IV);
Map<String, Object> params = new HashMap<>();
params.put("appId", appId);
params.put("cipher", cipher);
params.put("timestamp", System.currentTimeMillis());
try {
//return HttpUtil.doPost(URL, JSONObject.toJSONString(params));
return null;
} catch (Exception e) {
return null;
}
}


}


+ 0
- 987
suimangService/src/main/java/com/iformall/service/park/impl/etcp/ETCPUtil.java 查看文件

@@ -1,987 +0,0 @@
package com.iformall.service.park.impl.etcp;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.exception.MallinkException;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
* @Title: OpenapiCaller
* @Package: cn.etcp.openplatform.service
* @Description: ETCP开放平台接口调用示例
* @author: zhiyong.fan
* @date: 2018/3/8 17:41
* @version: V1.0
*/
public class ETCPUtil {

public static final String ETCP_PARK_ID = "parkId";
public static final String ETCP_CAR_NUMBER = "plateNumber";
public static final String ETCP_SYN_ID = "synId";
public static final String ETCP_PARK_NAME = "parkName";
public static final String ETCP_USER_TYPE = "userType";
public static final String ETCP_ENTRANCE_TIME = "entranceTime";
public static final String ETCP_FIX_PARKING_ID = "fixParkingId";
public static final String ETCP_REMAINING_DAYS = "remainingDays";
public static final String ETCP_EXIT_TIME = "exitTime";
public static final String ETCP_STAYED_TIME = "stayedTime";
public static final String ETCP_ORDER_ID = "orderId";
public static final String ETCP_PAID_SERVICE_FEE = "paidServiceFee";
public static final String ETCP_TIME = "time";
public static final String ETCP_FEE = "fee";

private static final Logger logger = LoggerFactory.getLogger(ETCPUtil.class);

/**
* 域名地址
*/
// private static final String domain = "http://mapi.test.etcp.cn";
private static final String domain = "http://mapi.etcp.cn";

//
private static final String appId = "FMLK";

private static final int payType = 5;

/**
* 商户号 测试时请换成ETCP开放平台为商户平台分配的商户号
*/
// private static final String merchantNo = "C7AEAF80BA8C44ADB42F3DB3CBC7D18A";
private static final String merchantNo = "24E6DD2767F44F75A4AD916ECBFE4FA1";

/**
* 商户密钥 测试时请换成ETCP开放平台为商户平台分配的商户密钥
*/
// private static final String merchantKey = "C292FFC7DCFB46AFB02792CD43F6DCC7";
private static final String merchantKey = "B6751C6B37254C4390031F098738B5D9";


/**
* 接口服务版本号
*/
private static final String version = "1.0.0";

/**
* 6.1. 联合登录
*/
private static final String userSigninUrl = "/merchant/open/{version}/openapi/usersigin";

/**
* 7.1. 车牌绑定
*/
private static final String bindCarUrl = "/merchant/open/{version}/openapi/bindcar";

/**
* 7.2. 车牌解绑
*/
private static final String unbindCarUrl = "/merchant/open/{version}/openapi/unbindcar";

/**
* 7.3. 车牌认证
*/
private static final String carAuthUrl = "/merchant/open/{version}/openapi/carauth";

/**
* 7.4. 车牌找回
*/
private static final String carRetrieveUrl = "/merchant/open/{version}/openapi/carretrieve";

/**
* 7.5. 已绑车辆信息查询
*/
private static final String carNumUrl = "/merchant/open/{version}/openapi/carnum";

/**
* 8.1. 停车费查询
*/
private static final String orderUnpayUrl = "/merchant/open/{version}/openapi/orderunpay";

/**
* 8.2. 优惠券查询
*/
private static final String couponListUrl = "/merchant/open/{version}/openapi/couponlist";

/**
* 8.3. 历史停车查询
*/
private static final String orderHistoryUrl = "/merchant/open/{version}/openapi/orderhistory";

/**
* 9.1. 主动支付(ETCP 收款)
*/
private static final String orderpayUrl = "/merchant/open/{version}/openapi/orderpay";

/**
* 9.2. 主动支付(商户平台收款)
*/
private static final String orderPaidUrl = "/merchant/open/{version}/openapi/orderpaid";

/**
* 10.1. 签约地址获取
*/
private static final String signUrl = "/merchant/open/{version}/withhold/sign";

/**
* 10.2. 签约状态查询
*/
private static final String statusUrl = "/merchant/open/{version}/withhold/status";

/**
* 11.1. 车场信息查询
*/
private static final String parkingInfoUrl = "/merchant/open/{version}/openapi/surroundingparking";

/**
* 11.2. 车场状态查询
*/
private static final String parkingStatusUrl = "/merchant/open/{version}/openapi/parkingstatus";

/**
* 12.1. 坏账查询
*/
private static final String getDebtUrl = "/merchant/open/{version}/openapi/getdebt";

/**
* 12.2. 坏账清缴
*/
private static final String repayDebtUrl = "/merchant/open/{version}/openapi/repaydebt";

/**
* 13.1. 商家优免券模板查询
*/
private static final String bCouponListUrl = "/merchant/open/{version}/openapi/b/coupon/list";

/**
* 13.2. 商家优免券发放
*/
private static final String bCouponRecordUrl = "/merchant/open/{version}/openapi/b/coupon/record";

/**
* 14.1. 车辆进出场模拟接口
*/
private static final String bCarSimulationUrl = "/merchant/open/{version}/openapi/car/simulation";

private final OkHttpClient client = new OkHttpClient();

private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

/** 错误码
* 0 成功
* 1 失败
* 2 服务器异常
* 3 时间戳超时
* 4 签名校验非法
* 5 没有找到商户密钥
* 6 参数错误
* 7 更新订单失败
* 8 生产订单失败
* 20100 操作失败
* 20101 无效 token
* 20102 缺少必要参数
* 20106 参数错误
* 20201 手机号错误
* 20202 获取验证码失败
* 20203 手机验证码错误
* 20206 支付金额与应付金额不匹配
* 20207 60s 内只能发送一次验证码
* 20208 APP 未有该权限
* 20209 优惠金额与应付金额不匹配
* 20301 签约失败
* 20302 签约成功
* 20401 无效车架号
* 20407 车辆信息不匹配
* 20408 操作失败,请稍后重试
* 20501 操作失败,请稍后重试
* 20602 returnUrl 为空
* 20603 未查询到费用
* 20604 请先清偿坏账
* 20605 synId 错误
* 20606 待支付费用为 0,无需支付
* 20607 支付链接失效
* 20608 查费失败
* 20701 appId 错误
* 20801 未绑定该车辆
* 20802 该车辆已被他人绑定
* 20803 绑定数量超限
* 20804 30 天内最多绑定 4 辆不同的车
* 20805 在场车辆不可解绑
* 20901 车辆不在场
* 20902 车场不支持电子支付
* 20903 没有车场查费权限
* 20904 用户未绑定该查费车牌
* 20905 查询费用异常
* 20906 用户不存在
* 20907 商户未配置查费车场
* 20908 长租车,费用为 0
* 20909 车牌错误
* 21001 查询失败
* 21002 请稍后再试
* 21003 未查询到坏账
* 21004 错误支付类型
* 21101 签约号已存在
*/

public static void main(String[] args) {
ETCPUtil caller = new ETCPUtil();
String ret = "";
JSONObject objret = null;
String etcpToken = "899e94d7-a3a5-46d4-87a3-288b18d0b189";
String carNumber = "京D12345";
String parkId = "Wj7YdvqyiYM=";
String businessId = "IgWGUtpAX68=";
String couponFreeId = "5627";

//caller.carSimulation(domain, appId, merchantNo, merchantKey, version, carNumber);
/* {"code":0,"message":"ok","data":{"isInPark":0}} */

//caller.getBCouponList(domain, merchantNo, merchantKey, version, parkId, businessId);
// {"code":0,"message":"查询成功","data":{"count":1,"couponPlatformModels":[{"id":5627,"parkId":"Wj7YdvqyiYM=","businessId":"IgWGUtpAX68=","businessName":"fmtest5678","name":"优免现金1元","category":"2","categoryValue":"1.00","amount":100,"status":"1","effectiveStart":"2018-08-20","effectiveEnd":"2018-08-25","couponType":"0","avaliavleNum":100}]}}
//caller.bCouponRecord(domain, merchantNo, merchantKey, version, etcpToken, parkId, businessId, carNumber, couponFreeId);
// 联合登录测试

//etcp 登陆
ret = caller.userSignin(domain, appId, merchantNo, merchantKey, version, "13597837191");
System.out.println(ret);

objret = JSON.parseObject(ret);
if (objret.getIntValue("code") != 0)
return;

etcpToken = objret.getJSONObject("data").getString("token");
System.out.println(etcpToken);

// 绑定的车牌查询
ret = caller.carNum(domain, merchantNo, merchantKey, version, etcpToken);
System.out.println(ret);
// objret = JSON.parseObject(ret);
// if (objret.getIntValue("code") != 0)
// return;
// JSONObject data = objret.getJSONObject("data");
// if (data.getIntValue("number") <= 0) {
// // 车牌绑定测试
// ret = caller.bindCar(domain, etcpToken, carNumber, null, merchantNo, merchantKey, version);
// objret = JSON.parseObject(ret);
// if (objret.getIntValue("code") != 0)
// return;
// }
// JSONArray carArry = data.getJSONArray("carList");
// carNumber = JSON.toJSONString(carArry.get(0));
// carNumber = carNumber.substring(1, carNumber.length() -1);
// System.out.println(carNumber);
// // 停车费查询
// ret = caller.orderUnpay(domain, appId, merchantNo, merchantKey, version, etcpToken, carNumber);
// System.out.println(ret);
// objret = JSON.parseObject(ret);
// if (objret.getIntValue("code") != 0)
// return;
// JSONArray payArr = objret.getJSONArray("data");
// JSONObject payObj = payArr.getJSONObject(0);
// String orderId = payObj.getString("orderId");
// // 微信h5支付
// ret = caller.orderPay(domain, merchantNo, merchantKey, version, etcpToken, orderId, "http://test.cn", null);
// System.out.println(ret);

// 车牌解绑测试
//caller.unbindCar(merchantNo, merchantKey, version, etcpToken, carNumber);


//String orderId = "867C6F2F-4F3A-4767-890E-BA7F53F9C601";
//caller.orderPay(etcpToken, 5, orderId, "test.cn", null);

// 支付完成通知测试
/*caller.orderPaid(etcpToken, "51C3E00A-4F87-43FB-A71B-C1287ED956CB",
"201803120000001", BigDecimal.valueOf(8.85), "2018-03-12 11:58:31",
"FSED9JvxgAU6XJUd8YRF5f7OuzyQ/lGJch0h8dVVkNaHUpPISCLBshnn0AIoEdIdi2aQMOrrcmdVz2Smy+UbQ8pXl95Mv50aPNnUgaDlxSDqHQ8iOD6FT5XV7ikozZ0800CJKDkvQrmCZS2O21G+xg==",
"ETCP");*/
}

public static int getPayType() {
return payType;
}

private boolean checkRespFailed(String resp) {
if(resp.startsWith("<html>") || resp.startsWith("<!DOCTYPE html>")) {
return true;
}
return false;
}

/**
* 6.1. 联合登录
*
* @param appId appId(非空)
* @param merchantNo merchantNo(非空)
* @param merchantKey merchantKey(非空)
* @param version version(非空)
* @param mobilePhone 手机号(非空)
* @return 联合登录响应信息
* {
* "code": 0,
* "data": {
* "token": "0b59582d-ea6f-4bf1-a570-e803cc24ebe0"
* },
* "message": "ok"
* }
*/
public String userSignin(String baseUrl, String appId, String merchantNo, String merchantKey, String version,
String mobilePhone) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("appId", appId);
jsonObject.put("mobilePhone", mobilePhone);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + userSigninUrl.replaceAll("\\{version}", version), data, sign,
timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 7.1. 车牌绑定
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param plateNumber 车牌号(非空)
* @param plateColor 车牌颜色(可空)
* @return 绑牌响应信息
* {
* "code": 0,
* "message": "ok"
* }
*/
public String bindCar(String baseUrl, String merchantNo, String merchantKey, String version,
String etcpToken,
String plateNumber, String plateColor) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("plateNumber", plateNumber);
if ("1".equals(plateColor) || "2".equals(plateColor) || "3".equals(plateColor)
|| "4".equals(plateColor)) {
jsonObject.put("plateColor", plateColor);
}

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + bindCarUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 7.2. 车牌解绑
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param plateNumber 车牌号(非空)
* @return 车牌解绑响应信息
* {
* "code": 0,
* "message": "ok"
* }
*/
public String unbindCar(String baseUrl, String merchantNo, String merchantKey, String version,
String etcpToken,
String plateNumber) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("plateNumber", plateNumber);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + unbindCarUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 7.3. 车牌认证
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param carFrameNum 车架号(非空)
* @param plateNumber 车牌号(非空)
* @param carEngineNum 发动机号(非空)
* @return 车牌解绑响应信息
* {
* "code": 0,
* "message": "ok"
* }
*/
public String carAuth(String baseUrl, String merchantNo, String merchantKey, String version,
String etcpToken,
String carFrameNum, String plateNumber, String carEngineNum
) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("carFrameNum", carFrameNum);
jsonObject.put("plateNumber", plateNumber);
jsonObject.put("carEngineNum", carEngineNum);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + carAuthUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 7.4. 车牌找回
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param carFrameNum 车架号(非空)
* @param plateNumber 车牌号(非空)
* @param carEngineNum 发机号(非空)
* @param plateColor 车牌颜色(1 蓝 2 黑 3 黄 4 白)
* @return 车牌找回响应信息
* {
* "code": 0,
* "message": "ok"
* }
*/
public String carRetrieve(String baseUrl, String merchantNo, String merchantKey, String version,
String etcpToken,
String carFrameNum, String plateNumber, String carEngineNum, String plateColor ) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("carFrameNum", carFrameNum);
jsonObject.put("plateNumber", plateNumber);
jsonObject.put("carEngineNum", carEngineNum);
if (!StringUtils.isBlank(plateColor))
jsonObject.put("plateColor", plateColor);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + carRetrieveUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 7.5. 已绑车辆信息查询
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @return 已绑车辆信息查询响应信息
* {
* "code": 0,
* "msg": "ok",
* "data": {
* "number": 3,
* "carList": [
* "晋 BMZ105",
* "云 C12345"
* ]
* }
* }
*/
public String carNum(String baseUrl, String merchantNo, String merchantKey, String version,
String etcpToken) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doGet(baseUrl + carNumUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 8.1. 停车费查询
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param plateNumber 车牌号(非空)
* @param appId appId(可空)
* @return 停车费查询响应信息
*/
public String orderUnpay(String baseUrl,
String appId, String merchantNo, String merchantKey, String version,
String etcpToken,
String plateNumber) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("plateNumber", plateNumber);
if (appId != null && appId.length() > 0) {
jsonObject.put("appId", appId);
}

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doGet(baseUrl + orderUnpayUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 8.2. 优惠券查询
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @param lastCode 上一分页代码(可空)
* @param pageSize 1-200 之间的分页每页数量(非空)
* @return 停车费查询响应信息
*/
public String couponList(String baseUrl,
String merchantNo, String merchantKey, String version,
String etcpToken,
String lastCode, String pageSize) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
if (!StringUtils.isBlank(lastCode))
jsonObject.put("lastCode", lastCode);
jsonObject.put("pageSize", pageSize);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doGet(baseUrl + couponListUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 8.3.历史停车查询
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin}) (非空)
* @return 停车费查询响应信息
*/
public String orderHistory(String baseUrl,
String merchantNo, String merchantKey, String version,
String etcpToken) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doGet(baseUrl + orderHistoryUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 9.1. 主动支付(ETCP 收款)
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin})(非空)
* @param orderId 停车记录ID ({@link ETCPUtil#orderUnpay})(非空)
* @param returnUrl 外部支付流水号(商户平台生成)(非空)
* @param couponCode 支付金额 ({@link ETCPUtil#orderUnpay})(非空)
* @return
*/
public String orderPay(String baseUrl,
String merchantNo, String merchantKey, String version,
String etcpToken, String orderId,
String returnUrl, String couponCode) throws MallinkException {
// payType 支付方式(1 微信公众号内支付 2 支付宝 H5 支付 3 微信二维码 4 支付宝二维码 5 微信 H5)(非空)
int payType = 1;
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("payType", payType);
jsonObject.put("synId", orderId);
jsonObject.put("returnUrl", returnUrl);
if (couponCode != null && couponCode.length() > 0) {
jsonObject.put("couponCode", couponCode);
}

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + orderpayUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 9.2. 主动支付(商户平台收款)
*
* @param etcpToken 商户平台调用联合接口获取的token({@link ETCPUtil#userSignin})(非空)
* @param orderId 停车记录ID ({@link ETCPUtil#orderUnpay})(非空)
* @param externalOrderId 外部支付流水号(商户平台生成)(非空)
* @param payment 支付金额 ({@link ETCPUtil#orderUnpay})(非空)
* @param payTime 支付时间, 格式:yyyy-MM-dd HH:mm:ss(非空)
* @param verificationInfo 验证信息串 ({@link ETCPUtil#orderUnpay})(非空)
* @param appId appId(可空)
* @return
*/
public String orderPaid(String baseUrl,
String appId, String merchantNo, String merchantKey, String version,
String etcpToken,
String orderId, String externalOrderId,
BigDecimal payment, String payTime, String verificationInfo) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("orderId", orderId);
jsonObject.put("externalOrderId", externalOrderId);
jsonObject.put("payment", payment);
jsonObject.put("payTime", payTime);
jsonObject.put("verificationInfo", verificationInfo);
if (appId != null && appId.length() > 0) {
jsonObject.put("appId", appId);
}

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + orderPaidUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 11.1. 车场信息查询
*
* @param lat, lon, radius
* @return 车场信息查询
*/
public String parkingInfo(String baseUrl,
String merchantNo, String merchantKey, String version,
String lat, String lon, String radius) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("lat", lat);
jsonObject.put("lon", lon);
jsonObject.put("radius", radius);
jsonObject.put("payType", "1"); // 1:电子支付

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + parkingInfoUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 11.2. 车场状态查询
*
* @param parkingId 车场ID(非空)
* @return 车场状态查询响应信息
*/
public String parkingStatus(String baseUrl,
String merchantNo, String merchantKey, String version,
String parkingId) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("parkingId", parkingId);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + parkingStatusUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)){
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 12.1. 坏账查询
*
* @param etcpToken
* @return 车场状态查询响应信息
*/
public String getDebt(String baseUrl,
String appId, String merchantNo, String merchantKey, String version,
String etcpToken, String carNumber) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("appId", appId);
jsonObject.put("plateNumber", carNumber);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + parkingStatusUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 12.2. 坏账清缴
*
* @param etcpToken
* @param
* @param returnUrl
* @return 车场状态查询响应信息
*/
public String repayDebt(String baseUrl,
String merchantNo, String merchantKey, String version,
String etcpToken, String returnUrl) throws MallinkException {
// payType(1:支付宝 2:微信H5)
int payType = 2;
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("payType", payType);
jsonObject.put("returnUrl", returnUrl);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + parkingStatusUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 13.1. 商家优免券模板查询
*
* @return 商家优免券模板查询结果
*/
public String getBCouponList(String baseUrl,
String merchantNo, String merchantKey, String version,
String parkId, String businessId) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("parkId", parkId);
jsonObject.put("businessId", businessId);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + bCouponListUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 13.2. 商家优免券发放
*
* @param etcpToken
* @return 商家优免券发放结果
*/
public String bCouponRecord(String baseUrl,
String merchantNo, String merchantKey, String version,
String etcpToken,
String parkId, String businessId, String carNumber, String couponFreeId) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", etcpToken);
jsonObject.put("parkId", parkId);
jsonObject.put("businessId", businessId);
jsonObject.put("vehicleNo", carNumber);
jsonObject.put("couponFreeId", couponFreeId);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + bCouponRecordUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

/**
* 14.1. 车辆进出场模拟接口
*
* @param appId, plateNumber
* @return 车场状态查询响应信息
*/
public String carSimulation(String baseUrl,
String appId, String merchantNo, String merchantKey, String version,
String plateNumber) throws MallinkException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("appId", appId);
jsonObject.put("plateNumber", plateNumber);

String data = jsonObject.toJSONString();
String timeStamp = dateTimeFormatter.format(LocalDateTime.now());
String sign = genSign(data, merchantKey, timeStamp);

String respStr = doPost(baseUrl + bCarSimulationUrl.replaceAll("\\{version}", version),
data, sign, timeStamp, merchantNo);
if(respStr == null) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
if(checkRespFailed(respStr)) {
throw new MallinkException(ErrorCode.ETCP_CMD_FAIL);
}
return respStr;
}

private String doPost(String url, String data, String sign, String timeStamp, String merchantNo) {
logger.info("请求url地址:{}, 请求参数为:data={}, sign={}, time_stamp={}, merchant_no={}", url, data,
sign, timeStamp, merchantNo);
RequestBody body = new FormBody.Builder().add("data", data).add("sign", sign)
.add("time_stamp", timeStamp).add("merchant_no", merchantNo).build();
Request request = new Request.Builder().url(url).post(body).build();
try (Response response = client.newCall(request).execute()) {
String responseStr = response.body().string();
logger.info("post接口响应信息为:{}", responseStr);
return responseStr;
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
return null;
}

private String doGet(String sourceUrl, String data, String sign, String timeStamp, String merchantNo) {
logger.info("请求url地址:{}, 请求参数为:data={}, sign={}, time_stamp={}, merchant_no={}", sourceUrl,
data, sign, timeStamp, merchantNo);
HttpUrl url = HttpUrl.parse(sourceUrl).newBuilder().addQueryParameter("data", data)
.addQueryParameter("sign", sign).addQueryParameter("time_stamp", timeStamp)
.addQueryParameter("merchant_no", merchantNo).build();
Request request = new Request.Builder().url(url).build();
try (Response response = client.newCall(request).execute()) {
String responseStr = response.body().string();
logger.info("get请求接口响应信息为:{}", responseStr);
return responseStr;
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
return null;
}

// 签名
private String genSign(String param, String merchantKey, String time) {
String preparedString = new StringBuilder(param).append(merchantKey).append(time).toString();
return md5Encode(preparedString.replaceAll("[ \r\t\n]", ""));
}

private String md5Encode(String content) {
StringBuilder sb = new StringBuilder();
try {
if (content == null || content.length() == 0) {
return null;
}
MessageDigest digestInstance = MessageDigest.getInstance("MD5");
digestInstance.update(content.getBytes("UTF-8"));
byte[] md = digestInstance.digest();
for (int i = 0; i < md.length; ++i) {
int val = md[i] & 0xff;
if (val < 16) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
} catch (Exception ex) {
logger.error(ex.getMessage(),ex);
}
return sb.toString().toUpperCase();
}

}

+ 0
- 488
suimangService/src/main/java/com/iformall/service/park/impl/etcp/EtcpHelper.java 查看文件

@@ -1,488 +0,0 @@
package com.iformall.service.park.impl.etcp;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCUserCar;
import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.po.WxMerchant;
import com.iformall.domain.po.WxPark;
import com.iformall.domain.po.base.TenantEntity;
import com.iformall.domain.vo.WxCouponOrderCarCVo;
import com.iformall.domain.vo.WxMerchantVo;
import com.iformall.enums.EnumCarVendor;
import com.iformall.enums.EnumCouponOrderStatus;
import com.iformall.enums.EnumETCPCode;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserBasicInfoService;
import com.iformall.service.WxCUserCarService;
import com.iformall.service.WxCouponOrderService;
import com.iformall.service.WxMerchantService;
import com.iformall.service.park.impl.util.ParkHelper;

@Service
public class EtcpHelper {

private final Logger logger = LoggerFactory.getLogger(EtcpHelper.class);
private ETCPUtil etcp = new ETCPUtil();
@Autowired
WxCUserBasicInfoService wxCUserBasicInfoService;
@Autowired
WxCUserCarService wxCUserCarService;
@Autowired
WxMerchantService wxMerchantService;
@Autowired
WxCouponOrderService wxCouponOrderService;
@Autowired
ParkHelper parkHelper;
public ResultData initForEtcp(Map<String, String> paramMap, Long userId, WxPark park) {
String phone = paramMap.get("phone");
WxCUserBasicInfo user = wxCUserBasicInfoService.getById(userId,park.getFinalTenantId());
if (null == user) {
logger.error("暂未成为会员,请授权手机号");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "暂未成为会员,请授权手机号");
}
if (StringUtils.isBlank(phone) && StringUtils.isBlank(user.getPhone())) {
logger.error("暂未成为会员,请授权手机号");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "暂未成为会员,请授权手机号");
}
if (!StringUtils.isBlank(user.getPhone()) && !user.getPhone().contains("*")) {
phone = user.getPhone();
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String appId = objParams.getString("appId");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");

String ret = "";
try {
ret = etcp.userSignin(url, appId, merchantNo, merchantKey, version, phone);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == EnumETCPCode.SUCCESS.getCode()) {
// 获取绑定的车牌
JSONObject dataObj = retObj.getJSONObject("data");
dataObj.put("vendor", EnumCarVendor.CAR_ETCP.getCode());
String etcpToken = dataObj.getString("token");
try {
JSONObject dataObj1 = etcpSyncCarNumbers(park, user.getId(), park.getVendorType(),
url, merchantNo, merchantKey, version,
etcpToken);
} catch (MallinkException e) {
logger.error("ETCP cmd error: " + e.getMessage());
}
// c端必须保存此token
return new ResultData(dataObj);
} else {
logger.error("共同登录失败: " + phone);
return new ResultData(ErrorCode.ETCP_LOGIN_FAIL.getCode(), "共同登录失败");
}
}

/**
* ETCP同步
*
* @param tenantEntity
* @param cUserId
* @param iVendorType
* @param url
* @param merchantNo
* @param merchantKey
* @param version
* @param etcpToken
* @return
*/
private JSONObject etcpSyncCarNumbers(TenantEntity tenantEntity, Long cUserId, int iVendorType,
String url, String merchantNo, String merchantKey, String version,
String etcpToken) {
String ret;
JSONObject retObj;
/*{"code": 0,"msg": "ok","data": {"number": 3,"carList": ["晋 BMZ105","云 C12345"]}} */
try {
ret = etcp.carNum(url, merchantNo, merchantKey, version, etcpToken);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
throw new MallinkException(e.getErrorCode(), e.getMessage());
}
retObj = JSON.parseObject(ret);
JSONObject dataObj1 = retObj.getJSONObject("data");
dataObj1.put("vendor", iVendorType);
JSONArray arr = dataObj1.getJSONArray("carList");
WxCUserCar queryUserCar = new WxCUserCar();
queryUserCar.setCUserId(cUserId);
List<WxCUserCar> uclist = wxCUserCarService.getList(queryUserCar);
if(null != uclist ) {
List<WxCUserCar> ucclist = new ArrayList<WxCUserCar>();
ucclist.addAll(uclist);
// 删除ETCP不存在
for (WxCUserCar userCar : uclist) {
boolean bExist = isExistInArray(arr, userCar.getCarNumber());
if (!bExist) {
wxCUserCarService.deleteById(userCar.getId());
ucclist.remove(userCar);
}
}
// 添加ETCP的
for (int i = 0; i < arr.size(); i++) {
String _carNum = arr.getString(i);
boolean bExist = isExistInList(ucclist, _carNum);
if (!bExist) {
Date curr = new Date();
WxCUserCar userCar = new WxCUserCar();
userCar.setCUserId(cUserId);
userCar.updateTenantInfo(tenantEntity);
userCar.setCarNumber(_carNum);
userCar.setVendorType(EnumCarVendor.CAR_ETCP.getCode());
userCar.setCreateDate(curr);
userCar.setUpdateDate(curr);
wxCUserCarService.saveOrUpdate(userCar);
}
}
}
return dataObj1;
}

private boolean isExistInArray(JSONArray arr, String carNumber) {
boolean bExist = false;
for (int i = 0; i < arr.size(); i++) {
// check carNum+cUserId是否存在, 不存在新建
String _carNum = arr.getString(i);

if (carNumber.equals(_carNum)) {
bExist = true;
break;
}
}
return bExist;
}

private boolean isExistInList(List<WxCUserCar> list, String carNumber) {
boolean bExist = false;
for (WxCUserCar userCar : list) {
if (carNumber.equals(userCar.getCarNumber())) {
bExist = true;
break;
}
}
return bExist;
}
public ResultData etcpBindCar(Map<String, String> paramMap, WxPark park, Long cuUserId) {
String etcpToken = paramMap.get("etcpToken");
if (StringUtils.isBlank(etcpToken)) {
logger.error("etcpToken为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "etcpToken为空");
}
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");

String ret = "";
try {
ret = etcp.bindCar(url, merchantNo, merchantKey, version, etcpToken, carNumber, null);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == 0) {
parkHelper.addCarInfoToDB(carNumber, EnumCarVendor.CAR_ETCP, park, cuUserId,"etcpUser");
JSONObject dataObj = retObj.getJSONObject("data");
return new ResultData(dataObj);
} else {
String message = retObj.getString("message");
logger.error("绑车牌失败: " + carNumber);
return new ResultData(ErrorCode.ETCP_BIND_FAIL.getCode(), message, retObj);
}
}
public ResultData etcpUnbindCar(Map<String, String> paramMap, WxPark park, Long cuUserId) {
String etcpToken = paramMap.get("etcpToken");
if (StringUtils.isBlank(etcpToken)) {
logger.error("etcpToken为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "etcpToken为空");
}
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");

String ret = "";
try {
ret = etcp.unbindCar(url, merchantNo, merchantKey, version, etcpToken, carNumber);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}

JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == 0) {
try {
WxCUserCar userCar = new WxCUserCar();
userCar.setCUserId(cuUserId);
userCar.updateTenantInfo(park);
userCar.setCarNumber(carNumber);
wxCUserCarService.deleteByObj(userCar);
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.DB_FAIL.getCode(), "解绑车牌数据库错误, e:" + e.getMessage());
}

return new ResultData();
} else {
String message = retObj.getString("message");
logger.error("解绑车牌失败");
return new ResultData(ErrorCode.ETCP_UNBIND_FAIL.getCode(), message, retObj);
}
}
public ResultData etcpCarStopFee(@RequestBody Map<String, String> paramMap, WxPark park) {
String etcpToken = paramMap.get("etcpToken");
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(etcpToken)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "etcpToken为空");
}
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String appId = objParams.getString("appId");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");

String ret = "";
try {
ret = etcp.orderUnpay(url, appId, merchantNo, merchantKey, version, etcpToken, carNumber);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}

JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == 0) {
JSONObject feeObj = retObj.getJSONArray("data").getJSONObject(0);
/*
Date currentDate = new Date();
WxCarCmdLog wxCarCmdLog = new WxCarCmdLog();
wxCarCmdLog.setTenantId(user.getTenantId());
wxCarCmdLog.setVendorType(EnumCarVendor.CAR_ETCP.getCode());
wxCarCmdLog.setCmdType(EnumCarCmd.CAR_ETCP_CALLBACK_UNPAY.getCode());
String feeStr = JSON.toJSONString(feeObj);
wxCarCmdLog.setCmdJson(feeStr);
wxCarCmdLog.setCreateDate(currentDate);
wxCarCmdLog.setUpdateDate(currentDate);
try {
wxCarCmdLogService.saveOrUpdate(wxCarCmdLog);
} catch (Exception e) {
logger.error("etcpOrderUnpay: 入库错误:" + feeStr);
return new ResultData(ErrorCode.DB_FAIL.getCode(), "入库错误", feeStr);
}
*/
return new ResultData(Result.SUCCESS, "停车费获取成功", feeObj);
} else {
String message = retObj.getString("message");
return new ResultData(ErrorCode.ETCP_STOP_FEE_FAIL.getCode(), message, retObj);
}
}
private String getETCPBusinessID(Long merchantId) {
String businessId;
WxMerchant wxMerchant = wxMerchantService.getById(merchantId);
String carParams = wxMerchant.getCarParams();
JSONObject objParams1 = JSON.parseObject(carParams);
businessId = objParams1.getString("businessId");
return businessId;
}
public ResultData getCoupon(Map<String, String> paramMap,WxPark park,WxCouponOrderCarCVo userCar,String carNumber) {
String etcpToken = paramMap.get("etcpToken");
if (StringUtils.isBlank(etcpToken)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "etcpToken为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");
String businessId = "";
// 获取merchantId
WxMerchantVo merchantVo = null;
if (null != userCar.getMerchantVoList() && userCar.getMerchantVoList().size() > 0) {
merchantVo = userCar.getMerchantVoList().get(0);
}

// 优先从从商户表里取
businessId = getETCPBusinessID(merchantVo.getId());
if (StringUtils.isBlank(businessId)) {
// 1期只有一个虚拟商户,可以写在商场配置里
businessId = objParams.getString("businessId");
}

String ret = "";
try {
String couponFreeId = couponFreeIdFromJson(userCar.getVendorParams());
if (StringUtils.isBlank(couponFreeId)) {
return new ResultData(ErrorCode.DB_FAIL.getCode(), "vendorParams解析错误");
}
ret = etcp.bCouponRecord(url, merchantNo, merchantKey, version,
etcpToken, park.getParkId(), businessId, carNumber, couponFreeId);
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == EnumETCPCode.SUCCESS.getCode()) {

try {
updateWxCouponOrderUsed(userCar, park);
return new ResultData();
} catch (Exception e) {
return new ResultData(ErrorCode.DB_FAIL.getCode(), "券包状态更新失败");
}
} else {
return new ResultData(ErrorCode.ETCP_QUAN_SEND_FAIL.getCode(), retObj.getString("message"));
}
}
private String couponFreeIdFromJson(String json) {
if (StringUtils.isBlank(json)) {
return null;
}
JSONObject object = JSON.parseObject(json);
if (null != object) {
Integer id = object.getInteger("id");
if (null != id) {
return String.valueOf(id);
}
}
return null;
}
public void updateWxCouponOrderUsed(WxCouponOrderCarCVo userCar,WxPark park) throws Exception {
// 券状态设为已使用
WxCouponOrder couponOrder = new WxCouponOrder();
couponOrder.setId(userCar.getId());
couponOrder.updateTenantInfo(park);
couponOrder.setUpdateDate(new Date());
couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode());
try {
wxCouponOrderService.saveOrUpdate(couponOrder);
} catch (Exception e) {
logger.error("券包状态更新失败:" + couponOrder.getId(),e);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "券包状态更新失败");
}
}
public ResultData etcpParkStatus(WxPark park) {
String params = park.getVendorParams();
if (params == null) {
return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "车场不支持");
}
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String merchantNo = objParams.getString("merchantNo");
String merchantKey = objParams.getString("merchantKey");
String version = objParams.getString("version");
if (park.getParkingId() == null) {
// those code is not supported
/*
String lat = objParams.getString("lat");
String lon = objParams.getString("lon");
String radius = objParams.getString("radius");
String ret = etcp.parkingInfo(url, merchantNo, merchantKey, version, lat, lon, radius);
logger.info(ret);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == EnumETCPCode.SUCCESS.getCode()) {
JSONObject retData = retObj.getJSONObject("data");
if (retData != null) {
JSONArray retDataList = retData.getJSONArray("list");
if (retDataList != null) {
JSONObject parkData = retDataList.getJSONObject(0);
if (parkData != null) {
String parkId = parkData.getString("id");
objParams.put("parkId", parkId);
params = JSON.toJSONString(objParams);
park.setVendorParams(params);
park.setParkingId(parkId);
wxParkService.saveOrUpdate(park);
}
}
}
}
*/
}

if (park.getParkingId() != null) {
String ret = "";
try {
ret = etcp.parkingStatus(url, merchantNo, merchantKey, version, park.getParkingId());
} catch (MallinkException e) {
logger.error("ETCP failed: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
}

JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("code") == EnumETCPCode.SUCCESS.getCode()) {
if (retObj.get("data") != null) {
return new ResultData(retObj.getJSONObject("data"));
}
}
}
return null;
}
}

+ 0
- 235
suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkCallbackService.java 查看文件

@@ -1,235 +0,0 @@
package com.iformall.service.park.impl.haikangweishi;

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;


/**
* 海康文档 3.1.8
* @author alascor
*
*/
@Slf4j
@Service
public class HaiKangWeiShiParkCallbackService extends BaseParkService implements ParkBatchCallBackAdapterService {
@Autowired
HaiKangWeiShiParkService haiKangWeiShiParkService;
@Autowired
WxParkService wxParkService;

/**
*{
"method":"OnEventNotify",
"params":{
"ability":"vehicle_pass_in_event",
"eventType":771760131,
"events":[
{
"crossTime":"2021-07-01T17:29:27+08:00",
"crossType":1,
"eventIndexCode":"74b64514-4888-4f42-8cf7-22fed37d5dc8",
"eventType":3,
"resource":{
"deviceId":"3715149265421676",
"deviceSerial":"R20150664",
"direction":0,
"entranceId":"2063867554789264",
"entranceName":"前门1",
"parkId":"2064637172217744",
"parkName":"车库",
"resType":"roadway",
"roadWayId":"2064272439342992",
"roadWayName":"前门入口"
},
"stopType":11,
"vehicle":{
"plateColor":12,
"plateNo":"苏A23658",
"plateType":8,
"vehicleColor":12,
"vehicleType":12
}
}
],
"sendTime":"2021-07-01T17:29:29.315+08:00"
}
}
*/
@Override
public List<ParkNotifyParam> parseInNoticyParam(Object param) {
Map<String,Object> paramm = (Map<String, Object>) param;
Map params = (Map) paramm.get("params");
if (null != params) {
List list = (List)params.get("events");
if (null != list && list.size() > 0 ) {
List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>();
for (int i = 0 ; i < list.size() ; i ++) {
Map<String,Object> map = (Map<String, Object>) list.get(i);
ParkNotifyParam ret = parseInNoticyParamSingle(map);
if (null != ret ) {
retList.add(ret);
}
}
return retList;
}
}
return null;
}
private ParkNotifyParam parseInNoticyParamSingle(Map<String,Object> paramMap) {
Map vehicle = (Map)paramMap.get("vehicle");
Map resource = (Map)paramMap.get("resource");
String carNumber = vehicle.get("plateNo").toString();
String parkCode = resource.get("parkId").toString();
String parkName = resource.get("parkName").toString();
String synId = paramMap.get("eventIndexCode").toString();
String entranceTime = paramMap.get("crossTime").toString();
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(carNumber);
p.setParkId(parkCode);
p.setParkName(parkName);
p.setSynId(synId);
// try {
// p.setEntranceTime(JieShunUtil.utcToLocal(entranceTime));
// } catch (ParseException e) {
// log.error("jieshun entranceTime format error",e);
// return null;
// }
return p;
}

/**
* {
"method":"OnEventNotify",
"params":{
"ability":"vehicle_pass_out_event",
"eventType":771760134,
"events":[
{
"crossTime":"2021-07-01T17:31:17+08:00",
"crossType":1,
"eventIndexCode":"a5464f46-ba7b-4059-b657-5ebc2f3774a9",
"eventType":4,
"resource":{
"deviceId":"370573791833424",
"deviceSerial":"9b1037b5-8a95-4657-81f0-edf27f71d92f",
"direction":1,
"entranceId":"2063867554789264",
"entranceName":"前门1",
"parkId":"2064637172217744",
"parkName":"车库",
"resType":"roadway",
"roadWayId":"2064664422217616",
"roadWayName":"前门出口test"
},
"stopType":11,
"vehicle":{
"plateColor":12,
"plateNo":"苏A23658",
"plateType":8,
"vehicleColor":12,
"vehicleType":12
}
}
],
"sendTime":"2021-07-01T17:31:17.337+08:00"
}
}
*/
@Override
public List<ParkNotifyParam> parseOutNoticyParam(Object param) {
Map<String,Object> paramm = (Map<String, Object>) param;
Map params = (Map) paramm.get("params");
if (null != params) {
List list = (List)params.get("events");
if (null != list && list.size() > 0 ) {
List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>();
for (int i = 0 ; i < list.size() ; i ++) {
Map<String,Object> map = (Map<String, Object>) list.get(i);
ParkNotifyParam ret = parseOutNoticyParamSingle(map);
if (null != ret ) {
retList.add(ret);
}
}
return retList;
}
}
return null;
}
private ParkNotifyParam parseOutNoticyParamSingle(Map<String, Object> paramMap) {
Map vehicle = (Map)paramMap.get("vehicle");
Map resource = (Map)paramMap.get("resource");
String carNumber = vehicle.get("plateNo").toString();
String parkCode = resource.get("parkId").toString();
String parkName = resource.get("parkName").toString();
String synId = paramMap.get("eventIndexCode").toString();
String entranceTime = paramMap.get("crossTime").toString();
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(carNumber);
p.setParkId(parkCode);
p.setParkName(parkName);
p.setSynId(synId);
// try {
// p.setEntranceTime(JieShunUtil.utcToLocal(entranceTime));
// } catch (ParseException e) {
// log.error("cyf entranceTime format error",e);
// return null;
// }
// try {
// p.setOutTime(JieShunUtil.utcToLocal(entranceTime));
// } catch (ParseException e) {
// log.error("cyf outTime format error",e);
// return null;
// }
return p;
}

@Override
public List<ParkNotifyParam> parseUnbindNoticyParam(Object param) {
return null;
}

@Override
public List<ParkNotifyParam> parsePaidNoticyParam(Object param) {
return null;
}
}

+ 0
- 250
suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiParkService.java 查看文件

@@ -1,250 +0,0 @@
package com.iformall.service.park.impl.haikangweishi;

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.Result;
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.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;

/**
* 认证平台 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
*
*/
@Service
public class HaiKangWeiShiParkService extends BaseParkService implements ParkAdapterService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
ParkHelper parkHelper;
@Autowired
@Qualifier("objectCommonRedisTemplate")
RedisTemplate<String, Object> redisTemplate;
@Autowired
RedisLock redisLock;
HaiKangWeiShiUtil haikang = new HaiKangWeiShiUtil();
private String getCacheToken(WxPark park) {
String token = RedisCacheUtils.getCacheString(redisTemplate, "carStop:haikangtoken:"+park.getId());
if (StringUtils.isBlank(token)) {
String lockKey = "carStop:haikangtokenlock:"+park.getTenantId();
long time = System.currentTimeMillis() + 2000;
String timeStr = String.valueOf(time);
if (redisLock.lock2(lockKey, timeStr)) {
token = haikang.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:haikangtoken:"+park.getId());
}
private void setCacheToken(WxPark park,String token) {
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),haikang.getAuthorization(park,getCacheToken(park)));
if (retObj.getString("code").equals("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<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
return "haikaiweishi";
}

@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
}


/**
* 每一次查询都会产生订单,然后根据订单号查询
*/
@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
return haiKangWeiShiCarStopFee(paramMap, park);
}
private ResultData haiKangWeiShiCarStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
//如果车牌号是鄂AAAAAA, 为测试车牌
if (carNumber.equals("鄂AAAAAA")) {
return new ResultData(new ParkStopFee("-111",haikang.utcToLocal("2020-12-16 00:00:00"),haikang.utcToLocal("2020-12-17 00:00:00"),
"0.01","","payPath",null,"测试车牌,仅测试用",null));
}else if(carNumber.equals("鄂AAAAAB")) {
return new ResultData(21000,"车辆未入场");
}
JSONObject attribute = haikang.getFee(park, carNumber, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park)));
String appId = "";
String parkOrderId = attribute.getString("id");
String _createTime = attribute.getString("entranceTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss”
String _endTime = attribute.getString("costTime");//离场时间,格式为“yyyy-MM-dd HH:mi:ss”
String payPath = "";
return new ResultData(new ParkStopFee(parkOrderId,haikang.utcToLocal(_createTime),haikang.utcToLocal(_endTime),
String.valueOf(attribute.getDouble("shouldCost")),appId,payPath,null,null,"0元请勿使用优惠券,无法退回。支付后15分钟内离场"));
}

/**
* 使用3.5.9.1接口进行车牌和优惠信息绑定优惠券后,车辆出场时我们会自动抵扣。
* @return
*/
@Override
public ResultData useCoupon(Map<String, String> 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<String,String> valueMap = WxParkCouponConfig.parseValue(userCar.getVendorParams());
if (null == valueMap) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置。"+coupon.getTitle());
}
String orderNo = paramMap.get("parkOrderId");
String planNo = valueMap.get("couponNo");
if (StringUtils.isBlank(planNo)) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置[ruleId]。"+coupon.getTitle());
}
//查询临停信息,判断缓存是否已经存在
String inRecordSyscode = "";
JSONObject stopInfo = haikang.getCarStopInfo(park, getCacheToken(park), haikang.getAuthorization(park,getCacheToken(park)), carNumber);
if (stopInfo.getString("code").equals("0")){
JSONObject dataobject = stopInfo.getJSONObject("data");
if (null == dataobject) {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "当前未查询海康威视临停信息["+carNumber+"]");
}
JSONArray listobject = dataobject.getJSONArray("list");
if (null == listobject || listobject.size() <= 0 ) {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "当前未查询海康威视临停信息["+carNumber+"]");
}
JSONObject currentStopInfo = listobject.getJSONObject(0);
inRecordSyscode = currentStopInfo.getString("inRecordSyscode");
if (StringUtils.isBlank(inRecordSyscode)) {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "当前未查询海康威视临停信息["+carNumber+"]");
}
Integer used = RedisCacheUtils.getCacheInteger(redisTemplate, "carStop:haikangStopInfoUseCoupon:"+carNumber+":"+inRecordSyscode);
if (null == used || (null != used && used.intValue() < 1) ) {
//do nothing
}else {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "已经使用过优惠券, 不能重复使用.");
}
}else {
logger.error("haikangweishi stopInfo error. paramMap: {} . haikangResult: {}",JSON.toJSONString(paramMap),stopInfo);
String msg = stopInfo.getString("msg");
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "当前查询海康威视临停信息失败:["+stopInfo.getString("code")+"]"+msg);
}
JSONObject retObj = haikang.useCoupon(park,planNo,carNumber,orderNo, getCacheToken(park),haikang.getAuthorization(park,getCacheToken(park)));
if (retObj.getString("code").equals("0")){
RedisCacheUtils.cache(redisTemplate, "carStop:haikangStopInfoUseCoupon:"+carNumber+":"+inRecordSyscode, 1, 24*3600);
return new ResultData();
}else {
logger.error("haikangweishi useCoupon error. paramMap: {} . haikangResult: {}",JSON.toJSONString(paramMap),retObj);
String msg = retObj.getString("msg");
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "当前用户领用到海康威视停车券失败:["+retObj.getString("code")+"]"+msg);
}
}

@Override
public ResultData getParkStatus(WxPark park) throws Exception{
return new ResultData();
}

@Override
public boolean ignoreUseCouponCache() {
return true;
}

}

+ 0
- 464
suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/HaiKangWeiShiUtil.java 查看文件

@@ -1,464 +0,0 @@
package com.iformall.service.park.impl.haikangweishi;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
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;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
* @author: furunxin
* @Date: 2020/7/1 17:16
* @Description: 车易付接口对接参数类
*/

@Slf4j
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://pmsopen.hikyun.com/artemis/api/pmsc/v1/pay/quickGetVehicleBill";
public static final String COUPON_USE = "https://pmsopen.hikyun.com/artemis/api/pmsc/v1/coupon/addition";
public static final String SUBSCRIPTION = "https://pmsopen.hikyun.com/artemis/api/pmsc/v1/sub/subscription";
public static final String CAR_STOP_INFO = "https://pmsopen.hikyun.com/artemis/api/pmsc/v1/tempCarInRecords/page";

/**
* @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 static String getLocalDate(){
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowDate = ldt.format(dtf);
return nowDate;
}

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 ChallengeCode getChallengeCode(WxPark wxPark,String accessToken) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map<String,Object> params = new HashMap<String,Object>();
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<String,Object> params = new HashMap<String,Object>();
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);
if (StringUtils.isBlank(result)) {
return null;
}
JSONObject res = JSON.parseObject(result);
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"));
}
}
/**
* 查询停车费 3.5.5 快速获取账单接口
* @return
*/
public JSONObject getFee(WxPark wxPark,String carNumber,String token,String Authrozitaion) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map<String,Object> params = new HashMap<String,Object>();
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);
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("0") ) {
String message = result.getString("msg");
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getFee error.["+result.getString("code")+"]"+message);
}
JSONObject attribute = result.getJSONObject("data");
if (null == attribute) {
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getFee error. no result ["+result.getInteger("code")+"]"+carNumber);
}
return attribute;
}
/**
* 3.5.7 查询停车信息
*
* "inRecordSyscode": "h45h45h45ghhn45tg245g45r",
"parkId": "6534543543554",
"parkName": "停车库 1",
"plateNo": "浙 A12345",
"plateNoPicId": "hj53h4h45t45t45t3t234t2t2t45t45t",
"vehiclePicId": "u65h45g45yh56y54y34y34y345y3"
"inTime": "2018-07-26T15:00:00+08:00",
"parkTime": "3 小时 10 分钟"
*/
public JSONObject getCarStopInfo(WxPark wxPark,String token,String Authrozitaion,String carNumber) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map<String,Object> params = new HashMap<String,Object>();
params.put("pageNo", 1);
params.put("pageSize", 1);
params.put("parkId", wxPark.getParkingId());//商户编号
params.put("plateNo", carNumber);
String retCode = ProcBussiness(CAR_STOP_INFO, params,token,Authrozitaion);
if (StringUtils.isBlank(retCode)) {
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "haikang getCarStopInfo error. has no result");
}
JSONObject result = JSON.parseObject(retCode);
Integer errStatus = result.getInteger("status");
if (null != errStatus) {
throw new MallinkException(errStatus,"haikang getCarStopInfo error.["+result.getString("error")+"]"+result.getString("message"));
}
if (!result.getString("code").equals("0") ) {
String message = result.getString("msg");
throw new MallinkException(result.getInteger("code"), "haikang getCarStopInfo error."+message);
}
return result;
}
/**
* 2、有优惠券方式
发优惠券的时候是会返回一个优惠券id(3.5.9.1),
在用户出场的时候,获取停车账单(3.5.3),
使用停车账单和优惠券id获取优惠账单(3.5.4),
调用账单支付确认接口(3.5.6);
完成一次优惠缴费
* 使用优惠券 3.5.9.1接口进行车牌和优惠信息绑定优惠券后,车辆出场时会自动抵扣
**/
public JSONObject useCoupon(WxPark wxPark,String couponNo,String carNumber,String orderNo,String token,String Authrozitaion){
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map<String,Object> params = new HashMap<String,Object>();
Map couponmap = new HashMap();
couponmap.put("plateNo", carNumber);
couponmap.put("ruleId", couponNo);
List<Map> coupons = new ArrayList<Map>();
coupons.add(couponmap);
params.put("coupons", coupons);//商户编号
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);
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("0") ) {
String message = result.getString("msg");
throw new MallinkException(result.getInteger("code"), "haikang useCoupon error."+message);
}
return result;
}
/**
* 消息订阅 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 token,String Authrozitaion){
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map<String,Object> params = new HashMap<String,Object>();
params.put("partnerAppKey", vp.getString("ak"));//商户编号
params.put("projectId", vp.getString("projectId"));
params.put("eventTypes", new Integer[] {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);
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("0") ) {
String message = result.getString("msg");
throw new MallinkException(result.getInteger("code"), "haikang subscription error."+message);
}
return result;
}
/*token认证登陆**/
private static String ProcLogin(String clientId,String clientSecret) {
ArrayList<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("client_id", clientId));
list.add(new BasicNameValuePair("client_secret", clientSecret));
return formData(TOKEN_URL,list,null,null);
}

private static String ProcBussiness(String url,Map<String,Object> list,String token,String authorization) {
try {
return Proc(url,list,token,authorization);
} catch (Exception e) {
log.error("haikang request error.",e);
}
return null;
}
private static String Proc(String url, Map<String,Object> pairs,String token,String authorization) {
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 (!StringUtils.isBlank(authorization)) {
httpPost.addHeader("Authorization",authorization);
}

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("haikangweishi httpRequest:[url]"+url+"[params]"+JSON.toJSONString(pairs));
requestlog.append("haikangweishi httpRequest:[url]").append(url).append("[params]").append(JSON.toJSONString(pairs));
}else {
log.info("haikangweishi httpRequest:[url]"+url);
requestlog.append("haikangweishi 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 formData(String url,List<NameValuePair> 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);
long currentTime = System.currentTimeMillis();
StringBuffer requestlog = new StringBuffer();
if (null != pairs) {
log.info("haikangweishi httpRequest start :[url]"+url+"[params]"+JSON.toJSONString(pairs));
requestlog.append("haikangweishi httpRequest:[url]").append(url).append("[params]").append(JSON.toJSONString(pairs));
}else {
log.info("haikangweishi httpRequest start :[url]"+url);
requestlog.append("haikangweishi 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;
}
}

+ 0
- 15
suimangService/src/main/java/com/iformall/service/park/impl/haikangweishi/entity/ChallengeCode.java 查看文件

@@ -1,15 +0,0 @@
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;
}

+ 0
- 190
suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkCallbackService.java 查看文件

@@ -1,190 +0,0 @@
package com.iformall.service.park.impl.jieshun;

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 JieShunParkCallbackService extends BaseParkService implements ParkBatchCallBackAdapterService {
@Autowired
JieShunParkService jieshunParkService;
@Autowired
WxParkService wxParkService;
@Autowired
WxCarJSOrderMapper wxCarJSOrderMapper;
private String handleCarNumber(String carNumber) {
if (StringUtils.isBlank(carNumber)) {
return "空车牌";
}
if (carNumber.contains("-")) {
carNumber = carNumber.replaceAll("-", "");
}
return carNumber;
}

/**
* {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) {
Map<String,Object> paramm = (Map<String, Object>) param;
String liststr = (String) paramm.get("dataItems");
JSONArray list = JSONArray.parseArray(liststr);
if (null != list && list.size() > 0 ) {
List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>();
for (int i = 0 ; i < list.size() ; i ++) {
Map<String,Object> map = (Map<String, Object>) list.get(i);
ParkNotifyParam ret = parseInNoticyParamSingle(map);
if (null != ret ) {
retList.add(ret);
}
}
return retList;
}
return null;
}
private ParkNotifyParam parseInNoticyParamSingle(Map<String,Object> paramMap) {
String carNumber = paramMap.get("carNumber").toString();
String parkCode = paramMap.get("parkCode").toString();
String parkName = paramMap.get("parkName").toString();
String synId = paramMap.get("itemId").toString();
String entranceTime = paramMap.get("inTime").toString();
ParkNotifyParam p = new ParkNotifyParam();
String realCarNumber = handleCarNumber(carNumber);
p.setCarNumber(realCarNumber);
p.setParkId(parkCode);
p.setParkName(parkName);
p.setSynId(synId);
try {
p.setEntranceTime(JieShunUtil.utcToLocal(entranceTime));
} catch (ParseException e) {
log.error("jieshun entranceTime format error",e);
return null;
}
return p;
}

@Override
public List<ParkNotifyParam> parseOutNoticyParam(Object param) {
Map<String,Object> paramm = (Map<String, Object>) param;
String liststr = (String) paramm.get("dataItems");
JSONArray list = JSONArray.parseArray(liststr);
if (null != list && list.size() > 0 ) {
List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>();
for (int i = 0 ; i < list.size() ; i ++) {
Map<String,Object> map = (Map<String, Object>) list.get(i);
ParkNotifyParam ret = parseOutNoticyParamSingle(map);
if (null != ret ) {
retList.add(ret);
}
}
return retList;
}
return null;
}
private ParkNotifyParam parseOutNoticyParamSingle(Map<String, Object> paramMap) {
String carNumber = paramMap.get("carNumber").toString();
String parkCode = paramMap.get("parkCode").toString();
String parkName = paramMap.get("parkName").toString();
String synId = paramMap.get("itemId").toString();
String entranceTime = paramMap.get("outTime").toString();
String realCarNumber = handleCarNumber(carNumber);
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(realCarNumber);
p.setParkId(parkCode);
p.setParkName(parkName);
p.setSynId(synId);
try {
p.setEntranceTime(JieShunUtil.utcToLocal(entranceTime));
} catch (ParseException e) {
log.error("cyf entranceTime format error",e);
return null;
}
try {
p.setOutTime(JieShunUtil.utcToLocal(entranceTime));
} catch (ParseException e) {
log.error("cyf outTime format error",e);
return null;
}
p.setFee(String.valueOf(paramMap.get("ssMoney")));
return p;
}

@Override
public List<ParkNotifyParam> parseUnbindNoticyParam(Object param) {
return null;
}

@Override
public List<ParkNotifyParam> parsePaidNoticyParam(Object param) {
Map<String,Object> paramm = (Map<String, Object>) param;
String liststr = (String) paramm.get("dataItems");
JSONArray list = JSONArray.parseArray(liststr);
if (null != list && list.size() > 0 ) {
List<ParkNotifyParam> retList = new ArrayList<ParkNotifyParam>();
for (int i = 0 ; i < list.size() ; i ++) {
Map<String,Object> map = (Map<String, Object>) list.get(i);
ParkNotifyParam ret = parsePaidNoticyParamSingle(map);
if (null != ret ) {
retList.add(ret);
}
}
return retList;
}
return null;
}
JieShunUtil jieshun = new JieShunUtil();
private ParkNotifyParam parsePaidNoticyParamSingle(Map<String,Object> vo) {
ParkNotifyParam p = new ParkNotifyParam();
p.setCarNumber(handleCarNumber((String) vo.get("carNumber")));
p.setParkId(String.valueOf(vo.get("parkCode")));
p.setParkOrderId((String) vo.get("itemId"));
p.setSynId((String) vo.get("itemId"));
p.setFee(vo.get("ssMoney").toString());
try {
p.setPayTime(jieshun.utcToLocal((String)vo.get("feesTime")));
} catch (ParseException e) {
e.printStackTrace();
}
return p;
}
}

+ 0
- 359
suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunParkService.java 查看文件

@@ -1,359 +0,0 @@
package com.iformall.service.park.impl.jieshun;

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.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;

/**
* 跳转捷停车小程序参数:(生产环境)
appid:wx24b70f0ad2a9a89a
1>小程序首页
path:pages/index/index
2>小程序订单页(车牌+车场编号 ) path: pages/thirdPayOrder/payOrder?carNo=车牌&parkCode=车场编号
3>小程序订单页(订单编号) path: pages/thirdPayOrderByNo/payOrder?orderNo=订单编号
* 捷顺商户平台:http://merchant.jslife.com.cn/merchant/index.html#/auth/login
* 捷顺门店平台:http://merchant.jslife.com.cn/store/index.html#/auth/login
* wxParK配置:
* {
* "cid": "000000008032172", //获取token cid. [http://www.jslife.com.cn/jsaims/login]
* "psw": "000000008032172", //获取token pwd. [http://www.jslife.com.cn/jsaims/login]
* "usr": "000000008032172", //获取token usr. [http://www.jslife.com.cn/jsaims/login]
* "signkey": "71f1a4ab8c544379a192e1bf1b7e7d9e", //加密key
* "version": "2", //加密version
* "parkCode": "p201127315", //停车场编号
* "loginUser": "000000008032172000003", //捷顺门店平台登录账号
* "loginPassword": "ycHqp61Acudxz", //捷顺门店平台登录密码
* "businesserCode": "000000008032172" //捷顺商户编号
* }
* @author alascor
*
*/
@Service
public class JieShunParkService extends BaseParkService implements ParkAdapterService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
ParkHelper parkHelper;
@Autowired
@Qualifier("objectCommonRedisTemplate")
RedisTemplate<String, Object> redisTemplate;
@Autowired
RedisLock redisLock;
@Autowired
WxCarJSOrderMapper wxCarJSOrderMapper;
JieShunUtil jieshun = new JieShunUtil();
private String getCacheToken(WxPark park) {
String token = RedisCacheUtils.getCacheString(redisTemplate, "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(redisTemplate, "carStop:jieshuntoken:"+park.getId());
}
private void setCacheToken(WxPark park,String token) {
RedisCacheUtils.cache(redisTemplate, "carStop:jieshuntoken:"+park.getId(), token, 3600);
}
/**
* 先去捷顺注册,调用登陆获取令牌,然后根据令牌调用别的接口
* http://ap.jieshun.cn:9088/apply/ 注册信息地址 fumao/iformall2020
*
* 捷顺商户平台:http://merchant.jslife.com.cn/merchant/index.html#/auth/login
* 捷顺门店平台:http://merchant.jslife.com.cn/store/index.html#/auth/login
* 门店商户号 000000008032172000003 密码 ycHqp61Acudxz
*
*
* API对接注意事项:
1、token有效期两个小时,每两小时内登录一次获取token,调业务接口不需要频繁登录用,建议获取一次token存本地缓存,之后从本地获取,两小时内刷新一次,
为避免调业务接口时刚好token被刷新,导致token失效(无效的令牌或令牌已过期),可以做下容错,重新登录获取token或用最新token重新调业务接口。
2、token是和ip是一对一绑定,新的ip服务器调捷顺的接口会出现ip不合法,需把ip提供捷顺方,添加白名单。多个服务调捷顺接口共用一个ip情况下,只能共用一套登录获取token机制,各自登录会冲突。
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<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
return "jieshun";
}

@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) throws Exception{
}


/**
* 每一次查询都会产生订单,然后根据订单号查询
*/
@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
return jieshunCarStopFee(paramMap, park);
}
private ResultData jieshunCarStopFee(Map<String, String> paramMap, WxPark park) throws Exception{
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
//如果车牌号是鄂AAAAAA, 为测试车牌
if (carNumber.equals("鄂AAAAAA")) {
return new ResultData(new ParkStopFee("-111",jieshun.utcToLocal("2020-12-16 00:00:00"),jieshun.utcToLocal("2020-12-17 00:00:00"),
"0.01","wx24b70f0ad2a9a89a","payPath",null,"测试车牌,仅测试用",null));
}else if(carNumber.equals("鄂AAAAAB")) {
return new ResultData(21000,"车辆未入场");
}
//下订单;
String retCode = jieshun.createOrder(park, carNumber, getCacheToken(park));
if (StringUtils.isBlank(retCode)) {
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(), "jieshun createOrder error. has no result");
}
JSONObject result = JSON.parseObject(retCode);
if (result.getInteger("resultCode") != 0 ) {
String message = result.getString("message");
throw new MallinkException(result.getInteger("resultCode"), "jieshun createOrder error."+message);
}
JSONArray arrays = result.getJSONArray("dataItems");
if (null == arrays || arrays.size() == 0) {
throw new MallinkException(result.getInteger("resultCode"), "jieshun createOrder error. no order result"+carNumber);
}
JSONObject attribute = arrays.getJSONObject(0).getJSONObject("attributes");
Double totalFee = attribute.getDouble("totalFee");
String appId = "wx24b70f0ad2a9a89a";
String parkOrderId = attribute.getString("orderNo");
if (totalFee <= 0 ) {
String _createTime = attribute.getString("startTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss”
String _endTime = attribute.getString("endTime");//离场时间,格式为“yyyy-MM-dd HH:mi:ss”
String msg = attribute.getString("retmsg");
if (!StringUtils.isBlank(msg)) {
if (msg.contains("未入场")) {
return new ResultData(new ParkStopFee(null,jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
"0.00",appId,"payPath",null,msg,null));
}else {
//0元订单结清,查询是否用过打折方案,如果用过,则需要调用接口结清订单
Integer used = ParkCacheUtils.getCarCouponUseCacheLock(redisTemplate, EnumCarVendor.CAR_JIESHUN.getMessage(), carNumber);
if (null == used || (null != used && used.intValue() < 1)) {
//未使用停车券
return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
"0.00",appId,"payPath",null,msg,null));
}else {
return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
"0.00",appId,"payPath",null,msg,"用券抵扣后账单为0,获得15分钟免费出场时间"));
// String notifyResult = jieshun.notifyOrderResult(park, parkOrderId, getCacheToken(park));
// JSONObject notiryRetObj = JSON.parseObject(notifyResult);
// String noticeErrorMsg = notiryRetObj.getString("message");
// if (notiryRetObj.getIntValue("resultCode") == 0){
// JSONArray notiryRetArrays = notiryRetObj.getJSONArray("dataItems");
// if (null != notiryRetArrays && notiryRetArrays.size() == 0 ) {
// JSONObject notifyRetObject = notiryRetArrays.getJSONObject(0).getJSONObject("attributes");
// if(notifyRetObject.getIntValue("retCode") == 0) {
// return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
// "0.00",appId,"payPath",null,msg,"用券抵扣后账单为0,获得15分钟免费出场时间"));
// }else {
// return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
// "0.00",appId,"payPath",null,msg,"用券抵扣后账单为0,但是结清订单失败["+noticeErrorMsg+"],无免费出场时间,请下拉刷新"));
// }
// }else {
// return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
// "0.00",appId,"payPath",null,msg,"用券抵扣后账单为0,但是结清订单失败["+noticeErrorMsg+"],无免费出场时间,请下拉刷新"));
// }
// }else {
// return new ResultData(new ParkStopFee("-999",jieshun.utcToLocal(_createTime),jieshun.utcToLocal(_endTime),
// "0.00",appId,"payPath",null,msg,"用券抵扣后账单为0,但是结清订单失败["+noticeErrorMsg+"],无免费出场时间,请下拉刷新"));
// }
}
}
}
}
String ret = jieshun.getCarStopFee(park, parkOrderId, getCacheToken(park));
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("resultCode") == 0){
JSONArray retArrays = retObj.getJSONArray("dataItems");
if (null == retArrays || retArrays.size() == 0 ) {
throw new MallinkException(result.getInteger("resultCode"), "jieshun getCarStopFee error. no order result"+carNumber);
}
JSONObject retObject = retArrays.getJSONObject(0).getJSONObject("attributes");
String createTime = retObject.getString("startTime");//计费时间,格式为“yyyy-MM-dd HH:mi:ss”
String endTime = retObject.getString("endTime");//离场时间,格式为“yyyy-MM-dd HH:mi:ss”
String payPath = "pages/thirdPayOrder/payOrder?carNo="+jieshun.handleCarNumber(carNumber)+"&parkCode="+park.getParkingId();
return new ResultData(new ParkStopFee(parkOrderId,jieshun.utcToLocal(createTime),jieshun.utcToLocal(endTime),
String.valueOf(retObject.getDouble("totalFee")),appId,payPath,null,null,"请支付后15分钟内离场"));
}else {
logger.error("jieshunCarStopFee error. paramMap: {} . jieshunResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("message");
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(), "停车费获取失败:"+msg);
}
}

/**
* 使用3.8打折方案,3.9有限制如果领券了之后未使用,不能再次领券。导致出现异常之后,用户永远无法使用优惠券。
* @return
*/
@Override
public ResultData useCoupon(Map<String, String> 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<String,String> valueMap = WxParkCouponConfig.parseValue(userCar.getVendorParams());
if (null == valueMap) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置。"+coupon.getTitle());
}
//String orderNo = paramMap.get("parkOrderId");
String planNo = valueMap.get("couponNo");
if (StringUtils.isBlank(planNo)) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"当前停车券没有关联停车场优惠券配置[planNo]。"+coupon.getTitle());
}
//String ret = jieshun.getCoupon(park, planNo,userCar.getCUserPhone(), getCacheToken(park));
//打折登陆验证
String ret = jieshun.verifyuser(park, getCacheToken(park));
logger.info("jieshun verifyuser result:"+ret);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getIntValue("resultCode") == 0){
JSONArray verfyArrays = retObj.getJSONArray("dataItems");
if (null != verfyArrays && verfyArrays.size() > 0 ) {
JSONObject verfy = verfyArrays.getJSONObject(0).getJSONObject("attributes");
String userId = verfy.getString("userId");
//查询门店下打折方案
String queryPlanRet = jieshun.querySalePlan(park, getCacheToken(park), userId);
logger.info("jieshun querySalePlan result:"+queryPlanRet);
JSONObject queryPlantRetObj = JSON.parseObject(queryPlanRet);
if (queryPlantRetObj.getIntValue("resultCode") == 0){
JSONArray planArrays = queryPlantRetObj.getJSONArray("dataItems");
if (null != planArrays && planArrays.size() > 0 ) {
boolean hasPlan = false;
for (int i = 0 ; i < planArrays.size(); i++) {
JSONObject plan = planArrays.getJSONObject(i);
String planId = plan.getJSONObject("attributes").getString("planId");
if (planNo.equals(planId)) {
hasPlan = true;
break;
}
}
if (!hasPlan) {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(),"当前优惠券配置的捷顺编号无效,请联系管理员。"+coupon.getTitle());
}
//使用打折方案
String executeRet = jieshun.executediscount(park, planNo, userId, carNumber, getCacheToken(park));
logger.info("jieshun executediscount result:"+executeRet);
JSONObject executeRetObj = JSON.parseObject(executeRet);
if (executeRetObj.getIntValue("resultCode") == 0){
return new ResultData();
}else {
return new ResultData(executeRetObj.getIntValue("resultCode"),"当前用户使用捷顺停打折方案失败。"+executeRetObj.getString("message"));
}
}else {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(),"捷顺查询门店未查询到打折信息,请联系管理员。"+userCar.getcUserId());
}
}else {
logger.error("jieshun querySalePlan error. paramMap: {} . jieshunResult: {}",JSON.toJSONString(paramMap),queryPlanRet);
String msg = queryPlantRetObj.getString("message");
return new ResultData(queryPlantRetObj.getIntValue("resultCode"), "捷顺查询门店打折方案失败:"+msg);
}
}else {
return new ResultData(ErrorCode.CYF_STOP_FEE_FAIL.getCode(),"捷顺门店账号登陆失败,请联系管理员。"+userCar.getcUserId());
}
}else {
logger.error("jieshun verifyuser error. paramMap: {} . jieshunResult: {}",JSON.toJSONString(paramMap),ret);
String msg = retObj.getString("message");
return new ResultData(retObj.getIntValue("resultCode"), "当前用户领用到捷顺停车券失败:"+msg);
}
}

@Override
public ResultData getParkStatus(WxPark park) throws Exception{
return new ResultData();
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}

}

+ 0
- 378
suimangService/src/main/java/com/iformall/service/park/impl/jieshun/JieShunUtil.java 查看文件

@@ -1,378 +0,0 @@
package com.iformall.service.park.impl.jieshun;

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.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.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 JieShunUtil {

public static final String CYF_PARK_ID = "parkingId";
public static final String CYF_CAR_NUMBER = "plate";
public static final String CYF_PARK_NAME = "parking";
public static final String CYF_SYN_ID = "recordOrderId";
public static final String CYF_ENTRANCE_TIME = "inTime";

public static final String CYF_IS_RESULT = "result";
public static final String CYF_ERR_MSG = "strError";
public static final int CYF_SUC = 1;
public static final int CYF_ERR = 0;

public static final String TOKEN_URL = "http://www.jslife.com.cn/jsaims/login";
public static final String CREATE_ORDER = "http://www.jslife.com.cn/jsaims/as";
public static final String QUERY_ORDER = "http://www.jslife.com.cn/jsaims/as";
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";
public static final String VERIFY_USER = "http://www.jslife.com.cn/jsaims/as";
public static final String QUERY_PLAN = "http://www.jslife.com.cn/jsaims/as";
public static final String PLAN_EXECUTE = "http://www.jslife.com.cn/jsaims/as";

/**
* @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 static String getLocalDate(){
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowDate = ldt.format(dtf);
return nowDate;
}

public String getToken(WxPark wxPark) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
String cid = wxPark.getParkId();
String userName = vp.getString("usr");
String password = vp.getString("psw");
return getToken(cid,userName,password);
}
private String getToken(String cid,String userName,String password) {
String result = ProcLogin(cid, userName,password);
log.info("jieshun token cid:"+cid+" userName:"+userName+" password:"+password+" result: "+result);
if (StringUtils.isBlank(result)) {
return null;
}
JSONObject res = JSON.parseObject(result);
Integer code = res.getInteger("resultCode");
if (null == code || code.intValue() != 0) {
String msg = res.getString("message");
throw new MallinkException(code,msg);
}
return res.getString("token");
}
private Map generateMap(String serviceId,Map param) {
Map map = new HashMap();
map.put("serviceId", serviceId);
map.put("requestType", "DATA");
map.put("attributes", param);
return map;
}
public String handleCarNumber(String carNumber) {
if (carNumber.contains("-")) {
return carNumber;
}else {
carNumber = carNumber.substring(0,1)+"-"+carNumber.substring(1, carNumber.length());
return carNumber;
}
}
/**
* 创建订单
* @return
*/
public String createOrder(WxPark wxPark,String cardNumber,String token) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("businesserCode", vp.get("businesserCode"));//商户编号
param.put("parkCode", wxPark.getParkingId());
param.put("orderType", "VNP");
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.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/**
* 查询停车费
**/
public String getCarStopFee(WxPark wxPark,String orderNo,String token){
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("orderNo", orderNo);//商户编号
Map map = generateMap("3c.pay.queryorder",param);
log.info("jieshun getCarStopFee :" + JSON.toJSONString(map));
return ProcBussiness(QUERY_ORDER, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/**
* 打折登陆验证
*/
public String verifyuser(WxPark wxPark,String token) {
try {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("userCode", vp.get("loginUser"));//商户编号
MessageDigest md5Tool = MessageDigest.getInstance("MD5");
byte[] md5Data = md5Tool.digest((vp.getString("loginPassword")).getBytes("UTF-8"));
String sn = toHexString(md5Data);
param.put("password", sn.toLowerCase());//优惠券编号
Map map = generateMap("3c.discount.verifyuser",param);
log.info("jieshun verifyuser :" + JSON.toJSONString(map));
return ProcBussiness(VERIFY_USER, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
} catch (NoSuchAlgorithmException e) {
log.error("jieshun verifyuser error.park:"+wxPark.getId(),e);
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"jieshun verifyuser error.park:"+wxPark.getId()+".error"+e.getMessage());
} catch (UnsupportedEncodingException e) {
log.error("jieshun verifyuser error.park:"+wxPark.getId(),e);
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR.getCode(),"jieshun verifyuser error.park:"+wxPark.getId()+".error"+e.getMessage());
}
}
/**
* 查询门店打折方案
*/
public String querySalePlan(WxPark wxPark,String token,String userId) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("userId", userId);//商户编号
Map map = generateMap("3c.discount.querysaleplan",param);
log.info("jieshun querySalePlan :" + JSON.toJSONString(map));
return ProcBussiness(QUERY_PLAN, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/**
* 使用打折方案
*/
public String executediscount(WxPark wxPark,String planId,String userId,String carNumber,String token) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("planId", planId);//商户编号
param.put("userId", userId);//优惠券编号
param.put("carOrCardNo", handleCarNumber(carNumber));//优惠券编号
Map map = generateMap("3c.discount.executediscount",param);
log.info("jieshun executediscount :" + JSON.toJSONString(map));
return ProcBussiness(PLAN_EXECUTE, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/**
* 获取优惠券
**/
public String getCoupon(WxPark wxPark,String planNo,String phone,String token){
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("businesserCode", vp.get("businesserCode"));//商户编号
param.put("planNo", planNo);//优惠券编号
param.put("tel", phone);//商户编号
Map map = generateMap("3c.coupons.receive.coupons",param);
log.info("jieshun getCoupon :" + JSON.toJSONString(map));
return ProcBussiness(GET_COUPON, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/**
* 使用优惠券
**/
public String useCoupon(WxPark wxPark,String couponNo,String orderNo,String token){
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("businesserCode", vp.get("businesserCode"));//商户编号
param.put("couponsNo", couponNo);//优惠券编号
param.put("orderNo", orderNo);//商户编号
param.put("parkCode", wxPark.getParkingId());
Map map = generateMap("3c.coupons.use.coupons",param);
log.info("jieshun useCoupon :" + JSON.toJSONString(map));
return ProcBussiness(COUPON_USE, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
/*token认证登陆**/
private static String ProcLogin(String cid,String user,String password) {
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);
}
/**
* 优惠券使用完毕,0元停车费需调用次接口结清订单
* @param wxPark
* @param planId
* @param userId
* @param carNumber
* @param token
* @return
*/
public String notifyOrderResult(WxPark wxPark,String orderNo,String token) {
String vendroParams = wxPark.getVendorParams();
JSONObject vp = JSON.parseObject(vendroParams);
Map param = new HashMap();
param.put("orderNo", orderNo);//商户编号
param.put("tradeStatus", 0);//优惠券编号
param.put("isCallBack", 0);//优惠券编号
Map map = generateMap("3c.pay.notifyorderresult",param);
log.info("jieshun notifyOrderResult :" + JSON.toJSONString(map));
return ProcBussiness(PLAN_EXECUTE, wxPark.getParkId(), map, token,vp.getString("version"),vp.getString("signkey"));
}
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+signKey).getBytes("UTF-8"));
String sn = toHexString(md5Data);
if (url.contains("?")) {
url = url + "&";
}else {
url = url + "?";
}
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) {
log.error("jieshun request error.",e);
}
return null;
}
private static String toHexString(byte[] bytes) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
buffer.append(String.format("%02X", bytes[i]));
}
return buffer.toString();
}
private static String Proc(String url, List<NameValuePair> pairs) {
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 != pairs) {
HttpEntity en;
try {
en = new UrlEncodedFormEntity(pairs, HTTP.UTF_8);
httpPost.setEntity(en);
} catch (UnsupportedEncodingException e) {
log.error(e.getLocalizedMessage(),e);
return null;
}
}

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(),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;
}
}

+ 0
- 98
suimangService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnParkService.java 查看文件

@@ -1,98 +0,0 @@
package com.iformall.service.park.impl.shangan;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
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.enums.EnumCouponUnit;
import com.iformall.service.WxCouponOrderService;
import com.iformall.service.WxCouponService;
import com.iformall.service.park.ParkAdapterService;
import com.iformall.service.park.impl.BaseParkService;

@Service
public class ShangAnParkService extends BaseParkService implements ParkAdapterService{

private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
WxCouponOrderService wxCouponOrderService;
@Override
public ResultData parkInitConfig(WxPark park) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String initLogin(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return member.getId().toString();
}

@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
}

@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) {
return new ResultData();
}

@Override
public ResultData useCoupon(Map<String, String> paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) {
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString(ShangAnUtil.SHANGAN_URL);
String key = objParams.getString(ShangAnUtil.SHANGAN_KEY);
String parkNumber = objParams.getString(ShangAnUtil.SHANGAN_PARK_NUMBER);

String couponModelId = coupon.getUnit().toString();
String position = "";
if (coupon.getUnit().equals(EnumCouponUnit.MONEY.getCode())) {
position = coupon.getPrice().toString();
} else {
position = String.valueOf(coupon.getPrice()* 60);
}

String ret = ShangAnUtil.couponSend(url, key, parkNumber, couponModelId, userCar.getExpiredTime(), carNumber, position);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getString(ShangAnUtil.SHANGAN_STATUS).equalsIgnoreCase(ShangAnUtil.SHANGAN_SUCCESS)) {
// 停车券-核销
try {
wxCouponOrderService.shangAnVerify(userCar.getId(),park);
} catch (Exception e) {
logger.error(e.getMessage());
}
return new ResultData();
} else {
return new ResultData(ErrorCode.SHANGAN_COUPON_FAIL.getCode(), retObj.getString(ShangAnUtil.SHANGAN_ERROR_CODE));
}
}

@Override
public ResultData getParkStatus(WxPark park) {
return null;
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}
}

+ 0
- 186
suimangService/src/main/java/com/iformall/service/park/impl/shangan/ShangAnUtil.java 查看文件

@@ -1,186 +0,0 @@
package com.iformall.service.park.impl.shangan;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.exception.MallinkException;
import com.iformall.utils.DateUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
* 尚安停车
*/
public class ShangAnUtil {
private final static Logger logger = LoggerFactory.getLogger(ShangAnUtil.class);

public static final String SHANGAN_URL = "url";
public static final String SHANGAN_KEY = "key";
public static final String SHANGAN_PARK_NUMBER = "parkNumber";

public static final String KEY = "NzMFFDDJDIFACACCM2zAezDz";

public static final String PARK_NUMBER = "p190829183435";

public static final String URL = "http://www.p-share.com/shangan-yhq/web/api/outcoupon";

public static final String SHANGAN_STATUS = "status";
public static final String SHANGAN_SUCCESS = "success";
public static final String SHANGAN_FAIL = "fail";
public static final String SHANGAN_ERROR_CODE = "errorCode";


public static final SimpleDateFormat dateInFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


public static void main(String[] args) throws Exception {
String carNumber = "京XAZMF1";
Date myDate = DateUtils.getHourTimeAfter(1, new Date());

String result = couponSend(URL, KEY, PARK_NUMBER, "1", myDate, carNumber, "1500");

JSONObject obj = JSON.parseObject(result);
}

/**
* md5算法
* @param data
* @return
* @throws NoSuchAlgorithmException
*/

public static String md5(String data) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(data.getBytes());
StringBuilder buf = new StringBuilder();
byte[] bits = md.digest();
for(int i=0;i<bits.length;i++){
int a = bits[i];
if(a<0) a+=256;
if(a<16) buf.append("0");
buf.append(Integer.toHexString(a));
}
return buf.toString();
}

/**
* 签名
* @param key
* @param parkNumber
* @return
* @throws NoSuchAlgorithmException
*/
public static String getSign(String key, String parkNumber) throws NoSuchAlgorithmException {
String signValue = md5(key + parkNumber).toUpperCase();
logger.debug("sign: " + signValue);
return signValue;
}

public static boolean checkRespFailed(String resp) {
if(resp.startsWith("<html>") || resp.startsWith("<!DOCTYPE html>")) {
return true;
}
return false;
}

public static String couponSend(String url, String key, String parkNumber, String couponModelId, Date expireTime, String plate, String position) {
Map<String, String> params = new HashMap<>();
params.put("parkNum", parkNumber);
params.put("couponModeId", couponModelId);
params.put("endTime", dateInFormat.format(expireTime));
params.put("plate", plate);
params.put("position", position);
try {
String result = Proc(url, key, parkNumber, params);
if(result == null) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
if(checkRespFailed(result)) {
throw new MallinkException(ErrorCode.CAR_CMD_FAIL);
}
return result;
} catch (Exception e) {
return null;
}
}

private static String Proc(String url, String key, String parkNumber, Map<String, String> paramMap) {
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");

String sign = null;
try{
sign = getSign(key, parkNumber);
httpPost.addHeader("sign", sign);
}catch(NoSuchAlgorithmException e) {
logger.error(e.getLocalizedMessage());
}

String jsonstr = JSON.toJSONString(paramMap);
logger.info(jsonstr);

try {
StringEntity se = new StringEntity(jsonstr, Consts.UTF_8);
se.setContentType("application/json");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
httpPost.setEntity(se);
} catch (Exception e) {
logger.error(e.getMessage());
}

HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

String result = null;

//打印StatusLine
logger.debug("StatusLine: " + response.getStatusLine());
try{
//获取实体
HttpEntity httpEntity= response.getEntity();
result = EntityUtils.toString(httpEntity, "UTF-8");
logger.debug(result);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

try { //关闭流并释放资源
httpClient.close();
} catch (IOException e) {
logger.error(e.getLocalizedMessage());
}

return result;
}




}


+ 0
- 262
suimangService/src/main/java/com/iformall/service/park/impl/tjd/TJDParkService.java 查看文件

@@ -1,262 +0,0 @@
package com.iformall.service.park.impl.tjd;

import java.util.Date;
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.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import com.alibaba.fastjson.JSON;
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.WxCUserCar;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxPark;
import com.iformall.domain.vo.WxCouponOrderCarCVo;
import com.iformall.enums.EnumAssignTagsTrigger;
import com.iformall.enums.EnumCarVendor;
import com.iformall.enums.EnumCouponUnit;
import com.iformall.enums.EnumScoreType;
import com.iformall.enums.EnumTJDCode;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserCarService;
import com.iformall.service.WxCUserTagsService;
import com.iformall.service.WxCouponService;
import com.iformall.service.WxScoreRulesService;
import com.iformall.service.park.ParkAdapterService;
import com.iformall.service.park.impl.BaseParkService;
import com.iformall.service.park.impl.util.ParkHelper;

@Service
public class TJDParkService extends BaseParkService implements ParkAdapterService {

private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
ParkHelper parkHelper;
TJDUtil tjd = new TJDUtil();
@Autowired
WxCUserCarService wxCUserCarService;
@Autowired
WxScoreRulesService wxScoreRulesService;
@Autowired
WxCUserTagsService wxCUserTagsService;
@Autowired
WxCouponService couponService;
@Override
public ResultData parkInitConfig(WxPark park) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String initLogin(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return null;
}
@Override
public String bindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
return tjdBindCar(paramMap,park,member.getId());
}

private String tjdBindCar(Map<String, String> paramMap, WxPark park, Long cuUserId) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
//return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String carNumColor = paramMap.get("carNumColor");
//if (StringUtils.isBlank(carNumColor)) {
// logger.error("carNumColor为空");
// return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumColor为空");
//}
Long newCarId = 0L;
String outCarId = paramMap.get("outCarId");
if (StringUtils.isBlank(outCarId)) {
logger.warn("outCarId为空");
newCarId = wxCUserCarService.getNewCarID();
outCarId = String.valueOf(newCarId);
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString("url");
String partner = objParams.getString("partner");
String key = objParams.getString("key");
String version = objParams.getString("version");
String ret = tjd.registerCar(url, partner, key, version,
carNumber, carNumColor, null, outCarId);
JSONObject retObj = JSON.parseObject(ret);
retObj.put("vendor", park.getVendorType());
if (retObj.getString("returnCode").equalsIgnoreCase(EnumTJDCode.SUCCESS.getMessage())) {
return String.valueOf(newCarId);
}else {
throw new MallinkException(ErrorCode.CAR_BIND_FAIL.getCode(), "绑车牌失败");
}
// if (retObj.getString("returnCode").equalsIgnoreCase(EnumTJDCode.SUCCESS.getMessage())) {
// ResultData e = tjdInsertToDB(carNumber, newCarId, retObj, park, cuUserId);
// if (e != null) return e;
// return new ResultData(retObj);
// } else {
// return new ResultData(ErrorCode.CAR_BIND_FAIL.getCode(), "绑车牌失败", retObj);
// }
}


// private ResultData tjdInsertToDB(String carNumber, Long newCarId, JSONObject retObj, WxPark park, Long cuUserId) {
// String carId = retObj.getString("carId");
// // 插入车牌
// Date curr = new Date();
// WxCUserCar userCar = new WxCUserCar();
// userCar.setId(newCarId);
// userCar.setCUserId(cuUserId);
// userCar.updateTenantInfo(park);
// userCar.setCarNumber(carNumber);
// userCar.setVendorType(EnumCarVendor.CAR_TJD.getCode());
// JSONObject jo = new JSONObject();
// jo.put("carId", carId);
// userCar.setVendorParams(JSON.toJSONString(jo));
// userCar.setCreateDate(curr);
// userCar.setUpdateDate(curr);
// try {
// wxCUserCarService.save(userCar);
// wxScoreRulesService.addScore(userCar,EnumScoreType.BIND_CAR, userCar);
// //增加积分
// parkHelper.addCredit(park, cuUserId);
// } catch (Exception e) {
// logger.error(e.getMessage());
// return new ResultData(ErrorCode.DB_FAIL.getCode(), "TJD保存车牌失败, e:" + e.getMessage());
// }
//
// wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_CAR, cuUserId);
// return new ResultData();
// }


@Override
public void unbindCar(Map<String, String> paramMap, WxPark park, WxCUserBasicInfo member) {
tjdUnbindCar(paramMap,park,member.getId());
}
private ResultData tjdUnbindCar(Map<String, String> paramMap, WxPark park, Long userId) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
WxCUserCar queryOne = new WxCUserCar();
queryOne.setCarNumber(carNumber);
queryOne.updateTenantInfo(park);
queryOne.setCUserId(userId);
WxCUserCar userCar = wxCUserCarService.getOne(queryOne);
if (userCar != null) {
String params = userCar.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String carId = objParams.getString("carId");

params = park.getVendorParams();
String url = objParams.getString("url");
String partner = objParams.getString("partner");
String key = objParams.getString("key");
String version = objParams.getString("version");
String ret = tjd.writeOffCar(url, partner, key, version, carId);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getString("returnCode").equalsIgnoreCase(EnumTJDCode.SUCCESS.getMessage())) {
// try {
// wxCUserCarService.deleteByObj(userCar);
// } catch (Exception e) {
// logger.error("解绑车牌数据库错误, e:" + e.getMessage());
// return new ResultData(ErrorCode.DB_FAIL.getCode(), "解绑车牌数据库错误, e:" + e.getMessage());
// }

return new ResultData();
} else {
return new ResultData(ErrorCode.CAR_UNBIND_FAIL, "解绑车牌失败");
}
}
return new ResultData();
}


@Override
public ResultData carStopFee(Map<String, String> paramMap, WxPark park) {
return tjdCarStopFee(paramMap, park);
}
private ResultData tjdCarStopFee(@RequestBody Map<String, String> paramMap, WxPark park) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString(TJDUtil.TJD_URL);
String partner = objParams.getString(TJDUtil.TJD_ACCOUNT);
String key = objParams.getString(TJDUtil.TJD_ACCOUNT_KEY);
String version = objParams.getString(TJDUtil.TJD_VERSION);
String ret = tjd.infoForFreeMins(url, partner, key, version, carNumber);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getString(TJDUtil.TJD_RETURN_CODE).equalsIgnoreCase(EnumTJDCode.SUCCESS.getMessage())) {
return new ResultData(retObj);
} else {
return new ResultData(ErrorCode.TJD_STOP_FEE_FAIL.getCode(), "停车费获取失败");
}
}


@Override
public ResultData useCoupon(Map<String, String> paramMap, WxPark park, WxCouponOrderCarCVo userCar,WxCoupon coupon,String carNumber) {
String tradeId = paramMap.get("tradeId");
String accountId = paramMap.get("accountId");
if (StringUtils.isBlank(tradeId)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "tradeId为空");
}
if (StringUtils.isBlank(accountId)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "accountId为空");
}
String params = park.getVendorParams();
JSONObject objParams = JSON.parseObject(params);
String url = objParams.getString(TJDUtil.TJD_URL);
String partner = objParams.getString(TJDUtil.TJD_ACCOUNT);
String key = objParams.getString(TJDUtil.TJD_ACCOUNT_KEY);
String version = objParams.getString(TJDUtil.TJD_VERSION);

String amount = "";
if (coupon.getUnit().equals(EnumCouponUnit.MONEY.getCode())) {
amount = coupon.getPriceStr();
} else {
amount = String.valueOf(coupon.getPrice()* 60);
}

String ret = tjd.deductionForDetail(url, partner, key, version,
tradeId, accountId, String.valueOf(userCar.getId()),
coupon.getUnit().toString(), amount);
JSONObject retObj = JSON.parseObject(ret);
if (retObj.getString(TJDUtil.TJD_RETURN_CODE).equalsIgnoreCase(EnumTJDCode.SUCCESS.getMessage())) {
return new ResultData();
} else {
return new ResultData(ErrorCode.CAR_DEDUCE_FEE_FAIL.getCode(), "停车费抵扣失败");
}
}

@Override
public ResultData getParkStatus(WxPark park) {
return null;
}

@Override
public boolean ignoreUseCouponCache() {
return false;
}
}

+ 0
- 687
suimangService/src/main/java/com/iformall/service/park/impl/tjd/TJDUtil.java 查看文件

@@ -1,687 +0,0 @@
package com.iformall.service.park.impl.tjd;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.enums.EnumCouponUnit;
import com.iformall.utils.MapUtil;
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.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.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
* 停简单 停车管理
*/
@Component
public class TJDUtil {

public static final String TJD_URL = "url";
public static final String TJD_ACCOUNT = "partner";
public static final String TJD_ACCOUNT_KEY = "key";
public static final String TJD_VERSION = "version";

public static final String TJD_CHARSET = "charset";
public static final String TJD_UTF_8 = "utf-8";

public static final String TJD_RETURN_CODE = "returnCode";
public static final String TJD_RETURN_SUCC = "T";
public static final String TJD_RETURN_FAIL = "F";

public static final String TJD_IS_SUC = "isSuccess";
public static final String TJD_ERR_MSG = "errorMSG";
public static final String TJD_SUC = "0";
public static final String TJD_ERR_1 = "1"; // 业务级失败(不进行重发)
public static final String TJD_ERR_2 = "2"; // 系统级失败(有重发机制)
public static final String TJD_PARK_ID = "parkId";
public static final String TJD_PARK_NAME = "parkName";
public static final String TJD_CAR_NUMBER = "carNum";
public static final String TJD_TRADE_ID = "tradeId";
public static final String TJD_IN_DT = "inDt";
public static final String TJD_OUT_DT = "outDt";
public static final String TJD_PARK_AMT = "parkAmount";
public static final String TJD_PAY_AMT = "payAmount";
public static final String TJD_PAY_DT = "payDt";
public static final String TJD_FREE_MINS = "freeMins";
public static final String TJD_ACCOUNT_ID = "accountId";
public static final String TJD_PREPAY_TYPE = "prePayType";
public static final String TJD_PREPAY_TYPE_3 = "3"; // 三方合作方支付
public static final String TJD_PREPAY_TYPE_20 = "20"; // 手机场内支付
public static final String TJD_DETAIL_LIST = "detailList";
public static final String TJD_OUT_TRADE_NO = "outTradeNo";
public static final String TJD_TYPE = "type";
public static final String TJD_TYPE_DISCOUNT = "0";
public static final String TJD_TYPE_COUPON = "1";
public static final String TJD_COUPON_TYPE = "couponType";
public static final String TJD_CHANNEL = "channel";
public static final String TJD_AMOUNT = "amount";
public static final String TJD_MINUTES = "minutes";
public static final String TJD_CREDIT = "integral";
public static final String TJD_MEMO = "memo";

public static final SimpleDateFormat dateInFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat dateOutFormat = new SimpleDateFormat("yyyyMMddHHmmss");


private final static Logger logger = LoggerFactory.getLogger(TJDUtil.class);

private static String baseurl = "http://prep.tingjiandan.com/openapi/gateway";

private static String partner = "fb21a5b2f7064ff5afb8288d5bb48ca8";
private static String key = "bc2f09be8f5b4227898346cf6fe451c2";
private static String version = "1.0";

//
// {"url":"http://prep.tingjiandan.com/openapi/gateway","partnerId":"fb21a5b2f7064ff5afb8288d5bb48ca8","key":"bc2f09be8f5b4227898346cf6fe451c2","parkId":"7715622dff834b34a44448b801c27607", "version":"1.0.0"}
//

public static void main(String[] args) throws Exception {
String carNumber = "京XAZMF1";

String result = infoForFreeMins(baseurl, partner, key, version, carNumber);

JSONObject obj = JSON.parseObject(result);
/*

Map<String, String> paramMap1 = MapUtil.getOrderMap();
paramMap1.put("tradeId", obj.getString("tradeId"));
paramMap1.put("deductionAmount", obj.getString("totalAmount"));
paramMap1.put("outTradeNo", "utf-8");
paramMap1.put("accountId", obj.getString("accountId"));
paramMap1.put(TJD_CHARSET, "utf-8");
paramMap1.put(TJD_ACCOUNT, partner);
paramMap1.put(TJD_VERSION, version);

deductionNotSettle(baseurl, key, paramMap1);
*/
}

/**
* md5算法
* @param data
* @return
* @throws NoSuchAlgorithmException
*/

public static String md5(String data) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(data.getBytes());
StringBuilder buf = new StringBuilder();
byte[] bits = md.digest();
for(int i=0;i<bits.length;i++){
int a = bits[i];
if(a<0) a+=256;
if(a<16) buf.append("0");
buf.append(Integer.toHexString(a));
}
return buf.toString();
}

/**
* getCurrentDate 获取当前时间
*/
public static String getCurrentDate() {
Date currentDate = new Date();
String timestamp = dateInFormat.format(currentDate);
return timestamp;
}

/**
* 签名
* @param map
* @param keysign
* @return
* @throws NoSuchAlgorithmException
*/
public static String getSign(Map<String,String> map, String keysign) throws NoSuchAlgorithmException {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getValue() != null || entry.getValue() != "") {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
if(StringUtils.isNotBlank(sb)){
sb.deleteCharAt(sb.length()-1);// ?
}
sb.append(keysign);
logger.debug("签名前的字符串输出:"+sb.toString());
String signValue = md5(sb.toString()).toUpperCase();
logger.debug("sign: " + signValue);
return signValue;
}

/**
* 注册车牌
* @param url
* @param partner
* @param key // 密钥
* @param version
*
* {
* "carNum": "京A45781",
* "carNumColor": "blue",
* "phone": "15210501514",
* "outCarId": "45454545454",
* "partner": "5836b8b52ada463ebc6199579f029566",
* "timestamp": "2016-05-26 11:30:10",
* "version": "1.0"
* }
* @throws Exception
*/
public static String registerCar(String url, String partner, String key, String version,
String carNum, String carNumColor, String phone, String outCarId) {
String service = "parkhub.car.register";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put(TJD_CAR_NUMBER, carNum);
paramMap.put("carNumColor", carNumColor);
if (phone != null) {
paramMap.put("phone", phone);
}
if (outCarId != null) {
paramMap.put("outCardId", outCarId);
}
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);

/*
{
"timestamp": "1464235239561",
"returnCode": "T",
"errorMsg": "",
"returnMsg": "OK",
"isSuccess": "0",
"carId": "5836b8b52ada463ebc6199579f029561"
}*/
return result;
}

/**
* 注销车牌
* @param url
* @param partner
* @param key // 密钥
* @param version
*
* {
* "service": "parkhub.car.writeOff",
* "version":"1.0",
* "sign":"3347b109a1e44f3fd5baa78b74a84948",
* "partner":"5836b8b52ada463ebc6199579f029566",
* "carId":"3347b109a1e44f3fd5baa78b74a84948",
* "timestamp":"2016-05-26 11:30:10",
* "charset":"utf-8",
* "signType":"md5"
* }
* @throws Exception
*/
public static String writeOffCar(String url, String partner, String key, String version,
String carId) {
String service = "parkhub.car.writeOff";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("carId", carId);
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);

/*
{
"timestamp": "1464235239561",
"returnCode": "T",
"errorMsg": "",
"returnMsg": "OK",
"isSuccess": "0",
}*/
return result;
}


/**
* 在场订单查询
* @param url
* @param partner
* @param key // 密钥
* @param version
*
* {
* "carNum": "京A45781",
* "freeMins": "0",
* "partner": "5836b8b52ada463ebc6199579f029566",
* "pmParkId": "5836b8b52ada463ebc6199579f029565",
* "timestamp": "2016-05-26 11:30:10",
* "tradeId": "5836b8b52ada463ebc6199579f029565",
* "version": "1.0"
* }
* @throws Exception
*/
public static String infoForFreeMins(String url, String partner, String key, String version, String carNum) {
String service = "parkhub.order.infoForFreeMins";

String freeMins = "0";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put(TJD_CAR_NUMBER, carNum);
//paramMap.put("carNumColor", "");
//paramMap.put("pmParkId", "");
paramMap.put(TJD_FREE_MINS, freeMins);
//paramMap.put("tradeId", "");
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);

/*
{
"wLon":"116.310335",
"returnCode":"T",
"lon":"116.316813",
"accountId":"818a6ac865e841119ec9aab21c5e5a24",
"freeThroughTime":"10",
"customerServicePhone":"400-001-0606",
"tradeId":"2ae003431584495081014428c90173ab",
"returnMsg":"OK",
"outDt":"20190920110443",
"isSuccess":"0",
"miniProgram":"{\"path\": \"pages/pre_pay/index/main\",\"extraData\": {\"prePayType\": \"16\",\"channel\": \"30166\",\"isShowDetail\": \"true\",\"partnerId\": \"956ca31ac8464cf7b6a876e8887912f3\",\"orderId\": \"2ae003431584495081014428c90173ab\"}}","pmParkId":"7715622dff834b34a44448b801c27607","unPayAmount":"88.12","timestamp":"1568948681580","errorMSG":"","parkTime":"81629","wLat":"39.93609","totalAmount":"88.12","paidAmount":"0.00","freeMinsAmount":"0.00","payUrl":"https://prep.tingjiandan.com/tcweixin/letter/prePay/pagePayInPark?prePayType=16&channel=30166&isShowDetail=true&partnerId=&orderId=2ae003431584495081014428c90173ab&returnUrl=",
"lat":"39.942078",
"inDt":"20190919122414"}
*/
return result;
}

//// TODO
/**
* deductionNotSettle 停车费批量抵扣接口
* @param url
* @param partner
* @param key // 密钥
* @param version
* type 可选值:0=抵扣、1=优惠券
* couponType type=1时必填,可选值:0=金额、1=时长、2=全免、3=时间区间
* channel 可选值: type=0时:5013=微信、5014=支付宝、5015=抵扣其他
* type=1时:2202=会员等级、2203=会员积分、2204=会员卡券、2205=会员补贴、2206=会员其他
* amount: type=0时、couponType=0必填,单位(元),保留小数点后两位,金额类型使用
* minutes: couponType=1时必填,单位(分钟),时长类型使用
* integral: 大于等于0的整数值,积分类型使用,如果使用了积分兑换,可填写积分值
* expireDt: type=1时选填,格式:yyyyMMddHHmmss,如果不填,则永不过期,若填写,则出场时间在此 时间之后,认为此记录已经过期,不再使用
* membershipGrade: 调用方系统会员等级标识,如:LV1、VIP2、金卡等,长度不超过64位
* identityType: identityId非空时,此值必填,可选值:01=手机号、02=会员卡号、03=车牌号、04=身份证号
* identityId: identityType非空时,此值必填,对应身份标识类型的唯一值,长度不超过100位
* {
"service": "parkhub.order.deductionForDetail",
"partner": "120a565de377427184de35ca0f320764",
"sign": "3347b109a1e44f3fd5baa78b74a84948",
"signType": "md5",
"charset": "utf-8",
"version": "1.0",
"timestamp": "2016-05-26 11:30:10",
"tradeId": "c39d3aac49d04e12a187681e6189f841",
"accountId": "a9b2963c98344bb292e0fa3f7dd70946",
"prePayType": "3",
"giveFreeTimeOut": "false",
"detailList":"[{
\"outTradeNo\":\"PLDKY01\",
\"identityType\":\"01\",
\"identityId\":\"17710111111\",
\"membershipGrade\":\"LV1\",
\"amount\":\"12.50\",
\"type\":\"0\",
\"channel\":\"5013\",
\"memo\":\"批量抵扣-金额-微信\"
},{
\"outTradeNo\":\"PLDKY02\",
\"identityType\":\"01\",
\"identityId\":\"17710111111\",
\"membershipGrade\":\"LV1\",
\"couponType\":\"1\",
\"minutes\":\"60\",
\"type\":\"1\",
\"channel\":\"2204\",
\"memo\":\"批量抵扣-时长-会员卡券\"
},{
\"outTradeNo\":\"PLDKY03\",
\"identityType\":\"01\",
\"identityId\":\"17710111111\",
\"membershipGrade\":\"LV1\",
\"couponType\":\"3\",
\"startDt\":\"20180901110000\",
\"endDt\":\"20180901170000\",
\"integral\":\"500\",
\"type\":\"1\",
\"channel\":\"2205\", \"memo\":\"批量抵扣-区间-积分-会员补贴\"
}]"
}
* @throws Exception
*/
public static String deductionForDetail(
String url, String partner, String key, String version,
String tradeId, String accountId,
String couponOrderId, String couponType, String reduceAmount) {
// 为指定订单抵扣停车费,如果此时车辆已经出场,返回isSuccess错误码为3,停简单系统不再接收此笔抵扣信息,对方系统 需要给用户发起退款。
String service = "parkhub.order.deductionForDetail";
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put(TJD_TRADE_ID, tradeId);
paramMap.put(TJD_ACCOUNT_ID, accountId);
paramMap.put(TJD_PREPAY_TYPE, TJD_PREPAY_TYPE_3);

JSONArray detailArr = new JSONArray();
JSONObject detailObj = new JSONObject();
detailObj.put(TJD_OUT_TRADE_NO, couponOrderId);
detailObj.put(TJD_TYPE, TJD_TYPE_COUPON);
detailObj.put(TJD_CHANNEL, "2204");
String memo = "会员优惠券";
detailObj.put(TJD_COUPON_TYPE, couponType);
if (couponType.equals(String.valueOf(EnumCouponUnit.MONEY.getCode()))) {
detailObj.put(TJD_AMOUNT, reduceAmount);
memo += "-金额";
} else {
detailObj.put(TJD_MINUTES, reduceAmount);
memo += "-时长";
}
detailObj.put(TJD_MEMO, memo);
detailArr.add(detailObj);
paramMap.put(TJD_DETAIL_LIST, JSON.toJSONString(detailArr));

paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);
/*
"{\"timestamp\":\"1528534986636\",
\"returnCode\":\"T\",
\"prePayId\":\"7a1d52aa77ca487db4e61130394285bd\",
\"errorMSG\":\"\",
\"returnMsg\":\"OK\",
\"isSuccess\":\"0\"}[\\r][\\n]"
*/
return result;
}

/**
* deductionNotSettle 停车费无结算抵扣
* @param url
* @param partner
* @param key // 密钥
* @param version
* {
"service": "",
"version":"1.0",
"sign":"3347b109a1e44f3fd5baa78b74a84948",
"partner":"5836b8b52ada463ebc6199579f029566",
"timestamp":"2016-05-26 11:30:10",
"charset":"utf-8",
"signType":"md5",
"tradeId": "224478781859452794f2a68a756fe461",
"deductionAmount": "0.1",
"outTradeNo":"4738473847834378",
"accountId":"3347b109a1e44f3fd5baa78b74a84941",
}
* @throws Exception
*/
public static String deductionNotSettle(String url, String partner, String key, String version,
String tradeId, String outTradeNo, String accountId, String deductionAmount) {
// TODO
// 为指定订单抵扣停车费,如果此时车辆已经出场,返回isSuccess错误码为3,
// 停简单系统不再接收此笔抵扣信息,对方系统需要给用户发起退款(后续业务中无结算)
String service = "parkhub.order.deductionNotSettle";
Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("deductionAmount", deductionAmount);
paramMap.put("outTradeNo", outTradeNo);
paramMap.put("accountId", accountId);
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);
/*
"{\"timestamp\":\"1528534986636\",
\"returnCode\":\"T\",
\"prePayId\":\"7a1d52aa77ca487db4e61130394285bd\",
\"errorMSG\":\"\",
\"returnMsg\":\"OK\",
\"isSuccess\":\"0\"}[\\r][\\n]"
*/
return result;
}

/**
* bindTime 绑定时长优惠券
* @param url
* @param partner //
* @param key // 密钥
* @param version // 1.0
*
* {
* "service": "parkhub.ticket.bindTime",
* "version":"1.0",
* "sign":"3347b109a1e44f3fd5baa78b74a84948",
* "partner":"5836b8b52ada463ebc6199579f029566",
* "timestamp":"2016-05-26 11:30:10",
* "charset":"utf-8",
* "signType":"md5",
* "tradeId": "224478781859452794f2a68a756fe461",
* "outTicketNo": "224478781859452794f2a68a756fe461",
* "accountId":"3347b109a1e44f3fd5baa78b74a84941",
* "prePayType": "3",
* "minutes": "30",
* "memo": "测试绑定时长优惠券"
* }
* @throws Exception
*/
public static String bindTime(String url, String partner, String key, String version,
String tradeId, String outTicketNo, String accountId, String prePayType, String minutes, String memo) throws Exception {
String service = "parkhub.ticket.bindTime";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("outTicketNo", outTicketNo);
paramMap.put("accountId", accountId);
paramMap.put("prePayType", prePayType);
paramMap.put("minutes", minutes);
paramMap.put("memo", memo);
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);
/*{
"timestamp": "1464247094636",
"returnCode": "T",
"errorMsg": "",
"returnMsg": "OK",
"isSuccess": "0",
"ticketId": "224478781859452794f2a68a756fe441"
}*/
return result;
}

/**
* 绑定区间优惠券
* @param url
* @param partner
* @param key // 密钥
* @param version
*
* {
* "service": "parkhub.ticket.bindPeriod",
* "version": "1.0",
* "sign": "3347b109a1e44f3fd5baa78b74a84948",
* "partner": "5836b8b52ada463ebc6199579f029566",
* "timestamp": "2016-05-26 11:30:10",
* "charset": "utf-8",
* "signType": "md5",
* "tradeId": "224478781859452794f2a68a756fe461",
* "outTicketNo": "224478781859452794f2a68a756fe461",
* "accountId": "3347b109a1e44f3fd5baa78b74a84941",
* "prePayType": "3",
* "startDt": "20160526113010",
* "endDt": "20160526123010",
* "expireDt": "20160527113010",
* "memo": "测试绑定时长优惠券"
* }
* @throws Exception
*/
public static String bindPeriod(String url, String partner, String key, String version,
String tradeId, String outTicketNo, String accountId, String prePayType,
String startDt, String EndDt, String expireDt, String memo) throws Exception {
String service = "parkhub.ticket.bindPeriod";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("outTicketNo", outTicketNo);
paramMap.put("accountId", accountId);
paramMap.put("prePayType", prePayType);
paramMap.put("startDt", startDt);
paramMap.put("EndDt", EndDt);
paramMap.put("expireDt", expireDt);
paramMap.put("memo", memo);
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);
/*{
"timestamp": "1464247094636",
"returnCode": "T",
"errorMsg": "",
"returnMsg": "OK",
"isSuccess": "0",
"ticketId": "224478781859452794f2a68a756fe441"
}*/
return result;
}

/**
* 绑定区间优惠券
* @param url
* @param partner // 密钥
* @param key // 密钥
* @param version
*
* {
* "service": "parkhub.ticket.unbind",
* "version": "1.0",
* "sign": "3347b109a1e44f3fd5baa78b74a84948",
* "partner": "5836b8b52ada463ebc6199579f029566",
* "timestamp": "2016-05-26 11:30:10",
* "charset": "utf-8",
* "signType": "md5",
* "tradeId ": "3347b109a1e44f3fd5baa78b74a84948",
* "ticketId": "224478781859452794f2a68a756fe461"
* }
* @throws Exception
*/
public static String unbind(String url, String partner, String key, String version,
String tradeId, String ticketid) throws Exception {
String service = "parkhub.ticket.unbind";

Map<String, String> paramMap = MapUtil.getOrderMap();
paramMap.put("tradeId", tradeId);
paramMap.put("ticketid", ticketid);
paramMap.put(TJD_CHARSET, TJD_UTF_8);
paramMap.put(TJD_ACCOUNT, partner);
paramMap.put(TJD_VERSION, version);

String result = Proc(url, key, service, paramMap);
/*{
"timestamp": "1464247094636",
"returnCode": "T",
"errorMsg": "",
"returnMsg": "OK",
"isSuccess": "0",
}*/
return result;
}

private static String Proc(String url, String key, String service, Map<String, String> paramMap) {
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");

String timestamp = getCurrentDate();
paramMap.put("timestamp", timestamp);

paramMap.put("service", service);

String sign = null;
try{
sign = getSign(paramMap, key);
}catch(NoSuchAlgorithmException e) {
logger.error(e.getLocalizedMessage());
}

paramMap.put("sign", sign);
paramMap.put("signType", "md5");

String jsonstr = JSON.toJSONString(paramMap);
logger.info(jsonstr);

try {
StringEntity se = new StringEntity(jsonstr, Consts.UTF_8);
se.setContentType("application/json");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
httpPost.setEntity(se);
} catch (Exception e) {
logger.error(e.getMessage());
}

HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

String result = null;

//打印StatusLine
logger.debug("StatusLine: " + response.getStatusLine());
try{
//获取实体
HttpEntity httpEntity= response.getEntity();
result = EntityUtils.toString(httpEntity, "UTF-8");
logger.debug(result);
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
}

try { //关闭流并释放资源
httpClient.close();
} catch (IOException e) {
logger.error(e.getLocalizedMessage());
}

return result;
}

}


+ 0
- 122
suimangService/src/main/java/com/iformall/service/park/impl/util/ParkHelper.java 查看文件

@@ -1,122 +0,0 @@
package com.iformall.service.park.impl.util;

import java.util.Date;
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.stereotype.Service;

import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserCar;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.domain.po.WxPark;
import com.iformall.enums.EnumAssignTagsTrigger;
import com.iformall.enums.EnumCarVendor;
import com.iformall.enums.EnumScoreType;
import com.iformall.enums.EnumUserType;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserCarService;
import com.iformall.service.WxCUserTagsService;
import com.iformall.service.WxCreditHistoryService;
import com.iformall.service.WxScoreRulesService;

@Service
public class ParkHelper {
private final Logger logger = LoggerFactory.getLogger(ParkHelper.class);
@Autowired
WxCUserCarService wxCUserCarService;
@Autowired
WxScoreRulesService wxScoreRulesService;
@Autowired
WxCUserTagsService wxCUserTagsService;
@Autowired
WxCreditHistoryService wxCreditHistoryService;
public WxCUserCar getOne(WxPark park, Long cuUserId,String carNumber,EnumCarVendor carVendor) {
WxCUserCar userCar = new WxCUserCar();
userCar.updateTenantInfo(park);
userCar.setCUserId(cuUserId);
userCar.setCarNumber(carNumber);
userCar.setVendorType(carVendor.getCode());
return wxCUserCarService.getOne(userCar);
}
public ResultData bindCar(Map<String, String> paramMap, WxPark park, Long cuUserId,String vendorPersonId) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
try {
addCarInfoToDB(carNumber, EnumCarVendor.getEnum(park.getVendorType()), park, cuUserId,vendorPersonId);
} catch (MallinkException e) {
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
return new ResultData(500, e.getMessage());
}
return new ResultData(vendorPersonId);
}
public void addCarInfoToDB(String carNumber, EnumCarVendor carVendor, WxPark park, Long cuUserId,String vendorPersonId) {
// 插入车牌
Date curr = new Date();
WxCUserCar userCar = new WxCUserCar();
userCar.setCUserId(cuUserId);
userCar.updateTenantInfo(park);
userCar.setCarNumber(carNumber);
userCar.setVendorType(carVendor.getCode());
userCar.setCreateDate(curr);
userCar.setUpdateDate(curr);
userCar.setVendorPersonId(vendorPersonId);
wxCUserCarService.saveOrUpdate(userCar);

// 成长值
wxScoreRulesService.addScore(userCar,EnumScoreType.BIND_CAR, userCar);
//增加积分
addCredit(park, cuUserId);
wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_CAR,userCar,park,null);
}
//-----增加积分start-----
public void addCredit(WxPark park, Long cuUserId){
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setCUserId(cuUserId);
// wxCreditHistory.updateTenantInfo(park);
wxCreditHistory.setTenantId(park.getFinalTenantId());
wxCreditHistory.setFinalTenantId(park.getFinalTenantId());
// wxCreditHistory.setCreateDate(new Date());
wxCreditHistory.setCreditType(EnumScoreType.BIND_CAR.getCode());
wxCreditHistory.setChangePurpose(EnumScoreType.BIND_CAR.getMessage());
wxCreditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode());
wxCreditHistory.setOperatorId(cuUserId);
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,park.getTenantId());
}
public ResultData unbindCar(Map<String, String> paramMap, WxPark park, Long cuUserId) {
String carNumber = paramMap.get("carNumber");
if (StringUtils.isBlank(carNumber)) {
logger.error("carNumber为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "carNumber为空");
}
try {
WxCUserCar userCar = new WxCUserCar();
userCar.updateTenantInfo(park);
userCar.setCUserId(cuUserId);
userCar.setCarNumber(carNumber);
wxCUserCarService.deleteByObj(userCar);
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.DB_FAIL.getCode(), "解绑车牌数据库错误, e:" + e.getMessage());
}

return new ResultData();
}
}

+ 0
- 29
suimangService/src/main/java/com/iformall/service/park/utils/ParkCacheUtils.java 查看文件

@@ -1,29 +0,0 @@
package com.iformall.service.park.utils;

import org.springframework.data.redis.core.RedisTemplate;

import com.iformall.utils.RedisCacheUtils;

public class ParkCacheUtils {

public static void removeCache(RedisTemplate<String, Object> template,String parkVendor,String carNumber) {
String key = "carStop:"+parkVendor+":"+carNumber;
RedisCacheUtils.removeCache(template, key);
}
public static void setCarCouponUnUseCacheLock(RedisTemplate<String, Object> template,String parkVendor,String carNumber) {
String key = "carStop:"+parkVendor+":"+carNumber;
RedisCacheUtils.cache(template, key, 0, 12*3600);
}
public static void setCarCouponUsedCacheLock(RedisTemplate<String, Object> template,String parkVendor,String carNumber) {
String key = "carStop:"+parkVendor+":"+carNumber;
RedisCacheUtils.cache(template, key, 1, 12*3600);
}
public static Integer getCarCouponUseCacheLock(RedisTemplate<String, Object> template,String parkVendor,String carNumber) {
String key = "carStop:"+parkVendor+":"+carNumber;
return RedisCacheUtils.getCacheInteger(template, key);
}
}

+ 50
- 0
suimangService/src/main/java/com/iformall/utils/MaUtil.java 查看文件

@@ -3,10 +3,13 @@ package com.iformall.utils;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
@@ -31,6 +34,7 @@ import com.iformall.douyin.web.enums.TtWebApiBeginEnum;
import com.iformall.exception.MallinkException;
import com.iformall.mapper.WxAppinfoMapper;
import com.iformall.service.WxAppinfoService;
import com.iformall.service.pay.service.pay.entity.PayAdapterResult;
import lombok.extern.flogger.Flogger;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
@@ -331,4 +335,50 @@ public class MaUtil {
}
return alipayClient;
}

public static void main(String[] args) {
AlipayConfig alipayConfig = new AlipayConfig();

alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId("2021004122675328");
alipayConfig.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCjYOqonp3RZMFCdh+rEdVKzVzEjk1ACXguNX2p6V1wN39hrkU1zR57PKKjU227p5jRy3MzeRupvvvt7aOLZM/9nDWh0OvqU3KBIRfKY1F46vqHE+GM06FWvhCDCSnSz98cCZN5GAWGDuV7zKQC6LekahiQH2HOEK+wJEkU9a/Y1RlZX3kmuCADhkywpLk4iUvQDP9QCgei9Vu4wHibGJZhJtbOgvap3k6nWrogAHZeuJ0O9HU3aizpcJFPn+OffA7U6zaBkP268AzclI1EgkH2lnosRJieLdcRskRB5AI5h8HF+SEzDwtytDwh1y7KBziR1j7H+oScDLcfhnvQwnw9AgMBAAECggEAHmQl4o3273+dj55nj6v2");
alipayConfig.setFormat("json");
alipayConfig.setCharset("UTF-8");
alipayConfig.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxdq6ugtmAv1jGX/bMbxPQRgc5Muz8uzfr5d77yV7Z760NZcETVFZXfX3FMN/DwF/9sL4UZEx5Bd8yg46R8kgVFPKmfJf6kK7I/Cw9DtniZ9X+KSJzZerzkvttFgrKOGb5AhHupswrWmYgSopuPeYixUetuutCT6hFOx9rv9U9xS+eRoSW1JIGxioTXJ+tVS6fXh5lJVrC+Lj+5TMVZIu/WXrY6Ph+IgHMMVtwj7laiuVuefjVl9TbdPH7PRkAmdFcWcNDqPyBRsy5eLhC1LRPkOm2W5ydqVQ9yTI4rMq8wuAueX3Rcpgh/b+xZgJYv+Zlpb9/37TQHVDi5YnOlLlNQIDAQAB");
alipayConfig.setSignType("RSA2");

try {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//异步接收地址,仅支持http/https,公网可访问
request.setNotifyUrl("https://mtest.metavatar.cc/C/payCallBack/aliNotify");
//同步跳转地址,仅支持http/https
// request.setReturnUrl("");
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", "test00000000000001");
//支付金额,最小值0.01元
bizContent.put("total_amount", "0.01");
//订单标题,不可使用特殊符号
bizContent.put("subject", "test");
//电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");

bizContent.put("qr_pay_mode",1);

String after15 = DateUtils.date2String(DateUtils.getSecondsTimeAfter(15 * 60, new Date()));

bizContent.put("time_expire", after15);

request.setBizContent(bizContent.toString());

AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
System.out.println(response.toString());

} catch (AlipayApiException e) {
e.printStackTrace();
}

}
}

Loading…
取消
儲存