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)
}