package main import ( "bytes" "encoding/json" "flag" "fmt" "io" "net/http" "strings" "time" ) type envelope struct { Result int `json:"Result"` Token string `json:"Token"` Data json.RawMessage `json:"Data"` ReMark string `json:"ReMark"` } func post(client *http.Client, baseURL, path string, payload interface{}) (envelope, error) { var result envelope body, err := json.Marshal(payload) if err != nil { return result, err } response, err := client.Post(strings.TrimRight(baseURL, "/")+path, "application/json", bytes.NewReader(body)) if err != nil { return result, err } defer response.Body.Close() data, err := io.ReadAll(response.Body) if err != nil { return result, err } fmt.Printf("%s\n%s\n", path, string(data)) if response.StatusCode != http.StatusOK { return result, fmt.Errorf("HTTP %d", response.StatusCode) } if err := json.Unmarshal(data, &result); err != nil { return result, fmt.Errorf("响应不是合法 POF JSON: %w", err) } if result.Result != 1 { return result, fmt.Errorf("%s", result.ReMark) } return result, nil } func main() { baseURL := flag.String("base-url", "http://127.0.0.1:8888", "Smart Parking server URL") username := flag.String("username", "pof-sim", "POF device username") password := flag.String("password", "pof-sim-123", "POF device password") plate := flag.String("plate", "粤A12345", "plate number of an active parking session") payType := flag.Int("pay-type", 0, "0=cash, 1=POS") noPay := flag.Bool("no-pay", false, "only login, query price and heartbeat") flag.Parse() client := &http.Client{Timeout: 10 * time.Second} login, err := post(client, *baseURL, "/api/login", map[string]string{"UserName": *username, "Password": *password}) if err != nil { panic(err) } query, err := post(client, *baseURL, "/api/queryprice", map[string]interface{}{ "Token": login.Token, "Data": map[string]string{"CarNo": *plate, "QueryTime": time.Now().Format("2006-01-02 15:04:05")}, }) if err != nil { panic(err) } var price struct { OrderID string `json:"OrderId"` CarNo string `json:"CarNo"` Price string `json:"Price"` } if err := json.Unmarshal(query.Data, &price); err != nil { panic(err) } if !*noPay { _, err = post(client, *baseURL, "/api/paysuccess", map[string]interface{}{ "Token": login.Token, "Data": map[string]interface{}{ "OrderId": price.OrderID, "CarNo": price.CarNo, "Money": price.Price, "PayTime": time.Now().Format("2006-01-02 15:04:05"), "PayType": *payType, "PayDev": 2, "DevId": "POF-SIM-01", "ReMark": "POF simulator", }, }) if err != nil { panic(err) } } if _, err := post(client, *baseURL, "/api/heartbeat", map[string]string{"Token": login.Token}); err != nil { panic(err) } }