You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.4 KiB

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