KuaiDiNiaoServiceImpl.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package com.iamberry.rst.service.kdn;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.iamberry.rst.faces.kdn.KuaiDiNiaoService;
  5. import com.iamberry.wechat.tools.HttpClient431Util;
  6. import com.sun.org.apache.xml.internal.security.utils.Base64;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.stereotype.Service;
  10. import java.io.*;
  11. import java.net.URLEncoder;
  12. import java.security.MessageDigest;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. @Service
  16. public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
  17. private static Logger LOGGER = LoggerFactory.getLogger(KuaiDiNiaoServiceImpl.class);
  18. private static String ERRORPATH = "D:\\testJavaPath\\error.txt";
  19. private static String SUCCESSPATH = "D:\\testJavaPath\\success.txt";
  20. //电商ID
  21. private static final String EBusinessID="1343593";
  22. //电商加密私钥,快递鸟提供
  23. private static final String AppKey="3597c368-9dc0-40b5-9cf2-86d9cb90e38a";
  24. //单号识别API
  25. private final static String URL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
  26. //获取EBusinessID
  27. public String getEBusinessID(){
  28. return EBusinessID;
  29. }
  30. @Override
  31. public String selectCourierCompany(String code) {
  32. String courierCompang="";
  33. Map<String,Object> requestMap = new HashMap();
  34. requestMap.put("LogisticCode",code);
  35. try {
  36. // 第三方接口对时效性有要求,并发数不超过多少,此处Sleep 1200ms
  37. Thread.sleep(1200);
  38. // 生成电子面单的请求数据
  39. String requestData = JSONObject.toJSONString(requestMap);
  40. // 生成系统级请求数据
  41. Map<String, String> params = new HashMap<String, String>();
  42. params.put("RequestData", urlEncoder(requestData, "UTF-8"));
  43. params.put("EBusinessID", EBusinessID);
  44. params.put("RequestType", "2002");
  45. String dataSign=encrypt(requestData, AppKey, "UTF-8");
  46. params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
  47. params.put("DataType", "2");
  48. // 发送请求
  49. String json = HttpClient431Util.doPost(params, URL);
  50. Map responseMap = JSONObject.parseObject(json);
  51. JSONArray shippersAyyar = (JSONArray) responseMap.get("Shippers");
  52. if(shippersAyyar.size() < 1){
  53. LOGGER.info("=========快递单号:"+code+";查询不到快递公司");
  54. String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
  55. writeTxt(ERRORPATH,errorMsg);
  56. }
  57. if(shippersAyyar.size()>0 && shippersAyyar.size() < 2){
  58. JSONObject job = shippersAyyar.getJSONObject(0); // 遍历 jsonarray 数组,把每一个对象转成 json 对象
  59. String shipperName = (String) job.get("ShipperName");
  60. String shipperCode = (String) job.get("ShipperCode");
  61. courierCompang = shipperCode;
  62. if(courierCompang == null || "".equals(courierCompang) ){
  63. LOGGER.info("=========快递单号:"+code+";查询不到快递公司,其中有一个快递公司");
  64. String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
  65. writeTxt(ERRORPATH,errorMsg);
  66. }else{
  67. LOGGER.info("=========快递单号:"+code+";查询成功,快递公司:"+shipperName+":"+shipperCode);
  68. String errorMsg = "快递单号:" + code+"快递公司:"+shipperName+":"+shipperCode +"\n";
  69. writeTxt(SUCCESSPATH,errorMsg);
  70. }
  71. }else{
  72. StringBuffer company = new StringBuffer();
  73. for(int i=0;i<shippersAyyar.size();i++){
  74. JSONObject job = shippersAyyar.getJSONObject(i);
  75. company.append(job.get("ShipperName")+":");
  76. company.append(job.get("ShipperCode")+";");
  77. }
  78. LOGGER.info("=========快递单号:"+code+";查询到多个快递公司:"+company.toString());
  79. String errorMsg = "快递单号:"+code+";查询到多个快递公司:"+company.toString()+"\n";
  80. writeTxt(ERRORPATH,errorMsg);
  81. }
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. return courierCompang;
  86. }
  87. /**
  88. * 写入文件
  89. * @param path
  90. * @param s
  91. */
  92. public static void writeTxt(String path,String s){
  93. File file = new File(path);
  94. try{
  95. FileWriter fw = new FileWriter(file, true);
  96. if(!file.exists()){
  97. file.createNewFile();
  98. }
  99. BufferedWriter bw = new BufferedWriter(fw);
  100. PrintWriter pw = new PrintWriter(bw);
  101. pw.println(s);
  102. pw.flush();
  103. fw.flush();
  104. pw.close();
  105. fw.close();
  106. }catch (Exception e){
  107. e.printStackTrace();
  108. }
  109. }
  110. /**
  111. * base64编码
  112. * @param str 内容
  113. * @param charset 编码方式
  114. * @throws UnsupportedEncodingException
  115. */
  116. private static String base64(String str, String charset) throws UnsupportedEncodingException {
  117. return Base64.encode(str.getBytes(charset));
  118. }
  119. @SuppressWarnings("unused")
  120. private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
  121. return URLEncoder.encode(str, charset);
  122. }
  123. /**
  124. * 电商Sign签名生成
  125. * @param content 内容
  126. * @param keyValue Appkey
  127. * @param charset 编码方式
  128. * @throws UnsupportedEncodingException ,Exception
  129. * @return DataSign签名
  130. */
  131. @SuppressWarnings("unused")
  132. private static String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception {
  133. if (keyValue != null)
  134. {
  135. return base64(MD5(content + keyValue, charset), charset);
  136. }
  137. return base64(MD5(content, charset), charset);
  138. }
  139. /**
  140. * MD5加密
  141. * @param str 内容
  142. * @param charset 编码方式
  143. * @throws Exception
  144. */
  145. @SuppressWarnings("unused")
  146. private static String MD5(String str, String charset) throws Exception {
  147. MessageDigest md = MessageDigest.getInstance("MD5");
  148. md.update(str.getBytes(charset));
  149. byte[] result = md.digest();
  150. StringBuilder sb = new StringBuilder(32);
  151. for (byte aResult : result) {
  152. int val = aResult & 0xff;
  153. if (val <= 0xf) {
  154. sb.append("0");
  155. }
  156. sb.append(Integer.toHexString(val));
  157. }
  158. return sb.toString().toLowerCase();
  159. }
  160. }