yumi-golang/internal/router/game_open_routes.go
2026-04-22 19:57:28 +08:00

80 lines
2.4 KiB
Go

package router
import (
"encoding/json"
"net/http"
"strings"
"chatapp3-golang/internal/config"
"chatapp3-golang/internal/service/gameopen"
"github.com/gin-gonic/gin"
)
// registerGameOpenRoutes 注册统一三方游戏回调接口。
func registerGameOpenRoutes(engine *gin.Engine, cfg config.Config, service *gameopen.GameOpenService) {
if service == nil {
return
}
callbackGroup := engine.Group("/game/open")
callbackGroup.POST("/user-info", func(c *gin.Context) {
raw, _ := c.GetRawData()
var req gameopen.QueryUserRequest
if err := json.Unmarshal(raw, &req); err != nil {
c.JSON(http.StatusOK, gameopen.CallbackResponse{ErrorCode: 4001, ErrorMsg: err.Error()})
return
}
c.JSON(http.StatusOK, service.HandleQueryUser(c.Request.Context(), req, string(raw)))
})
callbackGroup.POST("/update-coin", func(c *gin.Context) {
raw, _ := c.GetRawData()
var req gameopen.UpdateCoinRequest
if err := json.Unmarshal(raw, &req); err != nil {
c.JSON(http.StatusOK, gameopen.CallbackResponse{ErrorCode: 4001, ErrorMsg: err.Error()})
return
}
c.JSON(http.StatusOK, service.HandleUpdateCoin(c.Request.Context(), req, string(raw)))
})
callbackGroup.POST("/supplement", func(c *gin.Context) {
raw, _ := c.GetRawData()
var req gameopen.SupplementRequest
if err := json.Unmarshal(raw, &req); err != nil {
c.JSON(http.StatusOK, gameopen.CallbackResponse{ErrorCode: 4001, ErrorMsg: err.Error()})
return
}
c.JSON(http.StatusOK, service.HandleSupplement(c.Request.Context(), req, string(raw)))
})
internalGroup := engine.Group("/internal/game/open")
internalGroup.Use(internalSecretMiddleware(cfg.HTTP.InternalCallbackSecret))
internalGroup.GET("/info", func(c *gin.Context) {
resp, err := service.GetIntegrationInfo(c.Request.Context(), resolvePublicBaseURL(c, cfg))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
}
func resolvePublicBaseURL(c *gin.Context, cfg config.Config) string {
if value := strings.TrimRight(strings.TrimSpace(cfg.GameOpen.PublicBaseURL), "/"); value != "" {
return value
}
scheme := "http"
if forwarded := strings.TrimSpace(c.GetHeader("X-Forwarded-Proto")); forwarded != "" {
scheme = forwarded
} else if c.Request.TLS != nil {
scheme = "https"
}
host := strings.TrimSpace(c.GetHeader("X-Forwarded-Host"))
if host == "" {
host = strings.TrimSpace(c.Request.Host)
}
if host == "" {
return ""
}
return scheme + "://" + host
}