package payment import ( "backend/config" "backend/internal/dto" paymentservice "backend/internal/service/payment" "io" "net/http" "strings" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // PaymentConfigController 支付配置管理控制器(仅管理员,挂在 JWT 保护组下) // Logan.Li type PaymentConfigController struct { svc *paymentservice.ConfigService } // NewPaymentConfigController 创建控制器 // Logan.Li func NewPaymentConfigController(db *gorm.DB, cfg *config.Config) *PaymentConfigController { return &PaymentConfigController{svc: paymentservice.NewConfigService(db, cfg)} } // GetConfig 获取支付配置(敏感字段脱敏) // Logan.Li func (ctrl *PaymentConfigController) GetConfig(c *gin.Context) { data, err := ctrl.svc.Get() if err != nil { c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"code": 0, "data": data}) } // UpdateConfig 保存支付配置 // Logan.Li func (ctrl *PaymentConfigController) UpdateConfig(c *gin.Context) { var req dto.PaymentConfigUpdate if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误:" + err.Error()}) return } data, err := ctrl.svc.Update(req) if err != nil { c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"code": 0, "message": "支付配置已保存", "data": data}) } // Upload 上传证书/私钥(multipart:kind + file) // Logan.Li func (ctrl *PaymentConfigController) Upload(c *gin.Context) { kind := strings.TrimSpace(c.PostForm("kind")) if kind == "" { kind = strings.TrimSpace(c.Query("kind")) } fileHeader, err := c.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "未收到文件(字段名应为 file)"}) return } f, err := fileHeader.Open() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "读取上传文件失败"}) return } defer f.Close() content, err := io.ReadAll(io.LimitReader(f, 256*1024)) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "读取上传文件失败"}) return } data, err := ctrl.svc.Upload(kind, fileHeader.Filename, content) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"code": 0, "message": data.Message, "data": data}) } // Test 用已保存凭据做一次最小连通性校验 // Logan.Li func (ctrl *PaymentConfigController) Test(c *gin.Context) { var req dto.PaymentTestRequest if err := c.ShouldBindJSON(&req); err != nil { // 允许空 body,默认测试全部渠道 // Logan.Li req = dto.PaymentTestRequest{} } data := ctrl.svc.Test(req.Channel) // 业务失败也返回 200 + code=0,结果在 results[].status 中体现,避免前端弹 500 // Logan.Li c.JSON(http.StatusOK, gin.H{"code": 0, "message": "测试完成", "data": data}) } // FetchWechatPlatformCerts 自动获取微信支付平台证书 // Logan.Li func (ctrl *PaymentConfigController) FetchWechatPlatformCerts(c *gin.Context) { items, msg, err := ctrl.svc.FetchWechatPlatformCerts() if err != nil { c.JSON(http.StatusOK, gin.H{"code": 1, "message": err.Error()}) return } if items == nil { c.JSON(http.StatusOK, gin.H{"code": 1, "message": msg, "data": gin.H{"items": []any{}}}) return } c.JSON(http.StatusOK, gin.H{"code": 0, "message": msg, "data": gin.H{"items": items}}) }