2024-10-28 14:41:27 +08:00
|
|
|
|
package sms
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
"health-go/config"
|
2024-11-14 01:15:55 +08:00
|
|
|
|
"health-go/model"
|
2024-10-28 14:41:27 +08:00
|
|
|
|
"math/rand"
|
|
|
|
|
"net/http"
|
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Request(c *gin.Context) {
|
|
|
|
|
var user struct {
|
|
|
|
|
Tel string `json:"tel"`
|
|
|
|
|
}
|
|
|
|
|
if err := c.ShouldBindJSON(&user); err != nil {
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
|
|
|
"code": 400,
|
|
|
|
|
"msg": "无效的请求参数",
|
|
|
|
|
"data": nil,
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if PreValidate(user.Tel) == "notExist" {
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
|
|
"code": 200,
|
|
|
|
|
"data": nil,
|
|
|
|
|
"msg": "用户不存在, 正在注册"})
|
|
|
|
|
register(user.Tel)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if PreValidate(user.Tel) == "reachLimit" {
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
|
|
"code": 200,
|
|
|
|
|
"data": nil,
|
|
|
|
|
"msg": "已达到发送上限"})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if PreValidate(user.Tel) == "ok" {
|
|
|
|
|
config.DB.Table("user").Where("tel = ?", user.Tel).Update("SMS_try",
|
|
|
|
|
gorm.Expr("SMS_try + ?", 1))
|
|
|
|
|
code := GenerateCode()
|
|
|
|
|
callBack := SendMsg(user.Tel, code)
|
|
|
|
|
if callBack == "success" {
|
|
|
|
|
config.RDC.Set(config.CTX, user.Tel, code, 5*time.Minute)
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
|
|
"code": 200,
|
|
|
|
|
"data": nil,
|
|
|
|
|
"msg": "验证码已发送"})
|
|
|
|
|
return
|
|
|
|
|
} else if callBack == "frequency_limit" {
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
|
|
"code": 200,
|
|
|
|
|
"data": nil,
|
|
|
|
|
"msg": "服务端发送频率限制",
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SendMsg(tel string, code string) string {
|
|
|
|
|
client, err := dysmsapi.NewClientWithAccessKey(
|
|
|
|
|
"cn-hangzhou",
|
|
|
|
|
"LTAI5tAYdQcmbGAAiMhGs8sT",
|
|
|
|
|
"PU5WmUbAOsSQ8lQNTMPMD170ONxBLl")
|
|
|
|
|
request := dysmsapi.CreateSendSmsRequest()
|
|
|
|
|
request.Scheme = "https"
|
|
|
|
|
request.PhoneNumbers = tel //手机号变量值
|
|
|
|
|
request.SignName = "Biter健康助手" //签名
|
|
|
|
|
request.TemplateCode = "SMS_472460337" //模板编码
|
|
|
|
|
request.TemplateParam = "{\"code\":\"" + code + "\"}"
|
|
|
|
|
response, err := client.SendSms(request)
|
|
|
|
|
// Aliyun SMS API callback response code
|
|
|
|
|
fmt.Println(response.Code)
|
|
|
|
|
if response.Code == "isv.BUSINESS_LIMIT_CONTROL" {
|
|
|
|
|
return "frequency_limit"
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Print(err.Error())
|
|
|
|
|
return "send failed: " + err.Error()
|
|
|
|
|
}
|
|
|
|
|
return "success"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GenerateCode 生成6位随机验证码
|
|
|
|
|
func GenerateCode() string {
|
|
|
|
|
rand.NewSource(time.Now().UnixNano())
|
|
|
|
|
code := rand.Intn(899999) + 100000
|
|
|
|
|
res := strconv.Itoa(code)
|
|
|
|
|
return res
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 注册
|
|
|
|
|
func register(userTel string) {
|
2024-11-14 01:15:55 +08:00
|
|
|
|
user := model.User{Tel: userTel}
|
2024-10-28 14:41:27 +08:00
|
|
|
|
// 写入数据库,用户ID自增
|
|
|
|
|
if err := config.DB.Select("tel").Create(&user).Error; err != nil {
|
|
|
|
|
fmt.Println("register error:", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
fmt.Println("register success for", userTel)
|
|
|
|
|
}
|