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