浏览代码

Merge branch 'refs/heads/master' into pre

zoujiajian 1 月之前
父节点
当前提交
3de5ac8d2b

+ 8 - 0
netflix-service/src/main/java/com/cyksj/server/recharge/impl/GptProxyRechargeServiceImpl.java

@@ -256,6 +256,14 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
             JSONObject jsonObject = JSONUtil.parseObj(saveTokenJson);
             String accessToken = jsonObject.getStr("accessToken");
             if (StrUtil.isNotBlank(accessToken)) {
+                try {
+                    JSONObject sessionObject = JSONUtil.parseObj(accessToken);
+                    String sessionAccessToken = sessionObject.getStr("accessToken");
+                    if (StrUtil.isNotBlank(sessionAccessToken)) {
+                        return sessionAccessToken;
+                    }
+                } catch (Exception ignored) {
+                }
                 return accessToken;
             }
             String payload = jsonObject.getStr("payload");

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/gpt/impl/GptRechargeServiceImpl.java

@@ -408,6 +408,14 @@ public class GptRechargeServiceImpl implements GptRechargeService {
             JSONObject jsonObject = JSONUtil.parseObj(saveTokenJson);
             String accessToken = jsonObject.getStr("accessToken");
             if (StrUtil.isNotBlank(accessToken)) {
+                try {
+                    JSONObject sessionObject = JSONUtil.parseObj(accessToken);
+                    String sessionAccessToken = sessionObject.getStr("accessToken");
+                    if (StrUtil.isNotBlank(sessionAccessToken)) {
+                        return sessionAccessToken;
+                    }
+                } catch (Exception ignored) {
+                }
                 return accessToken;
             }
             String payload = jsonObject.getStr("payload");

+ 82 - 3
netflix-service/src/main/java/com/cyksj/service/recharge/impl/RedeemCloudRechargeServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -117,7 +118,11 @@ public class RedeemCloudRechargeServiceImpl implements RedeemCloudRechargeServic
             String body = response.body();
             log.info("redeemcloud submit response: {}", body);
 
-            JSONObject jsonResponse = JSONUtil.parseObj(body);
+            String directTaskId = parseDirectTaskId(body);
+            if (StrUtil.isNotBlank(directTaskId)) {
+                return directTaskId;
+            }
+            JSONObject jsonResponse = parseResponseObject(body, "exchange");
             Object data = jsonResponse.get("data");
             if (isSuccessResponse(jsonResponse) && data instanceof CharSequence && StrUtil.isNotBlank(data.toString())) {
                 return data.toString();
@@ -137,9 +142,18 @@ public class RedeemCloudRechargeServiceImpl implements RedeemCloudRechargeServic
     }
 
     private String buildExchangeBody(String baseUrl, String cardKey, String rechargePayload) throws Exception {
+        rechargePayload = unwrapJsonString(rechargePayload);
         if (StrUtil.isBlank(rechargePayload)) {
             throw BusinessRuntimeException.getInstance("redeemcloud提交任务需要session");
         }
+        if (StrUtil.startWith(rechargePayload.trim(), "[")) {
+            JSONArray array = JSONUtil.parseArray(rechargePayload);
+            if (array.isEmpty()) {
+                throw BusinessRuntimeException.getInstance("redeemcloud session is empty");
+            }
+            Object first = array.get(0);
+            rechargePayload = unwrapJsonString(first instanceof JSONObject ? first.toString() : String.valueOf(first));
+        }
         if (!StrUtil.startWith(rechargePayload.trim(), "{")) {
             JSONObject session = new JSONObject();
             session.putOpt("accessToken", rechargePayload);
@@ -149,13 +163,35 @@ public class RedeemCloudRechargeServiceImpl implements RedeemCloudRechargeServic
         if (isExchangeBody(payload)) {
             return payload.toString();
         }
-        return verifyAccount(baseUrl, cardKey, rechargePayload).toString();
+        if (isSessionPayload(payload)) {
+            return verifyAccount(baseUrl, cardKey, payload.toString()).toString();
+        }
+        String sessionContent = getSessionContent(payload);
+        return verifyAccount(baseUrl, cardKey, StrUtil.isNotBlank(sessionContent) ? sessionContent : rechargePayload).toString();
     }
 
     private boolean isExchangeBody(JSONObject payload) {
         return payload.containsKey("cdkPackageName") && payload.containsKey("payload") && payload.containsKey("idp");
     }
 
+    private boolean isSessionPayload(JSONObject payload) {
+        return payload.containsKey("accessToken") && (payload.containsKey("user") || payload.containsKey("account") || payload.containsKey("expires"));
+    }
+
+    private String getSessionContent(JSONObject payload) {
+        String accessToken = payload.getStr("accessToken");
+        if (StrUtil.isBlank(accessToken)) {
+            return null;
+        }
+        accessToken = unwrapJsonString(accessToken);
+        if (StrUtil.startWith(accessToken.trim(), "{")) {
+            return accessToken;
+        }
+        JSONObject session = new JSONObject();
+        session.putOpt("accessToken", accessToken);
+        return session.toString();
+    }
+
     private JSONObject verifyAccount(String baseUrl, String cardKey, String content) {
         String url = baseUrl + "/account/verify?cdkCode=" + encode(cardKey) + "&content=" + encode(content);
         HttpResponse response = addBrowserHeaders(HttpRequest.post(url)
@@ -164,7 +200,7 @@ public class RedeemCloudRechargeServiceImpl implements RedeemCloudRechargeServic
         String body = response.body();
         log.info("redeemcloud account verify response: {}", body);
 
-        JSONObject jsonResponse = JSONUtil.parseObj(body);
+        JSONObject jsonResponse = parseResponseObject(body, "account verify");
         Object data = jsonResponse.get("data");
         if (isSuccessResponse(jsonResponse) && data instanceof JSONObject) {
             return (JSONObject) data;
@@ -193,6 +229,49 @@ public class RedeemCloudRechargeServiceImpl implements RedeemCloudRechargeServic
         return code != null && (code == SUCCESS_CODE || code == LEGACY_SUCCESS_CODE) && !Boolean.FALSE.equals(jsonResponse.getBool("flag"));
     }
 
+    private String parseDirectTaskId(String body) {
+        String responseBody = unwrapJsonString(body);
+        if (StrUtil.isBlank(responseBody) || StrUtil.startWith(responseBody.trim(), "{") || StrUtil.startWith(responseBody.trim(), "[")) {
+            return null;
+        }
+        return responseBody;
+    }
+
+    private JSONObject parseResponseObject(String body, String apiName) {
+        String responseBody = unwrapJsonString(body);
+        try {
+            if (StrUtil.startWith(responseBody.trim(), "[")) {
+                JSONArray array = JSONUtil.parseArray(responseBody);
+                if (!array.isEmpty() && array.get(0) instanceof JSONObject) {
+                    return (JSONObject) array.get(0);
+                }
+            }
+            return JSONUtil.parseObj(responseBody);
+        } catch (Exception e) {
+            throw BusinessRuntimeException.getInstance("redeemcloud {0} response is not json object: {1}", apiName, shortBody(responseBody));
+        }
+    }
+
+    private String unwrapJsonString(String value) {
+        String result = StrUtil.trim(value);
+        for (int i = 0; i < 3 && StrUtil.startWith(result, "\""); i++) {
+            try {
+                result = StrUtil.trim(Jsons.parseObject(result, String.class));
+            } catch (Exception e) {
+                return result;
+            }
+        }
+        return result;
+    }
+
+    private String shortBody(String body) {
+        if (StrUtil.isBlank(body)) {
+            return "";
+        }
+        String cleanBody = body.replaceAll("\\s+", " ");
+        return StrUtil.sub(cleanBody, 0, Math.min(cleanBody.length(), 200));
+    }
+
     private String encode(String value) {
         try {
             return URLEncoder.encode(value, StandardCharsets.UTF_8.name());