package api import ( "github.com/gin-gonic/gin" "pay-bridge/internal/api/handler" "pay-bridge/internal/api/middleware" "pay-bridge/internal/app" ) // SetupRouter 注册所有路由 func SetupRouter(a *app.App) *gin.Engine { payHandler := handler.NewPayHandler(a.TradeSvc, a.RefundSvc) notifyHandler := handler.NewNotifyHandler(a.TradeSvc) adminHandler := handler.NewAdminHandler(a.MatchSvc, a.MerchantSvc, a.ReconSvc, a.ChannelSvc, a.AppSvc) authHandler := handler.NewAuthHandler(a.AdminAuthSvc) merchantHandler := handler.NewMerchantHandler(a.MerchantSvc) r := gin.New() r.Use(gin.Recovery()) r.Use(middleware.Trace()) r.Use(middleware.CacheBody()) // 健康检查 r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) // 上游渠道回调(渠道验签,不走 appId 鉴权) notify := r.Group("/api/v1/notify") { notify.POST("/payment/:channelCode", notifyHandler.PaymentCallback) } // 下游系统调用接口(appId+appSecret 签名鉴权) v1 := r.Group("/api/v1", middleware.Auth(a.AppSvc)) { pay := v1.Group("/pay") { pay.POST("/unified-order", payHandler.UnifiedOrder) pay.GET("/query/:tradeNo", payHandler.QueryOrder) pay.POST("/close", payHandler.CloseOrder) pay.POST("/refund", payHandler.Refund) pay.GET("/refund/query/:refundNo", payHandler.QueryRefund) } merchantGroup := v1.Group("/merchant") { merchantGroup.POST("", merchantHandler.CreateMerchant) merchantGroup.GET("", merchantHandler.ListMerchants) merchantGroup.POST("/upload-file", merchantHandler.UploadFile) merchantGroup.GET("/:merchantID", merchantHandler.GetMerchant) merchantGroup.POST("/:merchantID/apply", merchantHandler.Apply) merchantGroup.GET("/:merchantID/audit", merchantHandler.QueryAuditStatus) } } // 管理后台接口 adminPublic := r.Group("/api/v1/admin") { adminPublic.POST("/login", authHandler.Login) } admin := r.Group("/api/v1/admin", middleware.JWTAuth(a.AdminAuthSvc)) { admin.POST("/logout", authHandler.Logout) // 应用管理 appGroup := admin.Group("/app") { appGroup.POST("", adminHandler.CreateApp) appGroup.GET("", adminHandler.ListApps) appGroup.POST("/:appID/disable", adminHandler.DisableApp) appGroup.POST("/:appID/enable", adminHandler.EnableApp) appGroup.POST("/:appID/reset-secret", adminHandler.ResetAppSecret) } // 收款匹配 match := admin.Group("/match") { match.GET("/pending", adminHandler.ListPendingMatches) match.POST("/bind", adminHandler.ManualBindOrder) } // 商户管理 merchant := admin.Group("/merchant") { merchant.POST("", adminHandler.CreateMerchant) merchant.GET("", adminHandler.ListMerchants) merchant.POST("/upload-file", adminHandler.UploadMerchantFile) merchant.GET("/:merchantID", adminHandler.GetMerchant) merchant.POST("/:merchantID/freeze", adminHandler.FreezeMerchant) merchant.POST("/:merchantID/unfreeze", adminHandler.UnfreezeMerchant) merchant.POST("/:merchantID/apply", adminHandler.ApplyMerchant) merchant.GET("/:merchantID/audit", adminHandler.QueryAuditStatus) } // 对账管理 recon := admin.Group("/reconciliation") { recon.POST("/trigger", adminHandler.TriggerReconciliation) recon.GET("/report", adminHandler.GetReconciliationReport) recon.GET("/report/:reportID/exceptions", adminHandler.GetReconciliationExceptions) } } return r }