first commit
This commit is contained in:
		
							
								
								
									
										199
									
								
								app/user/cmd/api/internal/service/westdexService.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								app/user/cmd/api/internal/service/westdexService.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | ||||
| package service | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| 	"tydata-server/app/user/cmd/api/internal/config" | ||||
| 	"tydata-server/pkg/lzkit/crypto" | ||||
| ) | ||||
|  | ||||
| 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 G05HZ01WestResp struct { | ||||
| 	Message   string          `json:"message"` | ||||
| 	Code      string          `json:"code"` | ||||
| 	Data      json.RawMessage `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(c config.Config) *WestDexService { | ||||
| 	return &WestDexService{ | ||||
| 		config: c.WestConfig, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // CallAPI 调用西部数据的 API | ||||
| func (w *WestDexService) CallAPI(code string, reqData map[string]interface{}) (resp []byte, err error) { | ||||
| 	// 生成当前的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 { | ||||
| 		return nil, marshalErr | ||||
| 	} | ||||
|  | ||||
| 	// 创建HTTP POST请求 | ||||
| 	req, newRequestErr := http.NewRequest("POST", reqUrl, bytes.NewBuffer(jsonData)) | ||||
| 	if newRequestErr != nil { | ||||
| 		return nil, newRequestErr | ||||
| 	} | ||||
|  | ||||
| 	// 设置请求头 | ||||
| 	req.Header.Set("Content-Type", "application/json") | ||||
|  | ||||
| 	// 发送请求 | ||||
| 	client := &http.Client{} | ||||
| 	httpResp, clientDoErr := client.Do(req) | ||||
| 	if clientDoErr != nil { | ||||
| 		return nil, clientDoErr | ||||
| 	} | ||||
| 	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 { | ||||
| 			return nil, ReadErr | ||||
| 		} | ||||
|  | ||||
| 		// 手动调用 json.Unmarshal 触发自定义的 UnmarshalJSON 方法 | ||||
| 		var westDexResp WestResp | ||||
| 		UnmarshalErr := json.Unmarshal(bodyBytes, &westDexResp) | ||||
| 		if UnmarshalErr != nil { | ||||
| 			return nil, UnmarshalErr | ||||
| 		} | ||||
| 		if westDexResp.Code != "00000" { | ||||
| 			if westDexResp.Data == "" { | ||||
| 				return nil, errors.New(westDexResp.Message) | ||||
| 			} | ||||
| 			decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key) | ||||
| 			if DecryptErr != nil { | ||||
| 				return nil, DecryptErr | ||||
| 			} | ||||
| 			return decryptedData, errors.New(westDexResp.Message) | ||||
| 			log.Println(string(decryptedData)) | ||||
| 		} | ||||
| 		if westDexResp.Data == "" { | ||||
| 			return nil, errors.New(westDexResp.Message) | ||||
| 		} | ||||
| 		// 解密响应数据 | ||||
| 		decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key) | ||||
| 		if DecryptErr != nil { | ||||
| 			return nil, DecryptErr | ||||
| 		} | ||||
| 		// 输出解密后的数据 | ||||
| 		log.Println(string(decryptedData)) | ||||
|  | ||||
| 		return decryptedData, nil | ||||
| 	} | ||||
|  | ||||
| 	return nil, fmt.Errorf("西部请求失败Code: %d", httpResp.StatusCode) | ||||
| } | ||||
|  | ||||
| // CallAPI 调用西部数据的 API | ||||
| func (w *WestDexService) G05HZ01CallAPI(code string, reqData map[string]interface{}) (resp []byte, err error) { | ||||
| 	// 生成当前的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.SecretSecondId, code, timestamp) | ||||
|  | ||||
| 	jsonData, marshalErr := json.Marshal(reqData) | ||||
| 	if marshalErr != nil { | ||||
| 		return nil, marshalErr | ||||
| 	} | ||||
|  | ||||
| 	// 创建HTTP POST请求 | ||||
| 	req, newRequestErr := http.NewRequest("POST", reqUrl, bytes.NewBuffer(jsonData)) | ||||
| 	if newRequestErr != nil { | ||||
| 		return nil, newRequestErr | ||||
| 	} | ||||
|  | ||||
| 	// 设置请求头 | ||||
| 	req.Header.Set("Content-Type", "application/json") | ||||
|  | ||||
| 	// 发送请求 | ||||
| 	client := &http.Client{} | ||||
| 	httpResp, clientDoErr := client.Do(req) | ||||
| 	if clientDoErr != nil { | ||||
| 		return nil, clientDoErr | ||||
| 	} | ||||
| 	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 { | ||||
| 			return nil, ReadErr | ||||
| 		} | ||||
|  | ||||
| 		// 手动调用 json.Unmarshal 触发自定义的 UnmarshalJSON 方法 | ||||
| 		var westDexResp G05HZ01WestResp | ||||
| 		UnmarshalErr := json.Unmarshal(bodyBytes, &westDexResp) | ||||
| 		if UnmarshalErr != nil { | ||||
| 			return nil, UnmarshalErr | ||||
| 		} | ||||
| 		if westDexResp.Code != "0000" { | ||||
| 			if westDexResp.Data == nil { | ||||
| 				return nil, errors.New(westDexResp.Message) | ||||
| 			} else { | ||||
| 				return westDexResp.Data, errors.New(string(westDexResp.Data)) | ||||
| 			} | ||||
| 		} | ||||
| 		if westDexResp.Data == nil { | ||||
| 			return nil, errors.New(westDexResp.Message) | ||||
| 		} | ||||
| 		return westDexResp.Data, nil | ||||
| 	} | ||||
|  | ||||
| 	return nil, fmt.Errorf("西部请求失败Code: %d", httpResp.StatusCode) | ||||
| } | ||||
|  | ||||
| func (w *WestDexService) Encrypt(data string) string { | ||||
| 	encryptedValue, err := crypto.WestDexEncrypt(data, w.config.Key) | ||||
| 	if err != nil { | ||||
| 		panic("WestDexEncrypt error: " + err.Error()) | ||||
| 	} | ||||
| 	return encryptedValue | ||||
| } | ||||
|  | ||||
| // GetDateRange 返回今天到明天的日期范围,格式为 "yyyyMMdd-yyyyMMdd" | ||||
| func (w *WestDexService) GetDateRange() string { | ||||
| 	today := time.Now().Format("20060102")                        // 获取今天的日期 | ||||
| 	tomorrow := time.Now().Add(24 * time.Hour).Format("20060102") // 获取明天的日期 | ||||
| 	return fmt.Sprintf("%s-%s", today, tomorrow)                  // 拼接日期范围并返回 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user