119 lines
4.5 KiB
Java
119 lines
4.5 KiB
Java
|
|
package com.gear.oa.utils;
|
|||
|
|
|
|||
|
|
import com.alibaba.fastjson2.JSON;
|
|||
|
|
import com.alibaba.fastjson2.JSONArray;
|
|||
|
|
import com.alibaba.fastjson2.JSONObject;
|
|||
|
|
import com.gear.oa.domain.vo.OaExpressVo;
|
|||
|
|
import org.apache.commons.codec.binary.Base64;
|
|||
|
|
import org.apache.commons.codec.digest.DigestUtils;
|
|||
|
|
|
|||
|
|
import java.io.BufferedReader;
|
|||
|
|
import java.io.InputStreamReader;
|
|||
|
|
import java.io.OutputStream;
|
|||
|
|
import java.net.HttpURLConnection;
|
|||
|
|
import java.net.URL;
|
|||
|
|
import java.nio.charset.StandardCharsets;
|
|||
|
|
|
|||
|
|
public class YtRouteQueryUtil {
|
|||
|
|
// 请填写你自己的密钥、method、v
|
|||
|
|
private static final String SECRET = "TEST";
|
|||
|
|
private static final String METHOD = "123456"; // 示例
|
|||
|
|
private static final String VERSION = "v1"; // 示例
|
|||
|
|
private static final String API_URL = " https://openuat.yto56test.com:6443/open/track_query_adapter/v1/hpLkUl/TEST";
|
|||
|
|
|
|||
|
|
// 圆通签名算法 param+method+v+secret,MD5后Base64
|
|||
|
|
public static String sign(String param, String method, String v, String secret) {
|
|||
|
|
String data = param + method + v;
|
|||
|
|
byte[] md5 = DigestUtils.md5(data + secret);
|
|||
|
|
return Base64.encodeBase64String(md5);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 查询圆通轨迹
|
|||
|
|
* @param number 运单号
|
|||
|
|
* @return 查询结果JSON
|
|||
|
|
*/
|
|||
|
|
public static String queryRoute(String number) {
|
|||
|
|
try {
|
|||
|
|
String timestamp = String.valueOf(System.currentTimeMillis());
|
|||
|
|
JSONObject paramObj = new JSONObject();
|
|||
|
|
paramObj.put("NUMBER", number);
|
|||
|
|
String param = paramObj.toJSONString();
|
|||
|
|
String sign = sign(param, METHOD, VERSION, SECRET);
|
|||
|
|
JSONObject req = new JSONObject();
|
|||
|
|
req.put("timestamp", timestamp);
|
|||
|
|
req.put("param", param);
|
|||
|
|
req.put("sign", sign);
|
|||
|
|
req.put("format", "JSON");
|
|||
|
|
req.put("method", METHOD);
|
|||
|
|
req.put("v", VERSION);
|
|||
|
|
String jsonParams = req.toJSONString();
|
|||
|
|
URL url = new URL(API_URL);
|
|||
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
|||
|
|
conn.setDoOutput(true);
|
|||
|
|
conn.setDoInput(true);
|
|||
|
|
conn.setUseCaches(false);
|
|||
|
|
conn.setRequestMethod("POST");
|
|||
|
|
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
|
|||
|
|
OutputStream out = conn.getOutputStream();
|
|||
|
|
out.write(jsonParams.getBytes(StandardCharsets.UTF_8));
|
|||
|
|
out.flush();
|
|||
|
|
out.close();
|
|||
|
|
StringBuilder sbResult = new StringBuilder();
|
|||
|
|
if (200 == conn.getResponseCode()) {
|
|||
|
|
BufferedReader responseReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
|
|||
|
|
String readLine;
|
|||
|
|
while ((readLine = responseReader.readLine()) != null) {
|
|||
|
|
sbResult.append(readLine).append("\n");
|
|||
|
|
}
|
|||
|
|
responseReader.close();
|
|||
|
|
}
|
|||
|
|
return sbResult.toString();
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 解析圆通返回数据,转为OaExpressVo列表
|
|||
|
|
*/
|
|||
|
|
public static OaExpressVo parseData(String result) {
|
|||
|
|
if (result == null || result.trim().isEmpty()) {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
if (result.trim().startsWith("{")) {
|
|||
|
|
JSONObject json = JSON.parseObject(result);
|
|||
|
|
if (json.containsKey("map")) return null; // 查询为空
|
|||
|
|
} else if (result.trim().startsWith("[")) {
|
|||
|
|
JSONArray arr = JSON.parseArray(result);
|
|||
|
|
if (arr.isEmpty()) return null;
|
|||
|
|
JSONObject last = arr.getJSONObject(arr.size() - 1);
|
|||
|
|
OaExpressVo vo = new OaExpressVo();
|
|||
|
|
vo.setExpressCode(last.getString("waybill_No"));
|
|||
|
|
vo.setLastUpdateTime(last.getDate("upload_Time"));
|
|||
|
|
vo.setLastStatus(last.getString("infoContent"));
|
|||
|
|
vo.setRemark(last.getString("processInfo"));
|
|||
|
|
return vo;
|
|||
|
|
}
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// main方法测试
|
|||
|
|
public static void main(String[] args) {
|
|||
|
|
String number = "YT2600227881409"; // 测试单号
|
|||
|
|
String result = queryRoute(number);
|
|||
|
|
System.out.println("圆通原始返回:" + result);
|
|||
|
|
OaExpressVo vo = parseData(result);
|
|||
|
|
if (vo != null) {
|
|||
|
|
System.out.println("解析后:" + vo);
|
|||
|
|
} else {
|
|||
|
|
System.out.println("解析后无数据");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|