Просмотр исходного кода

[停车][升级]:停车厂商泊链停车费获取支持

release_toaliyun_real
Stormeye Wu 6 лет назад
Родитель
Сommit
3764ba7efb
4 измененных файлов: 228 добавлений и 5 удалений
  1. +24
    -4
      mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java
  2. +3
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  3. +2
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java
  4. +199
    -0
      mallinkService/src/main/java/com/iformall/utils/car/BoLinkUtil.java

+ 24
- 4
mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java Просмотреть файл

@@ -14,10 +14,7 @@ import com.iformall.domain.vo.WxMerchantVo;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
import com.iformall.service.*;
import com.iformall.utils.car.DaHuaUtil;
import com.iformall.utils.car.ETCPUtil;
import com.iformall.utils.car.ShangAnUtil;
import com.iformall.utils.car.TJDUtil;
import com.iformall.utils.car.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -598,6 +595,8 @@ public class WxCarController extends BaseController {
return tjdCarStopFee(paramMap, park);
} else if (park.getVendorType().equals(EnumCarVendor.CAR_DAHUA.getCode())) {
return dahuaCarStopFee(paramMap, park);
} else if (park.getVendorType().equals(EnumCarVendor.CAR_BOLINK.getCode())) {
return bolinkCarStopFee(paramMap, park);
}
return new ResultData(ErrorCode.CAR_VENDOR_NOT_SUPPORT.getCode(), "停车费获取失败");
}
@@ -696,6 +695,27 @@ public class WxCarController extends BaseController {
return businessId;
}

private ResultData bolinkCarStopFee(@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(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);
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);
}
}

/**
* 优免券领取
* 优免券不可退


+ 3
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java Просмотреть файл

@@ -158,6 +158,9 @@ public enum ErrorCode{

SHANGAN_COUPON_FAIL(2070, "优惠券失败"),

BOLINK_SIGN_ERR(2071, "泊链签名错误"),
BOLINK_STOP_FEE_FAIL(2072, "泊链停车费获取失败"),


/**
* 游戏


+ 2
- 1
mallinkService/src/main/java/com/iformall/enums/EnumCarVendor.java Просмотреть файл

@@ -5,12 +5,13 @@ package com.iformall.enums;
*/
public enum EnumCarVendor {

// 1-ETCP, 2-TJD
// 1-ETCP, 2-TJD停简单 3-Dahua大华, 4-ShangAn尚安, 5-BoLink泊链
CAR_NOTFOUND(0, "无"),
CAR_ETCP(1, "ETCP"),
CAR_TJD(2, "TJD"),
CAR_DAHUA(3, "DAHUA"),
CAR_SHANGAN(4, "ShangAn"),
CAR_BOLINK(5, "BoLink"),
;

public static EnumCarVendor getEnum(Integer code) {


+ 199
- 0
mallinkService/src/main/java/com/iformall/utils/car/BoLinkUtil.java Просмотреть файл

@@ -0,0 +1,199 @@
package com.iformall.utils.car;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
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.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 URL = "https://yun.bolink.club/zld/queryorderprice";
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());
StringBuffer buf = new StringBuffer();
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);
String signValue = md5(sb.toString()).toUpperCase();
logger.debug("sign: " + signValue);
return signValue;
}

public static String getStopFee(String url, String comid, String unionId, String key, String carNumber) {
Map<String, String> 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);
return result;
} catch (Exception e) {
return null;
}
}

private static String Proc(String url, String key, Map<String, String> 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());
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");
JSONObject dataObj = resultObj.getJSONObject("data");
try {
String dataSign = getSign(key, JSON.toJSONString(dataObj));
if (!dataSign.equals(resSign)) {
logger.error("data sign: " + dataSign);
throw new MallinkException(ErrorCode.BOLINK_SIGN_ERR);
}
} catch (Exception e) {
logger.error(e.getMessage());
}
*/

return result;
}




}


Загрузка…
Отмена
Сохранить