You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

129 lines
3.6 KiB

package utility
import (
"CouponBackendGo/internal/consts"
"CouponBackendGo/internal/model/dto"
"encoding/json"
"errors"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"io/ioutil"
"net/http"
"strconv"
"strings"
)
// 查询数据库中的URL
func selectBaseUrl(hashKey string) *dto.Result {
//查询数据库
//env表中存储着一些所需要的地址,值等,可能是需要查出来存放到redis中(value字段中是值)
//key为"HLJW_URL"时,value为:http://39.101.133.168:8828/hljw,为测试环境时前置地址
value, err := g.DB().Model("env").Where("`key` = ?", hashKey).Value("value")
if err != nil {
return dto.Error("数据库env查询失败")
}
if value.IsNil() || value.String() == "" {
return dto.Error("未找到对应数据")
}
return dto.SuccessWithData(value.String())
}
// 获取URL
func getUrl(key, hashKey string) *dto.Result {
ctx := gctx.New()
//测试环境: http://39.101.133.168:8828/hljw/api/v2/member/info
//正式环境: http://api.homilychart.com:8828/hljw/api/v2/member/info
//1. 从Redis获取URL
redisUrl, err := g.Redis().Do(ctx, "HGET", key, hashKey)
if err == nil && redisUrl.String() != "" {
return dto.SuccessWithMsgAndData(fmt.Sprintf("从Redis获取URL: %s", redisUrl.String()), redisUrl.String())
}
//2. 如果Redis中没有, 查询数据库
urlResult := selectBaseUrl(hashKey)
if urlResult.Code != 200 {
return urlResult
}
url := urlResult.Data.(string)
//3. 将URL存入Redis
_, err = g.Redis().Do(ctx, "HSET", key, hashKey, url)
if err != nil {
return dto.Error("将数据存入Redis失败")
}
return dto.SuccessWithData(url)
}
// 获取jwcode
func GetJwcodeJSON(token string) (int, error) {
//获取基础URL 用于解析token的接口地址
urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY)
if urlResult.Code != 200 {
return 0, errors.New(fmt.Sprintf("获取基础URL失败: %s", urlResult.Message))
}
baseUrl := urlResult.Data.(string)
//拼接完整的URL, 用于发送请求并解析token
url := baseUrl + "/api/v2/member/info"
requestBody := strings.NewReader(`{"token":"` + token + `"}`)
//创建HTTP请求(POST)
req, err := http.NewRequest("POST", url, requestBody)
if err != nil {
return 0, fmt.Errorf("创建HTTP请求失败: %w", err)
}
//设置请求头
req.Header.Set("Content-Type", "application/json")
//发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return 0, fmt.Errorf("发送HTTP请求失败: %w", err) //
}
//延时关闭响应体
defer resp.Body.Close()
//检查HTTP状态码
if resp.StatusCode != http.StatusOK {
return 0, fmt.Errorf("HTTP请求失败, 状态码: %d", resp.StatusCode)
}
//读取并解析响应体
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return 0, fmt.Errorf("读取响应体失败: %w", err)
}
//解析JSON数据
var jsonResponse map[string]interface{}
err = json.Unmarshal(body, &jsonResponse)
if err != nil {
return 0, fmt.Errorf("解析JSON数据失败: %w", err)
}
//提取data节点
data, ok := jsonResponse["data"].(map[string]interface{})
if !ok {
return 0, errors.New("响应体中没有有效的data节点")
}
//提取jwcode字段节点并转换为整数
jwcode, ok := data["jwcode"].(string) //首先尝试解析为字符串
if ok {
jwcodeInt, err := strconv.Atoi(jwcode) //将字符串转换为整数
if err != nil {
return 0, fmt.Errorf("解析jwcode字段为整数失败: %w", err)
}
return jwcodeInt, nil
}
//如果jwcode不是字符串,返回错误日志
return 0, errors.New("响应体中没有有效的jwcode字段")
}