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; /** * 省立同德短信响应解析。 *

* 现状(同一供应商、两套写法,必须都兼容,否则改了就是回归): *

* 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; } } }