diff --git a/services/game-service/internal/service/game/service.go b/services/game-service/internal/service/game/service.go index 81330832..b58c90dd 100644 --- a/services/game-service/internal/service/game/service.go +++ b/services/game-service/internal/service/game/service.go @@ -1007,8 +1007,9 @@ func buildLaunchURL(game gamedomain.LaunchableGame, session gamedomain.LaunchSes query.Set("session", token) query.Set("gameId", strings.TrimSpace(session.ProviderGameID)) query.Set("game_id", strings.TrimSpace(session.ProviderGameID)) - query.Set("callbackBase", "/api/v1/zgame/callback") - query.Set("callback_base", "/api/v1/zgame/callback") + callbackBase := config.CallbackBaseValue() + query.Set("callbackBase", callbackBase) + query.Set("callback_base", callbackBase) if config.DefaultLang != "" { query.Set("lang", config.DefaultLang) } diff --git a/services/game-service/internal/service/game/service_test.go b/services/game-service/internal/service/game/service_test.go index 7db50a53..07d39846 100644 --- a/services/game-service/internal/service/game/service_test.go +++ b/services/game-service/internal/service/game/service_test.go @@ -567,6 +567,7 @@ func TestLaunchGameBuildsZGameURL(t *testing.T) { "token_ttl_seconds":7200, "uid_mode":"display_user_id", "merchant_payload":"room_game", + "callback_base":"https://api.example.test/api/v1/zgame/callback", "bridge_script_url":"https://cdn.example/zgame-bridge.js", "bridge_script_version":"20260629.1", "game_urls":{"1001":"https://zgame.example/h5/1001"} @@ -607,8 +608,8 @@ func TestLaunchGameBuildsZGameURL(t *testing.T) { "session": token, "gameId": "1001", "game_id": "1001", - "callbackBase": "/api/v1/zgame/callback", - "callback_base": "/api/v1/zgame/callback", + "callbackBase": "https://api.example.test/api/v1/zgame/callback", + "callback_base": "https://api.example.test/api/v1/zgame/callback", "lang": "en", "roomId": "room_1", "room_id": "room_1", diff --git a/services/game-service/internal/service/game/zgame_adapter.go b/services/game-service/internal/service/game/zgame_adapter.go index 3af181d6..541ae5ef 100644 --- a/services/game-service/internal/service/game/zgame_adapter.go +++ b/services/game-service/internal/service/game/zgame_adapter.go @@ -38,6 +38,9 @@ type zgameAdapterConfig struct { // game_urls 支持 ZGame 每款游戏独立 H5 地址;launch_url_template 用于批量上新时按 provider_game_id 生成地址。 GameURLs map[string]string `json:"game_urls"` LaunchURLTemplate string `json:"launch_url_template"` + // callback_base 可按环境覆盖为完整公网 HTTPS 地址,避免 H5 在第三方域名下把相对路径解析到厂商域名。 + CallbackBase string `json:"callback_base"` + CallbackBaseAlias string `json:"callbackBase"` // merchant_payload 是 ZGame consume 回调的透传字段来源;只参与厂商回传,不进入内部业务判断。 MerchantPayload string `json:"merchant_payload"` // level/gender 是 ZGame 用户资料响应里的展示字段;真实等级接入前保持显式默认值,避免从其它体系误推。 @@ -58,6 +61,7 @@ func zgameConfigFromPlatform(value any) zgameAdapterConfig { config.UIDMode = strings.ToLower(strings.TrimSpace(config.UIDMode)) config.DefaultLang = strings.TrimSpace(config.DefaultLang) config.LaunchURLTemplate = strings.TrimSpace(config.LaunchURLTemplate) + config.CallbackBase = strings.TrimSpace(firstNonEmpty(config.CallbackBase, config.CallbackBaseAlias)) config.MerchantPayload = strings.TrimSpace(config.MerchantPayload) config.GameURLs = normalizeStringMap(config.GameURLs) return config @@ -70,6 +74,13 @@ func (c zgameAdapterConfig) TokenTTL() time.Duration { return zgameDefaultTokenTTL } +func (c zgameAdapterConfig) CallbackBaseValue() string { + if c.CallbackBase != "" { + return c.CallbackBase + } + return "/api/v1/zgame/callback" +} + func zgameLaunchBaseURL(game gamedomain.LaunchableGame, config zgameAdapterConfig) string { for _, key := range []string{game.ProviderGameID, game.GameID, strings.ToLower(game.GameID)} { if raw := strings.TrimSpace(config.GameURLs[strings.TrimSpace(key)]); raw != "" {