main.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "strings"
  10. "time"
  11. )
  12. type envelope struct {
  13. Result int `json:"Result"`
  14. Token string `json:"Token"`
  15. Data json.RawMessage `json:"Data"`
  16. ReMark string `json:"ReMark"`
  17. }
  18. func post(client *http.Client, baseURL, path string, payload interface{}) (envelope, error) {
  19. var result envelope
  20. body, err := json.Marshal(payload)
  21. if err != nil {
  22. return result, err
  23. }
  24. response, err := client.Post(strings.TrimRight(baseURL, "/")+path, "application/json", bytes.NewReader(body))
  25. if err != nil {
  26. return result, err
  27. }
  28. defer response.Body.Close()
  29. data, err := io.ReadAll(response.Body)
  30. if err != nil {
  31. return result, err
  32. }
  33. fmt.Printf("%s\n%s\n", path, string(data))
  34. if response.StatusCode != http.StatusOK {
  35. return result, fmt.Errorf("HTTP %d", response.StatusCode)
  36. }
  37. if err := json.Unmarshal(data, &result); err != nil {
  38. return result, fmt.Errorf("响应不是合法 POF JSON: %w", err)
  39. }
  40. if result.Result != 1 {
  41. return result, fmt.Errorf("%s", result.ReMark)
  42. }
  43. return result, nil
  44. }
  45. func main() {
  46. baseURL := flag.String("base-url", "http://127.0.0.1:8888", "Smart Parking server URL")
  47. username := flag.String("username", "pof-sim", "POF device username")
  48. password := flag.String("password", "pof-sim-123", "POF device password")
  49. plate := flag.String("plate", "粤A12345", "plate number of an active parking session")
  50. payType := flag.Int("pay-type", 0, "0=cash, 1=POS")
  51. noPay := flag.Bool("no-pay", false, "only login, query price and heartbeat")
  52. flag.Parse()
  53. client := &http.Client{Timeout: 10 * time.Second}
  54. login, err := post(client, *baseURL, "/api/login", map[string]string{"UserName": *username, "Password": *password})
  55. if err != nil {
  56. panic(err)
  57. }
  58. query, err := post(client, *baseURL, "/api/queryprice", map[string]interface{}{
  59. "Token": login.Token,
  60. "Data": map[string]string{"CarNo": *plate, "QueryTime": time.Now().Format("2006-01-02 15:04:05")},
  61. })
  62. if err != nil {
  63. panic(err)
  64. }
  65. var price struct {
  66. OrderID string `json:"OrderId"`
  67. CarNo string `json:"CarNo"`
  68. Price string `json:"Price"`
  69. }
  70. if err := json.Unmarshal(query.Data, &price); err != nil {
  71. panic(err)
  72. }
  73. if !*noPay {
  74. _, err = post(client, *baseURL, "/api/paysuccess", map[string]interface{}{
  75. "Token": login.Token,
  76. "Data": map[string]interface{}{
  77. "OrderId": price.OrderID, "CarNo": price.CarNo, "Money": price.Price,
  78. "PayTime": time.Now().Format("2006-01-02 15:04:05"), "PayType": *payType,
  79. "PayDev": 2, "DevId": "POF-SIM-01", "ReMark": "POF simulator",
  80. },
  81. })
  82. if err != nil {
  83. panic(err)
  84. }
  85. }
  86. if _, err := post(client, *baseURL, "/api/heartbeat", map[string]string{"Token": login.Token}); err != nil {
  87. panic(err)
  88. }
  89. }