108 lines
3.3 KiB
Go
108 lines
3.3 KiB
Go
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
|
||
}
|