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.
 
 
 
 
 

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