You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.1 KiB

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"`
}
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())
}