package login import ( "epur-pay/pkg/aliyun" "epur-pay/pkg/dapi" "epur-pay/pkg/logger" "epur-pay/pkg/redis" "errors" "fmt" redigo "github.com/gomodule/redigo/redis" ) type SsoSendSmsCodeParams struct { Mobile string `json:"mobile"` } // SsoSendSmsCode 发送短信验证码接口 // @Summary 发送短信验证码 // @Description 该接口用于发送短信验证码,限制验证码的发送频率和每天发送的次数。 // @Tags sms // @Accept json // @Produce json // @Param body body SsoSendSmsCodeParams true "发送短信验证码的请求参数" // @Success 200 {object} dapi.ResponseCommon "短信验证码发送成功" // @Router /api/v1/login/captcha [post] func SsoSendSmsCode(a *dapi.ApiBase, params *SsoSendSmsCodeParams) error { redisCodeKey := fmt.Sprintf("smscode:%s", params.Mobile) redisDailyKey := fmt.Sprintf("smscode_daily:%s", params.Mobile) conn := redis.RPool.Get() defer func() { if err := conn.Close(); err != nil { logger.ErrorLogger.Infoln(err.Error()) } }() code, err := conn.Do("GET", redisCodeKey) if err == nil && code != nil { return a.ReturnPublicErrorResponse(a.Translate("sms_code_sent_frequently")) } dailyCount, err := redigo.Int(conn.Do("GET", redisDailyKey)) if err != nil && !errors.Is(err, redigo.ErrNil) { logger.ErrorLogger.Errorln("获取验证码次数失败:", err.Error()) return a.ReturnPublicErrorResponse(a.Translate("sms_code_fetch_limit_failed")) } if errors.Is(err, redigo.ErrNil) { dailyCount = 0 } if dailyCount >= 10 { return a.ReturnPublicErrorResponse(a.Translate("sms_code_daily_limit")) } captcha, err := aliyun.SendSmsLogin(params.Mobile) if err != nil { logger.ErrorLogger.Errorln("发送短信失败:", err.Error()) return a.ReturnPublicErrorResponse(a.Translate("sms_code_send_failed")) } if _, err := conn.Do("SETEX", redisCodeKey, 300, captcha); err != nil { logger.ErrorLogger.Errorln("设置验证码60s时效失败:", err.Error()) return a.ReturnPublicErrorResponse(a.Translate("sms_code_cache_failed")) } if dailyCount == 0 { if _, err := conn.Do("SETEX", redisDailyKey, 86400, 1); err != nil { logger.ErrorLogger.Errorln("设置一天最大发送验证码次数失败:", err.Error()) return a.ReturnPublicErrorResponse(a.Translate("sms_code_daily_record_failed")) } } else { if _, err := conn.Do("INCR", redisDailyKey); err != nil { logger.ErrorLogger.Errorln("验证码发送次数记录失败:", err.Error()) return a.ReturnPublicErrorResponse(a.Translate("sms_code_daily_record_failed")) } } return a.ReturnSuccessCustomResponse(a.NewSuccessResponseCommon()) }