package gameopen import ( "crypto/md5" "encoding/hex" "fmt" "net/url" "strings" ) func buildQueryUserSign(req QueryUserRequest, key string) string { return md5Hex(req.GameID + req.UID + req.Token + req.RoomID + key) } func buildUpdateCoinSign(req UpdateCoinRequest, key string) string { return md5Hex( req.OrderID + req.GameID + req.RoundID + req.UID + fmt.Sprintf("%d", req.Coin) + fmt.Sprintf("%d", req.Type) + fmt.Sprintf("%d", req.RewardType) + req.Token + req.WinID + req.RoomID + key, ) } func buildSupplementSign(req SupplementRequest, key string) string { return md5Hex( req.OrderID + req.GameID + req.RoundID + req.UID + fmt.Sprintf("%d", req.Coin) + fmt.Sprintf("%d", req.RewardType) + req.WinID + req.RoomID + key, ) } func verifySign(actual, expected string) bool { return strings.EqualFold(strings.TrimSpace(actual), strings.TrimSpace(expected)) } func normalizeCallbackToken(token string) string { token = strings.TrimSpace(token) if token == "" { return "" } if decoded, err := url.QueryUnescape(token); err == nil { token = strings.TrimSpace(decoded) } if strings.HasPrefix(strings.ToLower(token), "bearer ") { token = strings.TrimSpace(token[len("bearer "):]) } parts := strings.SplitN(token, ".", 2) if len(parts) != 2 || parts[1] == "" { return token } switch len(parts[1]) % 4 { case 2: parts[1] += "==" case 3: parts[1] += "=" } return parts[0] + "." + parts[1] } func receiptTypeFromType(typed int) string { if typed == 2 { return "INCOME" } return "EXPENDITURE" } func md5Hex(value string) string { sum := md5.Sum([]byte(value)) return hex.EncodeToString(sum[:]) }