diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/StoRouteQueryUtil.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/StoRouteQueryUtil.java index 171bc9b..6a87f4c 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/StoRouteQueryUtil.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/StoRouteQueryUtil.java @@ -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+appSecret,MD5后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 waybillNos = new ArrayList<>(); - waybillNos.add("777031922725111"); // 测试单号 + waybillNos.add("777325378857266"); // 测试单号 String result = queryRoute(waybillNos); System.out.println("申通原始返回:" + result); OaExpressVo vo = parseData(result);