add
yj
2024-12-05 b9900893177c78fc559223521fe839aa21000017
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package com.iotechn.unimall.biz.service.freight;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dobbinsoft.fw.core.enums.BaseEnums;
import com.dobbinsoft.fw.core.exception.ServiceException;
import com.dobbinsoft.fw.core.exception.ThirdPartServiceException;
import com.iotechn.unimall.data.dto.freight.ShipTraceDTO;
import com.iotechn.unimall.data.dto.freight.ShipTraceItemDTO;
import com.iotechn.unimall.data.enums.ShipCodeType;
import com.iotechn.unimall.data.exception.ExceptionDefinition;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import org.springframework.util.CollectionUtils;
 
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.LinkedList;
import java.util.List;
 
 
@Component
public class KdniaoTrackQueryAPI implements ShipTraceQuery {
 
    private static final Logger logger = LoggerFactory.getLogger(KdniaoTrackQueryAPI.class);
 
    @Value("${com.iotechn.ship.query.kdn.app-key}")
    private String businessID;
 
    @Value("${com.iotechn.ship.query.kdn.business-id}")
    private String appKey;
 
    private static final String REQ_URL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
 
    private OkHttpClient okHttpClient = new OkHttpClient();
 
    @Override
    public ShipTraceDTO query(String shipNo, String shipCode) throws ServiceException {
        String msg = "";
        try {
            String orderTracesByJson = getOrderTracesByJson(shipCode, shipNo);
            JSONObject jsonObject = JSONObject.parseObject(orderTracesByJson);
            ShipTraceDTO shipTraceDTO = new ShipTraceDTO();
            shipTraceDTO.setShipNo(shipNo);
            shipTraceDTO.setShipCode(shipCode);
            shipTraceDTO.setShipName(BaseEnums.getByCode(shipCode, ShipCodeType.class).getMsg());
            List<ShipTraceItemDTO> traces = new LinkedList<>();
            JSONArray tracesFromJson = jsonObject.getJSONArray("Traces");
            if (!CollectionUtils.isEmpty(tracesFromJson)) {
                for (int i = 0; i < tracesFromJson.size(); i++) {
                    ShipTraceItemDTO shipTraceItemDTO = new ShipTraceItemDTO();
                    shipTraceItemDTO.setStation(tracesFromJson.getJSONObject(i).getString("AcceptStation"));
                    shipTraceItemDTO.setTime(tracesFromJson.getJSONObject(i).getString("AcceptTime"));
                    traces.add(shipTraceItemDTO);
                }
            }
            shipTraceDTO.setTraces(traces);
            return shipTraceDTO;
        } catch (Exception e) {
            logger.error("[快递鸟 查询] 异常", e);
            throw new ThirdPartServiceException(msg, ExceptionDefinition.THIRD_PART_SERVICE_EXCEPTION.getCode());
        }
    }
 
    /**
     * Json方式 查询订单物流轨迹
     *
     * @throws Exception
     */
    private String getOrderTracesByJson(String shipCode, String shipNo) throws Exception {
        String requestData = "{\"OrderCode\":\"\",\"ShipperCode\":\"" + shipCode + "\",\"LogisticCode\":\"" + shipNo + "\"}";
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        StringBuilder sb = new StringBuilder();
        sb.append("RequestData=");
        sb.append(URLEncoder.encode(requestData, "UTF-8"));
        sb.append("&EBusinessID=");
        sb.append(businessID);
        sb.append("&RequestType=1002");
        String dataSign = encrypt(requestData, appKey, "UTF-8");
        sb.append("&DataSign=");
        sb.append(dataSign);
        sb.append("&DataType=2");
        RequestBody body = RequestBody.create(mediaType, sb.toString());
        String result = okHttpClient.newCall(new Request.Builder().url(REQ_URL).post(body).build()).execute().body().string();
        return result;
    }
 
    /**
     * MD5加密
     *
     * @param str     内容
     * @param charset 编码方式
     * @throws Exception
     */
    private String MD5(String str, String charset) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(str.getBytes(charset));
        byte[] result = md.digest();
        StringBuffer sb = new StringBuffer(32);
        for (int i = 0; i < result.length; i++) {
            int val = result[i] & 0xff;
            if (val <= 0xf) {
                sb.append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        return sb.toString().toLowerCase();
    }
 
    /**
     * base64编码
     *
     * @param str     内容
     * @param charset 编码方式
     * @throws UnsupportedEncodingException
     */
    private String base64(String str, String charset) throws UnsupportedEncodingException {
        return Base64Utils.encodeToString(str.getBytes(charset));
    }
 
    /**
     * 电商Sign签名生成
     *
     * @param content  内容
     * @param keyValue Appkey
     * @param charset  编码方式
     * @return DataSign签名
     * @throws UnsupportedEncodingException ,Exception
     */
    private 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);
    }
 
 
 
}