|
|
@@ -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());
|