You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

534 lines
18 KiB

  1. package com.simple.utils;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import org.apache.http.Consts;
  5. import org.apache.http.HttpEntity;
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.client.methods.HttpPost;
  8. import org.apache.http.entity.StringEntity;
  9. import org.apache.http.impl.client.CloseableHttpClient;
  10. import org.apache.http.impl.client.HttpClients;
  11. import org.apache.http.message.BasicHeader;
  12. import org.apache.http.protocol.HTTP;
  13. import org.apache.http.util.EntityUtils;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.stereotype.Component;
  17. import java.io.IOException;
  18. import java.security.MessageDigest;
  19. import java.security.NoSuchAlgorithmException;
  20. import java.text.SimpleDateFormat;
  21. import java.util.Comparator;
  22. import java.util.Date;
  23. import java.util.Map;
  24. import java.util.TreeMap;
  25. /**
  26. * 停简单 停车管理
  27. */
  28. @Component
  29. public class TJDCarUtil {
  30. private final static Logger logger = LoggerFactory.getLogger(TJDCarUtil.class);
  31. private static String baseurl = "http://prep.tingjiandan.com/openapi/gateway";
  32. private static String partner = "7dbc8ec9037d403b822cb60addfdc681";
  33. private static String key = "f356cb1bf5a74fb7a564e86128d2c49f";
  34. private static String version = "1.0";
  35. public static void main(String[] args) throws Exception {
  36. String carNumber = "京HLTT01";
  37. String result = infoForFreeMins(baseurl, partner, key, version, carNumber);
  38. JSONObject obj = JSON.parseObject(result);
  39. /*
  40. Map<String, String> paramMap1 = MapUtil.getOrderMap();
  41. paramMap1.put("tradeId", obj.getString("tradeId"));
  42. paramMap1.put("deductionAmount", obj.getString("totalAmount"));
  43. paramMap1.put("outTradeNo", "utf-8");
  44. paramMap1.put("accountId", obj.getString("accountId"));
  45. paramMap1.put("charset", "utf-8");
  46. paramMap1.put("partner", partner);
  47. paramMap1.put("version", version);
  48. deductionNotSettle(baseurl, key, paramMap1);
  49. */
  50. }
  51. /**
  52. * md5算法
  53. * @param data
  54. * @return
  55. * @throws NoSuchAlgorithmException
  56. */
  57. public static String md5(String data) throws NoSuchAlgorithmException {
  58. MessageDigest md = MessageDigest.getInstance("MD5");
  59. md.update(data.getBytes());
  60. StringBuffer buf = new StringBuffer();
  61. byte[] bits = md.digest();
  62. for(int i=0;i<bits.length;i++){
  63. int a = bits[i];
  64. if(a<0) a+=256;
  65. if(a<16) buf.append("0");
  66. buf.append(Integer.toHexString(a));
  67. }
  68. return buf.toString();
  69. }
  70. /**
  71. * getCurrentDate 获取当前时间
  72. */
  73. public static String getCurrentDate() {
  74. Date currentDate = new Date();
  75. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  76. String timestamp = sdf.format(currentDate);
  77. return timestamp;
  78. }
  79. /**
  80. * 签名
  81. * @param map
  82. * @param keysign
  83. * @return
  84. * @throws NoSuchAlgorithmException
  85. */
  86. public static String getSign(Map<String,String> map, String keysign) throws NoSuchAlgorithmException {
  87. StringBuilder sb = new StringBuilder();
  88. for (Map.Entry<String, String> entry : map.entrySet()) {
  89. if (entry.getValue() != null || entry.getValue() != "") {
  90. sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
  91. }
  92. }
  93. sb.deleteCharAt(sb.length()-1);// ?
  94. sb.append(keysign);
  95. logger.debug("签名前的字符串输出:"+sb.toString());
  96. String signValue = md5(sb.toString()).toUpperCase();
  97. logger.debug("sign: " + signValue);
  98. return signValue;
  99. }
  100. /**
  101. * 注册车牌
  102. * @param url
  103. * @param partner
  104. * @param key // 密钥
  105. * @param version
  106. *
  107. * {
  108. * "carNum": "京A45781",
  109. * "carNumColor": "blue",
  110. * "phone": "15210501514",
  111. * "outCarId": "45454545454",
  112. * "partner": "5836b8b52ada463ebc6199579f029566",
  113. * "timestamp": "2016-05-26 11:30:10",
  114. * "version": "1.0"
  115. * }
  116. * @throws Exception
  117. */
  118. public static String registerCar(String url, String partner, String key, String version,
  119. String carNum, String carNumColor, String phone, String outCarId) {
  120. String service = "parkhub.car.register";
  121. Map<String, String> paramMap = MapUtil.getOrderMap();
  122. paramMap.put("carNum", carNum);
  123. paramMap.put("carNumColor", carNumColor);
  124. if (phone != null) {
  125. paramMap.put("phone", phone);
  126. }
  127. if (outCarId != null) {
  128. paramMap.put("outCardId", outCarId);
  129. }
  130. paramMap.put("charset", "utf-8");
  131. paramMap.put("partner", partner);
  132. paramMap.put("version", version);
  133. String result = Proc(url, key, service, paramMap);
  134. /*
  135. {
  136. "timestamp": "1464235239561",
  137. "returnCode": "T",
  138. "errorMsg": "",
  139. "returnMsg": "OK",
  140. "isSuccess": "0",
  141. "carId": "5836b8b52ada463ebc6199579f029561"
  142. }*/
  143. return result;
  144. }
  145. /**
  146. * 注销车牌
  147. * @param url
  148. * @param partner
  149. * @param key // 密钥
  150. * @param version
  151. *
  152. * {
  153. * "service": "parkhub.car.writeOff",
  154. * "version":"1.0",
  155. * "sign":"3347b109a1e44f3fd5baa78b74a84948",
  156. * "partner":"5836b8b52ada463ebc6199579f029566",
  157. * "carId":"3347b109a1e44f3fd5baa78b74a84948",
  158. * "timestamp":"2016-05-26 11:30:10",
  159. * "charset":"utf-8",
  160. * "signType":"md5"
  161. * }
  162. * @throws Exception
  163. */
  164. public static String writeOffCar(String url, String partner, String key, String version,
  165. String carId) {
  166. String service = "parkhub.car.writeOff";
  167. Map<String, String> paramMap = MapUtil.getOrderMap();
  168. paramMap.put("carId", carId);
  169. paramMap.put("charset", "utf-8");
  170. paramMap.put("partner", partner);
  171. paramMap.put("version", version);
  172. String result = Proc(url, key, service, paramMap);
  173. /*
  174. {
  175. "timestamp": "1464235239561",
  176. "returnCode": "T",
  177. "errorMsg": "",
  178. "returnMsg": "OK",
  179. "isSuccess": "0",
  180. }*/
  181. return result;
  182. }
  183. /**
  184. * 在场订单查询
  185. * @param url
  186. * @param partner
  187. * @param key // 密钥
  188. * @param version
  189. *
  190. * {
  191. * "carNum": "京A45781",
  192. * "freeMins": "0",
  193. * "partner": "5836b8b52ada463ebc6199579f029566",
  194. * "pmParkId": "5836b8b52ada463ebc6199579f029565",
  195. * "timestamp": "2016-05-26 11:30:10",
  196. * "tradeId": "5836b8b52ada463ebc6199579f029565",
  197. * "version": "1.0"
  198. * }
  199. * @throws Exception
  200. */
  201. public static String infoForFreeMins(String url, String partner, String key, String version, String carNum) {
  202. String service = "parkhub.order.infoForFreeMins";
  203. String freeMins = "0";
  204. Map<String, String> paramMap = MapUtil.getOrderMap();
  205. paramMap.put("carNum", carNum);
  206. //paramMap.put("carNumColor", "");
  207. //paramMap.put("pmParkId", "");
  208. paramMap.put("freeMins", freeMins);
  209. //paramMap.put("tradeId", "");
  210. paramMap.put("charset", "utf-8");
  211. paramMap.put("partner", partner);
  212. paramMap.put("version", version);
  213. String result = Proc(url, key, service, paramMap);
  214. /*
  215. "{
  216. \"wLon\":\"116.310335\",
  217. \"returnCode\":\"T\",
  218. \"lon\":\"116.316819\",
  219. \"accountId\":\"5b3c15e15235486eba9abae41ae3f820\",
  220. \"freeThroughTime\":\"30\",
  221. \"customerServicePhone\":\"400-001-0606\",
  222. \"tradeId\":\"3a3475c501f8464cbb3ff1b6670690d6\",
  223. \"returnMsg\":\"OK\",
  224. \"outDt\":\"20180609164753\",
  225. \"isSuccess\":\"0\",
  226. \"pmParkId\":\"7715622dff834b34a44448b801c27607\",
  227. \"unPayAmount\":\"12.00\",
  228. \"timestamp\":\"1528534070691\",
  229. \"errorMSG\":\"\",
  230. \"parkTime\":\"107273\",
  231. \"wLat\":\"39.93609\",
  232. \"totalAmount\":\"12.00\",
  233. \"paidAmount\":\"0.00\",
  234. \"freeMinsAmount\":\"0\",
  235. \"payUrl\":\"https://prep.tingjiandan.com/tcweixin/letter/prePay/payInPark.html?prePayType=16&channel=30040&isShowDetail=true&orderId=3a3475c501f8464cbb3ff1b6670690d6\",
  236. \"lat\":\"39.942078\",
  237. \"inDt\":\"20180608110000\"
  238. }\n";
  239. */
  240. return result;
  241. }
  242. /**
  243. * deductionNotSettle 停车费无结算抵扣
  244. * @param url
  245. * @param partner
  246. * @param key // 密钥
  247. * @param version
  248. * {
  249. "service": "",
  250. "version":"1.0",
  251. "sign":"3347b109a1e44f3fd5baa78b74a84948",
  252. "partner":"5836b8b52ada463ebc6199579f029566",
  253. "timestamp":"2016-05-26 11:30:10",
  254. "charset":"utf-8",
  255. "signType":"md5",
  256. "tradeId": "224478781859452794f2a68a756fe461",
  257. "deductionAmount": "0.1",
  258. "outTradeNo":"4738473847834378",
  259. "accountId":"3347b109a1e44f3fd5baa78b74a84941",
  260. }
  261. * @throws Exception
  262. */
  263. public static String deductionNotSettle(String url, String partner, String key, String version,
  264. String tradeId, String outTradeNo, String accountId, String deductionAmount) {
  265. // TODO
  266. // 为指定订单抵扣停车费,如果此时车辆已经出场,返回isSuccess错误码为3,
  267. // 停简单系统不再接收此笔抵扣信息,对方系统需要给用户发起退款(后续业务中无结算)
  268. String service = "parkhub.order.deductionNotSettle";
  269. Map<String, String> paramMap = MapUtil.getOrderMap();
  270. paramMap.put("tradeId", tradeId);
  271. paramMap.put("deductionAmount", deductionAmount);
  272. paramMap.put("outTradeNo", outTradeNo);
  273. paramMap.put("accountId", accountId);
  274. paramMap.put("charset", "utf-8");
  275. paramMap.put("partner", partner);
  276. paramMap.put("version", version);
  277. String result = Proc(url, key, service, paramMap);
  278. /*
  279. "{\"timestamp\":\"1528534986636\",
  280. \"returnCode\":\"T\",
  281. \"prePayId\":\"7a1d52aa77ca487db4e61130394285bd\",
  282. \"errorMSG\":\"\",
  283. \"returnMsg\":\"OK\",
  284. \"isSuccess\":\"0\"}[\\r][\\n]"
  285. */
  286. return result;
  287. }
  288. /**
  289. * bindTime 绑定时长优惠券
  290. * @param url
  291. * @param partner //
  292. * @param key // 密钥
  293. * @param version // 1.0
  294. *
  295. * {
  296. * "service": "parkhub.ticket.bindTime",
  297. * "version":"1.0",
  298. * "sign":"3347b109a1e44f3fd5baa78b74a84948",
  299. * "partner":"5836b8b52ada463ebc6199579f029566",
  300. * "timestamp":"2016-05-26 11:30:10",
  301. * "charset":"utf-8",
  302. * "signType":"md5",
  303. * "tradeId": "224478781859452794f2a68a756fe461",
  304. * "outTicketNo": "224478781859452794f2a68a756fe461",
  305. * "accountId":"3347b109a1e44f3fd5baa78b74a84941",
  306. * "prePayType": "3",
  307. * "minutes": "30",
  308. * "memo": "测试绑定时长优惠券"
  309. * }
  310. * @throws Exception
  311. */
  312. public static String bindTime(String url, String partner, String key, String version,
  313. String tradeId, String outTicketNo, String accountId, String prePayType, String minutes, String memo) throws Exception {
  314. String service = "parkhub.ticket.bindTime";
  315. Map<String, String> paramMap = MapUtil.getOrderMap();
  316. paramMap.put("tradeId", tradeId);
  317. paramMap.put("outTicketNo", outTicketNo);
  318. paramMap.put("accountId", accountId);
  319. paramMap.put("prePayType", prePayType);
  320. paramMap.put("minutes", minutes);
  321. paramMap.put("memo", memo);
  322. paramMap.put("charset", "utf-8");
  323. paramMap.put("partner", partner);
  324. paramMap.put("version", version);
  325. String result = Proc(url, key, service, paramMap);
  326. /*{
  327. "timestamp": "1464247094636",
  328. "returnCode": "T",
  329. "errorMsg": "",
  330. "returnMsg": "OK",
  331. "isSuccess": "0",
  332. "ticketId": "224478781859452794f2a68a756fe441"
  333. }*/
  334. return result;
  335. }
  336. /**
  337. * 绑定区间优惠券
  338. * @param url
  339. * @param partner
  340. * @param key // 密钥
  341. * @param version
  342. *
  343. * {
  344. * "service": "parkhub.ticket.bindPeriod",
  345. * "version": "1.0",
  346. * "sign": "3347b109a1e44f3fd5baa78b74a84948",
  347. * "partner": "5836b8b52ada463ebc6199579f029566",
  348. * "timestamp": "2016-05-26 11:30:10",
  349. * "charset": "utf-8",
  350. * "signType": "md5",
  351. * "tradeId": "224478781859452794f2a68a756fe461",
  352. * "outTicketNo": "224478781859452794f2a68a756fe461",
  353. * "accountId": "3347b109a1e44f3fd5baa78b74a84941",
  354. * "prePayType": "3",
  355. * "startDt": "20160526113010",
  356. * "endDt": "20160526123010",
  357. * "expireDt": "20160527113010",
  358. * "memo": "测试绑定时长优惠券"
  359. * }
  360. * @throws Exception
  361. */
  362. public static String bindPeriod(String url, String partner, String key, String version,
  363. String tradeId, String outTicketNo, String accountId, String prePayType,
  364. String startDt, String EndDt, String expireDt, String memo) throws Exception {
  365. String service = "parkhub.ticket.bindPeriod";
  366. Map<String, String> paramMap = MapUtil.getOrderMap();
  367. paramMap.put("tradeId", tradeId);
  368. paramMap.put("outTicketNo", outTicketNo);
  369. paramMap.put("accountId", accountId);
  370. paramMap.put("prePayType", prePayType);
  371. paramMap.put("startDt", startDt);
  372. paramMap.put("EndDt", EndDt);
  373. paramMap.put("expireDt", expireDt);
  374. paramMap.put("memo", memo);
  375. paramMap.put("charset", "utf-8");
  376. paramMap.put("partner", partner);
  377. paramMap.put("version", version);
  378. String result = Proc(url, key, service, paramMap);
  379. /*{
  380. "timestamp": "1464247094636",
  381. "returnCode": "T",
  382. "errorMsg": "",
  383. "returnMsg": "OK",
  384. "isSuccess": "0",
  385. "ticketId": "224478781859452794f2a68a756fe441"
  386. }*/
  387. return result;
  388. }
  389. /**
  390. * 绑定区间优惠券
  391. * @param url
  392. * @param partner // 密钥
  393. * @param key // 密钥
  394. * @param version
  395. *
  396. * {
  397. * "service": "parkhub.ticket.unbind",
  398. * "version": "1.0",
  399. * "sign": "3347b109a1e44f3fd5baa78b74a84948",
  400. * "partner": "5836b8b52ada463ebc6199579f029566",
  401. * "timestamp": "2016-05-26 11:30:10",
  402. * "charset": "utf-8",
  403. * "signType": "md5",
  404. * "tradeId ": "3347b109a1e44f3fd5baa78b74a84948",
  405. * "ticketId": "224478781859452794f2a68a756fe461"
  406. * }
  407. * @throws Exception
  408. */
  409. public static String unbind(String url, String partner, String key, String version,
  410. String tradeId, String ticketid) throws Exception {
  411. String service = "parkhub.ticket.unbind";
  412. Map<String, String> paramMap = MapUtil.getOrderMap();
  413. paramMap.put("tradeId", tradeId);
  414. paramMap.put("ticketid", ticketid);
  415. paramMap.put("charset", "utf-8");
  416. paramMap.put("partner", partner);
  417. paramMap.put("version", version);
  418. String result = Proc(url, key, service, paramMap);
  419. /*{
  420. "timestamp": "1464247094636",
  421. "returnCode": "T",
  422. "errorMsg": "",
  423. "returnMsg": "OK",
  424. "isSuccess": "0",
  425. }*/
  426. return result;
  427. }
  428. private static String Proc(String url, String key, String service, Map<String, String> paramMap) {
  429. CloseableHttpClient httpClient = HttpClients.createDefault();
  430. HttpPost httpPost = new HttpPost(url);
  431. httpPost.addHeader(HTTP.CONTENT_TYPE,"application/json");
  432. httpPost.addHeader("Accept", "application/json");
  433. httpPost.addHeader("Accept-Encoding", "UTF-8");
  434. String timestamp = getCurrentDate();
  435. paramMap.put("timestamp", timestamp);
  436. paramMap.put("service", service);
  437. String sign = null;
  438. try{
  439. sign = getSign(paramMap, key);
  440. }catch(NoSuchAlgorithmException e) {
  441. logger.error(e.getLocalizedMessage());
  442. }
  443. paramMap.put("sign", sign);
  444. paramMap.put("signType", "md5");
  445. String jsonstr = JSON.toJSONString(paramMap);
  446. try {
  447. StringEntity se = new StringEntity(jsonstr, Consts.UTF_8);
  448. se.setContentType("application/json");
  449. se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
  450. httpPost.setEntity(se);
  451. } catch (Exception e) {
  452. logger.error(e.getMessage());
  453. }
  454. HttpResponse response = null;
  455. try {
  456. response = httpClient.execute(httpPost);
  457. } catch (Exception e) {
  458. logger.error(e.getLocalizedMessage());
  459. }
  460. String result = null;
  461. //打印StatusLine
  462. logger.debug("StatusLine: " + response.getStatusLine());
  463. try{
  464. //获取实体
  465. HttpEntity httpEntity= response.getEntity();
  466. result = EntityUtils.toString(httpEntity, "UTF-8");
  467. logger.debug(result);
  468. } catch (Exception e) {
  469. logger.error(e.getLocalizedMessage());
  470. }
  471. try { //关闭流并释放资源
  472. httpClient.close();
  473. } catch (IOException e) {
  474. logger.error(e.getLocalizedMessage());
  475. }
  476. return result;
  477. }
  478. }