80 lines
2.4 KiB
Go
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
|
|
}
|