package main import ( "crypto/md5" "encoding/json" "fmt" "io" "log" "net/http" "strings" "time" ) const TIME_FORMAT = "2006-01-02 15:04:05" func main() { var unitId string fmt.Print("unitId账号数据输入 : ") _, err := fmt.Scan(&unitId) // 读取输入并赋值给变量 if err != nil { fmt.Println("输入错误:", err) return } var config string fmt.Print("输入充值配置Id(101-106) : ") _, err = fmt.Scan(&config) // 读取输入并赋值给变量 if err != nil { fmt.Println("输入错误:", err) return } configs := map[string]string{ "101": "6", "102": "30", "103": "68", "104": "198", "105": "328", "106": "648", } if configs[config] == "" { fmt.Println("输入错误, 请输入(101-106)的id:") _, err = fmt.Scan(&config) // 读取输入并赋值给变量 if err != nil { fmt.Println("输入错误:", err) return } return } tradeNo := fmt.Sprintf("GM%v%v", config, time.Now().UnixMilli()) body := map[string]string{"unitId": unitId, "server": "1", "channel": "000000000000", "rechargeId": config, "tradeStatus": "SUCCESS", "externalTradeNo": tradeNo, "totalAmount": configs[config], "tradeNo": tradeNo, "buyerId": "", "createTime": time.Now().Format(TIME_FORMAT), "payedTime": time.Now().Format(TIME_FORMAT)} sendToServer(body) ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() fmt.Println("操作完成... (输入 'ctrl-c' 退出)") for { select { case <-ticker.C: // 这里可以添加条件检查(如读取文件、网络请求等) default: // 非阻塞检查用户输入(需配合 goroutine) } } } func addServerMd5(body map[string]string) string { data := body["unitId"] + body["server"] + body["channel"] + body["rechargeId"] + body["tradeStatus"] + body["externalTradeNo"] + body["totalAmount"] + body["tradeNo"] + body["buyerId"] + body["createTime"] + body["payedTime"] + "b93ac9c70a071c537542f6fe95cf4d67" sign := fmt.Sprintf("%x", md5.Sum([]byte(data))) log.Printf("data: %s, md5: %s", data, sign) return fmt.Sprintf("%x", md5.Sum([]byte(data))) } type TradeRes struct { T string `json:"_t"` Error int `json:"Error"` Message string `json:"Message"` } func sendToServer(body map[string]string) string { //url := "http://192.168.2.100:30300/Recharge" url := "http://127.0.0.1:30300/Recharge" log.Printf("notify========== url: %s", url) body["sign"] = addServerMd5(body) buf, err := json.Marshal(body) if err != nil { fmt.Println(err) return err.Error() } reqBody := strings.NewReader(string(buf)) log.Printf("notify========== url: %s, reqBody: %v", url, reqBody) reqt, _ := http.NewRequest("GET", url, reqBody) response, err := http.DefaultClient.Do(reqt) if err != nil { log.Printf("notify========== server callback Error %s", err.Error()) return err.Error() } // 这里要格式化再输出,因为 ReadAll 返回的是字节切片 log.Printf("notify========== server callback StatusCode %d", response.StatusCode) defer response.Body.Close() bytes, err := io.ReadAll(response.Body) if err != nil { return err.Error() } // 这里要格式化再输出,因为 ReadAll 返回的是字节切片 log.Printf("notify========== server callback Body %s", bytes) if response.StatusCode == 200 { var tradeRes TradeRes err = json.Unmarshal(bytes, &tradeRes) if tradeRes.Error == 400000 { return "SUCCESS" } else { return tradeRes.Message } } return fmt.Sprint(response.StatusCode) }