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;
/**
* 省立同德短信响应解析。
*
* 现状(同一供应商、两套写法,必须都兼容,否则改了就是回归):
*
* - {@code RyTask} / {@code RedisMqReceiver}:按 {@code result=0&description=成功&faillist=} 解析,
* 取 {@code result == "0"} 为成功;
* - {@code SmsController./sms/send}:按 JSON 解析 {@code result[0].status == "00000"} 为成功。
*
* 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;
}
}
}