|
@@ -0,0 +1,176 @@
|
|
|
+package com.iamberry.rst.service.kdn;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.iamberry.rst.faces.kdn.KuaiDiNiaoService;
|
|
|
+import com.iamberry.wechat.tools.HttpClient431Util;
|
|
|
+import com.sun.org.apache.xml.internal.security.utils.Base64;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
|
|
|
+ private static Logger LOGGER = LoggerFactory.getLogger(KuaiDiNiaoServiceImpl.class);
|
|
|
+ private static String ERRORPATH = "D:\\testJavaPath\\error.txt";
|
|
|
+ private static String SUCCESSPATH = "D:\\testJavaPath\\success.txt";
|
|
|
+
|
|
|
+ //电商ID
|
|
|
+ private static final String EBusinessID="1343593";
|
|
|
+ //电商加密私钥,快递鸟提供
|
|
|
+ private static final String AppKey="3597c368-9dc0-40b5-9cf2-86d9cb90e38a";
|
|
|
+ //单号识别API
|
|
|
+ private final static String URL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
|
|
|
+
|
|
|
+ //获取EBusinessID
|
|
|
+ public String getEBusinessID(){
|
|
|
+ return EBusinessID;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String selectCourierCompany(String code) {
|
|
|
+ String courierCompang="";
|
|
|
+ Map<String,Object> requestMap = new HashMap();
|
|
|
+ requestMap.put("LogisticCode",code);
|
|
|
+ try {
|
|
|
+ // 第三方接口对时效性有要求,并发数不超过多少,此处Sleep 1200ms
|
|
|
+ Thread.sleep(1200);
|
|
|
+
|
|
|
+ // 生成电子面单的请求数据
|
|
|
+ String requestData = JSONObject.toJSONString(requestMap);
|
|
|
+ // 生成系统级请求数据
|
|
|
+ Map<String, String> params = new HashMap<String, String>();
|
|
|
+ params.put("RequestData", urlEncoder(requestData, "UTF-8"));
|
|
|
+ params.put("EBusinessID", EBusinessID);
|
|
|
+ params.put("RequestType", "2002");
|
|
|
+ String dataSign=encrypt(requestData, AppKey, "UTF-8");
|
|
|
+ params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
|
|
|
+ params.put("DataType", "2");
|
|
|
+ // 发送请求
|
|
|
+ String json = HttpClient431Util.doPost(params, URL);
|
|
|
+
|
|
|
+ Map responseMap = JSONObject.parseObject(json);
|
|
|
+
|
|
|
+ JSONArray shippersAyyar = (JSONArray) responseMap.get("Shippers");
|
|
|
+ if(shippersAyyar.size() < 1){
|
|
|
+ LOGGER.info("=========快递单号:"+code+";查询不到快递公司");
|
|
|
+ String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
|
|
|
+ writeTxt(ERRORPATH,errorMsg);
|
|
|
+ }
|
|
|
+ if(shippersAyyar.size()>0 && shippersAyyar.size() < 2){
|
|
|
+ JSONObject job = shippersAyyar.getJSONObject(0); // 遍历 jsonarray 数组,把每一个对象转成 json 对象
|
|
|
+ String shipperName = (String) job.get("ShipperName");
|
|
|
+ String shipperCode = (String) job.get("ShipperCode");
|
|
|
+ courierCompang = shipperCode;
|
|
|
+ if(courierCompang == null || "".equals(courierCompang) ){
|
|
|
+ LOGGER.info("=========快递单号:"+code+";查询不到快递公司,其中有一个快递公司");
|
|
|
+ String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
|
|
|
+ writeTxt(ERRORPATH,errorMsg);
|
|
|
+ }else{
|
|
|
+ LOGGER.info("=========快递单号:"+code+";查询成功,快递公司:"+shipperName+":"+shipperCode);
|
|
|
+ String errorMsg = "快递单号:" + code+"快递公司:"+shipperName+":"+shipperCode +"\n";
|
|
|
+ writeTxt(SUCCESSPATH,errorMsg);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ StringBuffer company = new StringBuffer();
|
|
|
+ for(int i=0;i<shippersAyyar.size();i++){
|
|
|
+ JSONObject job = shippersAyyar.getJSONObject(i);
|
|
|
+ company.append(job.get("ShipperName")+":");
|
|
|
+ company.append(job.get("ShipperCode")+";");
|
|
|
+ }
|
|
|
+ LOGGER.info("=========快递单号:"+code+";查询到多个快递公司:"+company.toString());
|
|
|
+ String errorMsg = "快递单号:"+code+";查询到多个快递公司:"+company.toString()+"\n";
|
|
|
+ writeTxt(ERRORPATH,errorMsg);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return courierCompang;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写入文件
|
|
|
+ * @param path
|
|
|
+ * @param s
|
|
|
+ */
|
|
|
+ public static void writeTxt(String path,String s){
|
|
|
+ File file = new File(path);
|
|
|
+ try{
|
|
|
+ FileWriter fw = new FileWriter(file, true);
|
|
|
+ if(!file.exists()){
|
|
|
+ file.createNewFile();
|
|
|
+ }
|
|
|
+ BufferedWriter bw = new BufferedWriter(fw);
|
|
|
+ PrintWriter pw = new PrintWriter(bw);
|
|
|
+
|
|
|
+ pw.println(s);
|
|
|
+
|
|
|
+ pw.flush();
|
|
|
+ fw.flush();
|
|
|
+ pw.close();
|
|
|
+ fw.close();
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * base64编码
|
|
|
+ * @param str 内容
|
|
|
+ * @param charset 编码方式
|
|
|
+ * @throws UnsupportedEncodingException
|
|
|
+ */
|
|
|
+ private static String base64(String str, String charset) throws UnsupportedEncodingException {
|
|
|
+ return Base64.encode(str.getBytes(charset));
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unused")
|
|
|
+ private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
|
|
|
+ return URLEncoder.encode(str, charset);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 电商Sign签名生成
|
|
|
+ * @param content 内容
|
|
|
+ * @param keyValue Appkey
|
|
|
+ * @param charset 编码方式
|
|
|
+ * @throws UnsupportedEncodingException ,Exception
|
|
|
+ * @return DataSign签名
|
|
|
+ */
|
|
|
+ @SuppressWarnings("unused")
|
|
|
+ private static String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception {
|
|
|
+ if (keyValue != null)
|
|
|
+ {
|
|
|
+ return base64(MD5(content + keyValue, charset), charset);
|
|
|
+ }
|
|
|
+ return base64(MD5(content, charset), charset);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * MD5加密
|
|
|
+ * @param str 内容
|
|
|
+ * @param charset 编码方式
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @SuppressWarnings("unused")
|
|
|
+ private static String MD5(String str, String charset) throws Exception {
|
|
|
+ MessageDigest md = MessageDigest.getInstance("MD5");
|
|
|
+ md.update(str.getBytes(charset));
|
|
|
+ byte[] result = md.digest();
|
|
|
+ StringBuilder sb = new StringBuilder(32);
|
|
|
+ for (byte aResult : result) {
|
|
|
+ int val = aResult & 0xff;
|
|
|
+ if (val <= 0xf) {
|
|
|
+ sb.append("0");
|
|
|
+ }
|
|
|
+ sb.append(Integer.toHexString(val));
|
|
|
+ }
|
|
|
+ return sb.toString().toLowerCase();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|