申通对接成功

This commit is contained in:
2025-07-24 11:49:22 +08:00
parent f0478a9f9f
commit d94fd0d1ed

View File

@@ -14,13 +14,14 @@ import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.net.URLEncoder;
public class StoRouteQueryUtil {
// 请填写你自己的key/secret
private static final String APP_KEY = "CAKWRqzGkVRVVFj";
private static final String APP_SECRET = "";
private static final String FROM_CODE = ""; // 你的from_code
private static final String API_URL = "http://cloudinter-linkgatewaytest.sto.cn/gateway/link.do";
private static final String APP_KEY = "CAKDSqybdwbzlUC";
private static final String APP_SECRET = "wGRMVXwIf8sp4m4W6tWJcOaDfY7EPblQ";
private static final String FROM_CODE = "CAKDSqybdwbzlUC"; // 你的from_code
private static final String API_URL = "https://cloudinter-linkgateway.sto.cn/gateway/link.do";
// 申通签名算法 body+appSecretMD5后Base64
public static String sign(String body, String secret) {
@@ -44,26 +45,27 @@ public class StoRouteQueryUtil {
content.put("waybillNoList", waybillNoList);
String contentStr = content.toJSONString();
// 构造请求参数
JSONObject params = new JSONObject();
params.put("api_name", "STO_TRACE_QUERY_COMMON");
params.put("content", contentStr);
params.put("from_appkey", APP_KEY);
params.put("from_code", FROM_CODE);
params.put("to_appkey", "sto_trace_query");
params.put("to_code", "sto_trace_query");
params.put("data_digest", sign(contentStr, APP_SECRET));
// 构造表单参数字符串
StringBuilder form = new StringBuilder();
form.append("api_name=STO_TRACE_QUERY_COMMON");
form.append("&content=").append(URLEncoder.encode(contentStr, "UTF-8"));
form.append("&from_appkey=").append(APP_KEY);
form.append("&from_code=").append(APP_KEY);
form.append("&to_appkey=sto_trace_query");
form.append("&to_code=sto_trace_query");
form.append("&data_digest=").append(URLEncoder.encode(sign(contentStr, APP_SECRET), "UTF-8"));
System.out.println("申通表单请求体:" + form);
String jsonParams = params.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");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
OutputStream out = conn.getOutputStream();
out.write(jsonParams.getBytes(StandardCharsets.UTF_8));
out.write(form.toString().getBytes(StandardCharsets.UTF_8));
out.flush();
out.close();
StringBuilder sbResult = new StringBuilder();
@@ -89,6 +91,11 @@ public class StoRouteQueryUtil {
if (result == null || result.trim().isEmpty()) {
return null;
}
// 新增如果返回是XML直接打印并返回null
if (result.trim().startsWith("<")) {
System.err.println("申通返回XML错误" + result);
return null;
}
try {
JSONObject json = JSON.parseObject(result);
JSONObject data = json.getJSONObject("data");
@@ -113,7 +120,7 @@ public class StoRouteQueryUtil {
// main方法测试
public static void main(String[] args) {
List<String> waybillNos = new ArrayList<>();
waybillNos.add("777031922725111"); // 测试单号
waybillNos.add("777325378857266"); // 测试单号
String result = queryRoute(waybillNos);
System.out.println("申通原始返回:" + result);
OaExpressVo vo = parseData(result);