liusheng
2026-10-10 0afac42fb2e9d6e5291304dd0044ce3042b45d2b
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
package com.ruoyi.message.sms.provider.sltd;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
 
/**
 * 省立同德短信响应解析。
 * <p>
 * 现状(同一供应商、两套写法,必须都兼容,否则改了就是回归):
 * <ul>
 *   <li>{@code RyTask} / {@code RedisMqReceiver}:按 {@code result=0&description=成功&faillist=} 解析,
 *       取 {@code result == "0"} 为成功;</li>
 *   <li>{@code SmsController./sms/send}:按 JSON 解析 {@code result[0].status == "00000"} 为成功。</li>
 * </ul>
 * TODO 待确认:以上两种返回判定到底哪个才是省立同德网关的真实返回格式,需业务确认后统一。
 * 本解析器两种都兼容,保证迁移后行为与线上一致。
 */
final class SltdResponseParser {
 
    private SltdResponseParser() {
    }
 
    /**
     * 解析结果值(用于日志与排查)
     */
    static String resultValue(String raw) {
        if (StringUtils.isEmpty(raw)) {
            return null;
        }
        String keyValue = readKeyValue(raw, "result");
        if (keyValue != null) {
            return keyValue;
        }
        return readJsonStatus(raw);
    }
 
    /**
     * 是否发送成功:兼容 {@code result=0} 与 {@code result[0].status=00000} 两种判定
     */
    static boolean isSuccess(String raw) {
        if (StringUtils.isEmpty(raw)) {
            return false;
        }
        String keyValue = readKeyValue(raw, "result");
        if ("0".equals(keyValue)) {
            return true;
        }
        return "00000".equals(readJsonStatus(raw));
    }
 
    /**
     * 从 {@code a=1&b=2} 形式的响应里取值
     */
    private static String readKeyValue(String raw, String key) {
        String[] pairs = raw.split("&");
        for (String pair : pairs) {
            String[] kv = pair.split("=", 2);
            if (key.equals(kv[0])) {
                return kv.length > 1 ? kv[1] : null;
            }
        }
        return null;
    }
 
    /**
     * 从 JSON 响应里取 {@code result[0].status}
     */
    private static String readJsonStatus(String raw) {
        try {
            JSONObject root = JSON.parseObject(raw);
            if (root == null) {
                return null;
            }
            JSONArray result = root.getJSONArray("result");
            if (result == null || result.isEmpty()) {
                return null;
            }
            JSONObject first = result.getJSONObject(0);
            return first == null ? null : first.getString("status");
        } catch (Exception e) {
            //不是 JSON,属于正常情况(取决于网关返回格式),交由 key-value 分支处理
            return null;
        }
    }
}