配置已保存

WLW OpenAPI 测试工具

完整的 API 测试工具和 SDK 示例代码

go SDK 示例

package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "net/http" "net/url" "sort" "strconv" "strings" "time" "github.com/google/uuid" ) type WLWClient struct { BaseURL string AccessKey string SecretKey string Client *http.Client } func NewWLWClient(baseURL, accessKey, secretKey string) *WLWClient { return &WLWClient{ BaseURL: baseURL, AccessKey: accessKey, SecretKey: secretKey, Client: &http.Client{Timeout: 30 * time.Second}, } } func (c *WLWClient) generateSignature(method, path string, params map[string]string) string { // 排序参数 var keys []string for k := range params { if k != "signature" { keys = append(keys, k) } } sort.Strings(keys) // 构造参数字符串 var paramStrs []string for _, key := range keys { paramStrs = append(paramStrs, fmt.Sprintf("%s=%s", key, params[key])) } // 构造签名字符串 signStr := fmt.Sprintf("%s%s%s%s", method, path, params["timestamp"], params["nonce"]) if len(paramStrs) > 0 { signStr += strings.Join(paramStrs, "&") } // HMAC-SHA256 签名 h := hmac.New(sha256.New, []byte(c.SecretKey)) h.Write([]byte(signStr)) return hex.EncodeToString(h.Sum(nil)) } func (c *WLWClient) Heartbeat() (map[string]interface{}, error) { params := map[string]string{ "access_key": c.AccessKey, "timestamp": strconv.FormatInt(time.Now().Unix(), 10), "nonce": uuid.New().String(), } params["signature"] = c.generateSignature("GET", "/api/v1/heartbeat", params) reqURL, _ := url.Parse(c.BaseURL + "/api/v1/heartbeat") q := reqURL.Query() for k, v := range params { q.Set(k, v) } reqURL.RawQuery = q.Encode() resp, err := c.Client.Get(reqURL.String()) if err != nil { return nil, err } defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) return result, nil } func (c *WLWClient) GetCardInfo(cardNo string) (map[string]interface{}, error) { params := map[string]string{ "access_key": c.AccessKey, "card_no": cardNo, "timestamp": strconv.FormatInt(time.Now().Unix(), 10), "nonce": uuid.New().String(), } params["signature"] = c.generateSignature("GET", "/api/v1/info", params) reqURL, _ := url.Parse(c.BaseURL + "/api/v1/info") q := reqURL.Query() for k, v := range params { q.Set(k, v) } reqURL.RawQuery = q.Encode() resp, err := c.Client.Get(reqURL.String()) if err != nil { return nil, err } defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) return result, nil } func (c *WLWClient) RestartCard(cardNo string) (bool, error) { params := map[string]string{ "access_key": c.AccessKey, "card_no": cardNo, "timestamp": strconv.FormatInt(time.Now().Unix(), 10), "nonce": uuid.New().String(), } params["signature"] = c.generateSignature("POST", "/api/v1/start", params) resp, err := c.Client.PostForm(c.BaseURL+"/api/v1/start", url.Values{ "access_key": {params["access_key"]}, "card_no": {params["card_no"]}, "timestamp": {params["timestamp"]}, "nonce": {params["nonce"]}, "signature": {params["signature"]}, }) if err != nil { return false, err } defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) if result["code"] != nil && result["code"].(float64) == 200 { return true, nil } return false, nil } func (c *WLWClient) StopCard(cardNo string) (bool, error) { params := map[string]string{ "access_key": c.AccessKey, "card_no": cardNo, "timestamp": strconv.FormatInt(time.Now().Unix(), 10), "nonce": uuid.New().String(), } params["signature"] = c.generateSignature("POST", "/api/v1/stop", params) resp, err := c.Client.PostForm(c.BaseURL+"/api/v1/stop", url.Values{ "access_key": {params["access_key"]}, "card_no": {params["card_no"]}, "timestamp": {params["timestamp"]}, "nonce": {params["nonce"]}, "signature": {params["signature"]}, }) if err != nil { return false, err } defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) if result["code"] != nil && result["code"].(float64) == 200 { return true, nil } return false, nil } func (c *WLWClient) OrderPackage(cardNo string, packageID, strategy int) (string, error) { params := map[string]string{ "access_key": c.AccessKey, "card_no": cardNo, "package_id": strconv.Itoa(packageID), "strategy": strconv.Itoa(strategy), "timestamp": strconv.FormatInt(time.Now().Unix(), 10), "nonce": uuid.New().String(), } params["signature"] = c.generateSignature("POST", "/api/v1/orders", params) resp, err := c.Client.PostForm(c.BaseURL+"/api/v1/orders", url.Values{ "access_key": {params["access_key"]}, "card_no": {params["card_no"]}, "package_id": {params["package_id"]}, "strategy": {params["strategy"]}, "timestamp": {params["timestamp"]}, "nonce": {params["nonce"]}, "signature": {params["signature"]}, }) if err != nil { return "", err } defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) if result["data"] != nil && result["data"].(map[string]interface{})["order_no"] != nil { return result["data"].(map[string]interface{})["order_no"].(string), nil } return "", fmt.Errorf("订单号获取失败") } func main() { client := NewWLWClient( "http://localhost:8080", "your_access_key", "your_secret_key", ) // 心跳检测 result, err := client.Heartbeat() if err != nil { fmt.Printf("心跳检测失败: %v\n", err) return } fmt.Printf("心跳检测成功: %+v\n", result) // 查询卡板信息 cardInfo, err := client.GetCardInfo("CARD123456789") if err != nil { fmt.Printf("查询卡板信息失败: %v\n", err) return } fmt.Printf("卡板信息: %+v\n", cardInfo) // 订购套餐示例 orderNo, err := client.OrderPackage("CARD123456789", 100, 1) if err != nil { fmt.Printf("订购套餐失败: %v\n", err) return } fmt.Printf("订购成功,订单号: %s\n", orderNo) }