package main
import (
"crypto/hmac"
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"strings"
"time"
)
const (
BaseURL = "https://api.fa-piao.com"
AppKey = "YOUR_APP_KEY"
AppSecret = "YOUR_SECRET_KEY"
)
func generateRandomString(length int) string {
const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, length)
rand.Read(b)
for i := range b {
b[i] = charset[b[i]%byte(len(charset))]
}
return string(b)
}
func calculateSignature(method, path, randomString, timestamp string) string {
signContent := fmt.Sprintf(
"Method=%s&Path=%s&RandomString=%s&TimeStamp=%s&AppKey=%s",
method, path, randomString, timestamp, AppKey,
)
mac := hmac.New(sha256.New, []byte(AppSecret))
mac.Write([]byte(signContent))
return strings.ToUpper(hex.EncodeToString(mac.Sum(nil)))
}
func createRequestBody(params map[string]string) (io.Reader, string) {
body := &strings.Builder{}
writer := multipart.NewWriter(body)
for key, value := range params {
_ = writer.WriteField(key, value)
}
writer.Close()
return strings.NewReader(body.String()), writer.FormDataContentType()
}
func main() {
path := "/v5/enterprise/authorization"
method := "POST"
params := map[string]string{
"nsrsbh": "915101820724315989"
}
randomString := generateRandomString(20)
timestamp := fmt.Sprintf("%d", time.Now().Unix())
signature := calculateSignature(method, path, randomString, timestamp)
payload, contentType := createRequestBody(params)
req, _ := http.NewRequest(method, BaseURL+path, payload)
req.Header.Set("AppKey", AppKey)
req.Header.Set("Sign", signature)
req.Header.Set("TimeStamp", timestamp)
req.Header.Set("RandomString", randomString)
req.Header.Set("Content-Type", contentType)
fmt.Printf("%s: %s%s\n", method, BaseURL, path)
headers := map[string]string{
"AppKey": AppKey,
"Sign": signature,
"TimeStamp": timestamp,
"RandomString": randomString,
"Content-Type": contentType,
}
headersJson, _ := json.Marshal(headers)
fmt.Printf("headers: %s\n", headersJson)
paramsJson, _ := json.Marshal(params)
fmt.Printf("form-data: %s\n", paramsJson)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Printf("HTTP状态码: %d\n", resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(body))
}