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