package gameopen import ( "crypto/md5" "encoding/base64" "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 callbackTokenSysOrigin(token string) string { token = normalizeCallbackToken(token) parts := strings.SplitN(token, ".", 2) if len(parts) != 2 || strings.TrimSpace(parts[1]) == "" { return "" } decoded, err := base64.StdEncoding.DecodeString(parts[1]) if err != nil { return "" } payload := strings.TrimSpace(string(decoded)) if unescaped, err := url.QueryUnescape(payload); err == nil { payload = strings.TrimSpace(unescaped) } fields := strings.Split(payload, ":") if len(fields) < 3 { return "" } return strings.ToUpper(strings.TrimSpace(fields[2])) } 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[:]) }