|
@ -10,6 +10,7 @@ import ( |
|
|
"link_homework/internal/consts" |
|
|
"link_homework/internal/consts" |
|
|
"link_homework/internal/model/dto" |
|
|
"link_homework/internal/model/dto" |
|
|
"net/http" |
|
|
"net/http" |
|
|
|
|
|
"strconv" |
|
|
"strings" |
|
|
"strings" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
@ -47,7 +48,7 @@ func selectBaseUrl(hashKey string) *dto.Result { |
|
|
// 查询数据库
|
|
|
// 查询数据库
|
|
|
value, err := g.DB("cms").Model("env").Where("`key` = ?", hashKey).Value("value") |
|
|
value, err := g.DB("cms").Model("env").Where("`key` = ?", hashKey).Value("value") |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
g.Log().Errorf(ctx, "数据库查询失败, 错误: %v, key: %s", err, hashKey) |
|
|
|
|
|
|
|
|
//g.Log().Errorf(ctx, "数据库查询失败, 错误: %v, key: %s", err, hashKey)
|
|
|
return dto.Error("数据库查询失败") |
|
|
return dto.Error("数据库查询失败") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -60,13 +61,18 @@ func selectBaseUrl(hashKey string) *dto.Result { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 获取 jwcode
|
|
|
// 获取 jwcode
|
|
|
func GetJwcodeJSON(token string) (int, error) { // 返回类型改为 int
|
|
|
|
|
|
|
|
|
// 获取 jwcode
|
|
|
|
|
|
func GetJwcodeJSON(token string) (int, error) { // 返回类型为 int
|
|
|
|
|
|
ctx := gctx.New() |
|
|
|
|
|
|
|
|
// 1. 获取基础 URL
|
|
|
// 1. 获取基础 URL
|
|
|
urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY) |
|
|
urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY) |
|
|
if urlResult.Code != 200 { |
|
|
if urlResult.Code != 200 { |
|
|
|
|
|
g.Log().Errorf(ctx, "获取基础 URL 失败: %s", urlResult.Message) |
|
|
return 0, errors.New("获取基础 URL 失败: " + urlResult.Message) |
|
|
return 0, errors.New("获取基础 URL 失败: " + urlResult.Message) |
|
|
} |
|
|
} |
|
|
baseUrl := urlResult.Data.(string) |
|
|
baseUrl := urlResult.Data.(string) |
|
|
|
|
|
g.Log().Debugf(ctx, "成功获取基础 URL: %s", baseUrl) |
|
|
|
|
|
|
|
|
// 2. 拼接完整的 URL
|
|
|
// 2. 拼接完整的 URL
|
|
|
url := baseUrl + "/api/v2/member/info" |
|
|
url := baseUrl + "/api/v2/member/info" |
|
@ -75,7 +81,8 @@ func GetJwcodeJSON(token string) (int, error) { // 返回类型改为 int |
|
|
// 3. 创建 HTTP 请求
|
|
|
// 3. 创建 HTTP 请求
|
|
|
req, err := http.NewRequest("POST", url, requestBody) |
|
|
req, err := http.NewRequest("POST", url, requestBody) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return 0, fmt.Errorf("HTTP 请求创建失败: %v", err) |
|
|
|
|
|
|
|
|
g.Log().Errorf(ctx, "HTTP 请求创建失败: %v", err) |
|
|
|
|
|
return 0, fmt.Errorf("HTTP 请求创建失败: %w", err) |
|
|
} |
|
|
} |
|
|
req.Header.Set("Content-Type", "application/json") |
|
|
req.Header.Set("Content-Type", "application/json") |
|
|
|
|
|
|
|
@ -83,33 +90,53 @@ func GetJwcodeJSON(token string) (int, error) { // 返回类型改为 int |
|
|
client := &http.Client{} |
|
|
client := &http.Client{} |
|
|
resp, err := client.Do(req) |
|
|
resp, err := client.Do(req) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return 0, fmt.Errorf("HTTP 请求失败: %v", err) |
|
|
|
|
|
|
|
|
g.Log().Errorf(ctx, "HTTP 请求失败: %v", err) |
|
|
|
|
|
return 0, fmt.Errorf("HTTP 请求失败: %w", err) |
|
|
} |
|
|
} |
|
|
defer resp.Body.Close() |
|
|
defer resp.Body.Close() |
|
|
|
|
|
|
|
|
// 5. 检查 HTTP 状态码
|
|
|
// 5. 检查 HTTP 状态码
|
|
|
if resp.StatusCode != http.StatusOK { |
|
|
if resp.StatusCode != http.StatusOK { |
|
|
return 0, fmt.Errorf("HTTP 状态码错误: %v", resp.Status) |
|
|
|
|
|
|
|
|
g.Log().Errorf(ctx, "HTTP 状态码错误: %d", resp.StatusCode) |
|
|
|
|
|
return 0, fmt.Errorf("HTTP 状态码错误: %d", resp.StatusCode) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 6. 读取并解析响应体
|
|
|
// 6. 读取并解析响应体
|
|
|
body, err := ioutil.ReadAll(resp.Body) |
|
|
body, err := ioutil.ReadAll(resp.Body) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return 0, fmt.Errorf("读取响应失败: %v", err) |
|
|
|
|
|
|
|
|
g.Log().Errorf(ctx, "读取响应失败: %v", err) |
|
|
|
|
|
return 0, fmt.Errorf("读取响应失败: %w", err) |
|
|
} |
|
|
} |
|
|
|
|
|
g.Log().Debugf(ctx, "响应体内容: %s", string(body)) |
|
|
|
|
|
|
|
|
// 7. 解析 JSON 数据
|
|
|
// 7. 解析 JSON 数据
|
|
|
var jsonResponse map[string]interface{} |
|
|
var jsonResponse map[string]interface{} |
|
|
if err = json.Unmarshal(body, &jsonResponse); err != nil { |
|
|
if err = json.Unmarshal(body, &jsonResponse); err != nil { |
|
|
return 0, fmt.Errorf("解析 JSON 失败: %v", err) |
|
|
|
|
|
|
|
|
g.Log().Errorf(ctx, "解析 JSON 失败: %v", err) |
|
|
|
|
|
return 0, fmt.Errorf("解析 JSON 失败: %w", err) |
|
|
|
|
|
} |
|
|
|
|
|
g.Log().Debugf(ctx, "解析后的 JSON: %+v", jsonResponse) |
|
|
|
|
|
|
|
|
|
|
|
// 8. 提取 data 节点
|
|
|
|
|
|
data, ok := jsonResponse["data"].(map[string]interface{}) |
|
|
|
|
|
if !ok { |
|
|
|
|
|
g.Log().Errorf(ctx, "响应体中没有 data 节点,完整响应: %+v", jsonResponse) |
|
|
|
|
|
return 0, errors.New("响应体中没有 data 节点") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 8. 提取并直接返回 jwcode
|
|
|
|
|
|
if data, ok := jsonResponse["data"].(map[string]interface{}); ok { |
|
|
|
|
|
if jwcode, exists := data["jwcode"].(float64); exists { // 确保将 jwcode 作为数字解析
|
|
|
|
|
|
return int(jwcode), nil // 转换为整数并返回
|
|
|
|
|
|
|
|
|
// 9. 提取 jwcode 并转换为整数
|
|
|
|
|
|
jwcode, ok := data["jwcode"].(string) // 首先尝试解析为字符串
|
|
|
|
|
|
if ok { |
|
|
|
|
|
jwcodeInt, err := strconv.Atoi(jwcode) // 将字符串转换为整数
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
g.Log().Errorf(ctx, "解析 jwcode 字段失败: %v", err) |
|
|
|
|
|
return 0, fmt.Errorf("解析 jwcode 字段失败: %w", err) |
|
|
} |
|
|
} |
|
|
|
|
|
g.Log().Infof(ctx, "成功获取 jwcode: %d", jwcodeInt) |
|
|
|
|
|
return jwcodeInt, nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return 0, errors.New("响应体中没有 jwcode") |
|
|
|
|
|
|
|
|
// 如果 jwcode 不是字符串,记录错误日志
|
|
|
|
|
|
g.Log().Errorf(ctx, "data 节点中没有 jwcode 字段,或字段格式不正确,data: %+v", data) |
|
|
|
|
|
return 0, errors.New("响应体中没有有效的 jwcode 字段") |
|
|
} |
|
|
} |