This commit is contained in:
2026-06-19 12:53:33 +08:00
parent 69d6377bc6
commit b9819b913b
19 changed files with 1243 additions and 5 deletions

View File

@@ -0,0 +1,134 @@
package tianyuanapi
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
)
const (
whitelistEntriesPath = "query-whitelist/entries"
whitelistEntriesAppendPath = "query-whitelist/entries/append"
)
// WhitelistEntryPayload 查询白名单请求明文
type WhitelistEntryPayload struct {
Name string `json:"name"`
IdCard string `json:"id_card"`
ApiCodes []string `json:"api_codes"`
Remark string `json:"remark,omitempty"`
}
// WhitelistEntryData 查询白名单响应解密数据
type WhitelistEntryData struct {
Id string `json:"id"`
Name string `json:"name"`
IdCardMasked string `json:"id_card_masked"`
ApiCodes []string `json:"api_codes"`
Status string `json:"status"`
Remark string `json:"remark"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
}
// WhitelistResponse 查询白名单调用结果(保留天远原始业务码)
type WhitelistResponse struct {
Code int `json:"code"`
Message string `json:"message"`
TransactionID string `json:"transaction_id"`
Data *WhitelistEntryData `json:"data,omitempty"`
Timeout int64 `json:"timeout"`
}
// CreateWhitelistEntry 创建查询白名单规则
func (c *Client) CreateWhitelistEntry(payload WhitelistEntryPayload, mgmtKey string) (*WhitelistResponse, error) {
return c.callWhitelist(whitelistEntriesPath, payload, mgmtKey)
}
// AppendWhitelistEntry 向已有规则追加产品编码
func (c *Client) AppendWhitelistEntry(payload WhitelistEntryPayload, mgmtKey string) (*WhitelistResponse, error) {
return c.callWhitelist(whitelistEntriesAppendPath, payload, mgmtKey)
}
func (c *Client) callWhitelist(path string, payload WhitelistEntryPayload, mgmtKey string) (*WhitelistResponse, error) {
startTime := time.Now()
jsonData, err := json.Marshal(payload)
if err != nil {
return nil, fmt.Errorf("参数序列化失败: %v", err)
}
encryptedData, err := c.encrypt(string(jsonData))
if err != nil {
return nil, fmt.Errorf("数据加密失败: %v", err)
}
requestBody := map[string]interface{}{
"data": encryptedData,
}
requestBodyBytes, err := json.Marshal(requestBody)
if err != nil {
return nil, fmt.Errorf("请求体序列化失败: %v", err)
}
url := fmt.Sprintf("%s/api/v1/%s", c.baseURL, path)
httpReq, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(requestBodyBytes))
if err != nil {
return nil, fmt.Errorf("创建HTTP请求失败: %v", err)
}
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Access-Id", c.accessID)
httpReq.Header.Set("Whitelist-Mgmt-Key", mgmtKey)
httpReq.Header.Set("User-Agent", "TianyuanAPI-Go-SDK/1.0.0")
resp, err := c.client.Do(httpReq)
if err != nil {
return &WhitelistResponse{
Code: -1,
Message: "请求失败: " + err.Error(),
Timeout: time.Since(startTime).Milliseconds(),
}, nil
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return &WhitelistResponse{
Code: -1,
Message: "读取响应失败: " + err.Error(),
Timeout: time.Since(startTime).Milliseconds(),
}, nil
}
var apiResp ApiResponse
if err := json.Unmarshal(body, &apiResp); err != nil {
return &WhitelistResponse{
Code: -1,
Message: "响应解析失败: " + err.Error(),
Timeout: time.Since(startTime).Milliseconds(),
}, nil
}
result := &WhitelistResponse{
Code: apiResp.Code,
Message: apiResp.Message,
TransactionID: apiResp.TransactionID,
Timeout: time.Since(startTime).Milliseconds(),
}
if apiResp.Data != "" {
decryptedData, err := c.decrypt(apiResp.Data)
if err == nil {
var entry WhitelistEntryData
if json.Unmarshal([]byte(decryptedData), &entry) == nil {
result.Data = &entry
}
}
}
return result, nil
}