package handlers import ( "errors" "platform/pkg/env" "platform/web/auth" "platform/web/services" s "platform/web/services" "regexp" "strconv" "github.com/gofiber/fiber/v2" "github.com/redis/go-redis/v9" ) type VerifierReq struct { Purpose s.VerifierSmsPurpose `json:"purpose"` Phone string `json:"phone"` } func SendSmsCode(c *fiber.Ctx) error { _, err := auth.GetAuthCtx(c).PermitOfficialClient() if err != nil { return err } // 解析请求参数 req := new(VerifierReq) if err := c.BodyParser(req); err != nil { return err } match, err := regexp.MatchString(`^1[3-9]\d{9}$`, req.Phone) if err != nil { return err } if !match { return fiber.NewError(fiber.StatusBadRequest, "手机号格式错误") } // 发送身份验证码 err = s.Verifier.SendSms(c.Context(), req.Phone, req.Purpose) if err != nil { var sErr s.VerifierServiceSendLimitErr if errors.As(err, &sErr) { return fiber.NewError(fiber.StatusTooManyRequests, strconv.Itoa(int(sErr))) } return err } // 发送成功 return nil } func SendSmsCodeForPassword(c *fiber.Ctx) error { ac, err := auth.GetAuthCtx(c).PermitUser() if err != nil { return err } if err := s.Verifier.SendSms(c.Context(), ac.User.Phone, s.VerifierSmsPurposePassword); err != nil { var sErr s.VerifierServiceSendLimitErr if errors.As(err, &sErr) { return fiber.NewError(fiber.StatusTooManyRequests, strconv.Itoa(int(sErr))) } return err } return nil } func DebugGetSmsCode(c *fiber.Ctx) error { if env.RunMode != env.RunModeDev { return fiber.NewError(fiber.StatusForbidden, "not allowed") } code, err := services.Verifier.GetSms(c.Context(), c.Params("phone")) if err != nil { if errors.Is(err, redis.Nil) { return c.SendString("还没有验证码") } return err } return c.SendString(code) }