tianyuan-api-server/apps/api/internal/service/west_dex_service.go

123 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"bytes"
"encoding/json"
"fmt"
"github.com/zeromicro/go-zero/core/logx"
"io"
"net/http"
"strconv"
"tianyuan-api/apps/api/internal/config"
"tianyuan-api/pkg/crypto"
"tianyuan-api/pkg/errs"
"time"
)
type Wrapper[T any] struct {
Data T `json:"data"`
}
type WestResp struct {
Message string `json:"message"`
Code string `json:"code"`
Data string `json:"data"`
ID string `json:"id"`
ErrorCode *int `json:"error_code"`
Reason string `json:"reason"`
}
type WestDexService struct {
config config.WestConfig
}
// NewWestDexService 是一个构造函数,用于初始化 WestDexService
func NewWestDexService(config config.WestConfig) *WestDexService {
return &WestDexService{
config: config,
}
}
// CallAPI 调用西部数据的 API
func (w *WestDexService) CallAPI(code string, reqData map[string]interface{}) (resp []byte, err *errs.AppError) {
logx.Infof("西部请求传入%v", reqData)
// 生成当前的13位时间戳
timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10)
// 构造请求URL
reqUrl := fmt.Sprintf("%s/%s/%s?timestamp=%s", w.config.Url, w.config.SecretId, code, timestamp)
jsonData, marshalErr := json.Marshal(reqData)
if marshalErr != nil {
logx.Errorf("【西部数据请求】JSON编码错误: %v", marshalErr)
return nil, errs.ErrSystem
}
// 创建HTTP POST请求
req, newRequestErr := http.NewRequest("POST", reqUrl, bytes.NewBuffer(jsonData))
if newRequestErr != nil {
logx.Errorf("【西部数据请求】创建请求错误: %v", newRequestErr)
return nil, errs.ErrSystem
}
// 设置请求头
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
httpResp, clientDoErr := client.Do(req)
if clientDoErr != nil {
logx.Errorf("【西部数据请求】发送请求错误: %v", clientDoErr)
return nil, errs.ErrSystem
}
defer func(Body io.ReadCloser) {
closeErr := Body.Close()
if closeErr != nil {
}
}(httpResp.Body)
// 检查请求是否成功
if httpResp.StatusCode == 200 {
// 读取响应体
bodyBytes, ReadErr := io.ReadAll(httpResp.Body)
if ReadErr != nil {
logx.Errorf("【西部数据请求】读取响应体错误: %v", ReadErr)
return nil, errs.ErrSystem
}
// 手动调用 json.Unmarshal 触发自定义的 UnmarshalJSON 方法
var westDexResp WestResp
UnmarshalErr := json.Unmarshal(bodyBytes, &westDexResp)
if UnmarshalErr != nil {
logx.Errorf("【西部数据请求】JSON反序列化错误: %v", UnmarshalErr)
return nil, errs.ErrSystem
}
logx.Infof("西部请求响应%+v", westDexResp)
logx.Infof("西部流水号: %s", westDexResp.ID)
// 解密响应数据
decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key)
if DecryptErr != nil {
logx.Errorf("【西部数据请求】响应数据解密错误: %v", DecryptErr)
return nil, errs.ErrSystem
}
logx.Infof("西部请求响应Code%s", westDexResp.Code)
if westDexResp.Code != "00000" {
logx.Infof("到这1")
if westDexResp.Code == "-1" {
logx.Infof("到这2")
logx.Errorf("【西部数据请求】响应数据业务异常: %s %s %s", westDexResp.Message, westDexResp.Reason, string(decryptedData))
return decryptedData, errs.ErrDataSource
} else {
logx.Infof("到这3")
logx.Errorf("【西部数据请求】响应数据异常: %s %s %s", westDexResp.Message, westDexResp.Reason, string(decryptedData))
return nil, errs.ErrSystem
}
}
// 输出解密后的数据
return decryptedData, nil
}
logx.Errorf("【西部数据请求】请求失败,状态码: %d", httpResp.StatusCode)
return nil, errs.ErrSystem
}