sms.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package controllers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "gopkg"
  8. "io/ioutil"
  9. "lzyd-user-api/common"
  10. "lzyd-user-api/models"
  11. "lzyd-user-api/services"
  12. "lzyd-user-api/utils"
  13. "net/http"
  14. "strconv"
  15. "time"
  16. )
  17. // @tags Sms
  18. // @Summary 获取短信验证码
  19. // @Description 获取短信验证码
  20. // @Produce json
  21. // @Param mobile query string true "手机号码"
  22. // @Param type query int true "短信验证码类型(1=注册登录)" Enums(1, 2, 3, 4) default(1)
  23. // @Success 200 {string} json "{"code":200, "message":"success"}"
  24. // @Router /sms/get [get]
  25. // @Security ApiKeyAuth
  26. func GetSms(c *gin.Context) {
  27. mobile := c.Query("mobile")
  28. smsType, _ := strconv.Atoi(c.Query("type"))
  29. tokenStr := c.GetHeader("x-app-id")
  30. if tokenStr != "lzyd" {
  31. common.GenMessageResp(c, common.InvalidParametes, "非法操作", nil)
  32. return
  33. }
  34. // 先校验手机号与短信类型
  35. if !gopkg.ValidMobilePhone(mobile) {
  36. common.GenMessageResp(c, common.InvalidParametes, "无效的手机号码", nil)
  37. return
  38. }
  39. if smsType < 1 || smsType > 5 {
  40. common.GenMessageResp(c, common.InvalidParametes, "不支持的短信类型", nil)
  41. return
  42. }
  43. // 校验手机号是否已被注册, 已被注册的手机号不下发短信
  44. //if smsType == 1 {
  45. // if services.ExistedMobile(mobile) {
  46. // common.GenMessageResp(c, common.InvalidParametes, "手机号码已被注册", nil)
  47. // return
  48. // }
  49. //}
  50. // 限制发送总量
  51. count := services.CountOfToday(common.DB, "lzyd_sms_valid")
  52. fmt.Println(count)
  53. if count > 5000 {
  54. common.GenMessageResp(c, 500, "超过短信限制", nil)
  55. return
  56. }
  57. // 先查看该手机号码的最后一条短信是否在一分钟分钟内
  58. var sms models.ValidSms
  59. sms = services.GetLastValidSms(common.DB, mobile, smsType)
  60. if time.Now().Unix()-common.SmsValidSeconds < sms.CreateAt {
  61. common.GenResp(c, -1, "发送频繁", nil)
  62. return
  63. }
  64. // 调用模板发送短信
  65. validCode, err := services.SendSingleSms(mobile, smsType)
  66. if err != nil {
  67. common.GenMessageResp(c, 500, err.Error(), nil)
  68. return
  69. }
  70. // 发送成功后插入数据
  71. sms.Mobile = mobile
  72. sms.ValidCode = validCode
  73. sms.SmsType = smsType
  74. if err := sms.Save(common.DB); err != nil {
  75. common.GenMessageResp(c, -1, err.Error(), nil)
  76. return
  77. }
  78. common.GenResp(c, 200, "SUCCESS", nil)
  79. }
  80. // @tags Sms
  81. // @Summary 发送提醒短信
  82. // @Description 发送提醒短信
  83. // @Accept json
  84. // @Produce json
  85. // @Param body body models.SendSmsReq true "短信请求内容"
  86. // @Success 200 {string} json "{"code":200, "message":"success"}"
  87. // @Router /sms/remind [post]
  88. // @Security ApiKeyAuth
  89. func SendRemindSms(c *gin.Context) {
  90. tokenStr := c.GetHeader("x-app-id")
  91. fmt.Println(tokenStr)
  92. if tokenStr != "lzyd" {
  93. common.GenMessageResp(c, common.InvalidParametes, "非法操作", nil)
  94. return
  95. }
  96. var req models.SendSmsReq
  97. err := c.ShouldBindJSON(&req)
  98. if err != nil {
  99. panic(err)
  100. }
  101. // 限制发送总量
  102. count := services.CountOfToday(common.DB, "sms_remind_info")
  103. if count > 2000 {
  104. common.GenMessageResp(c, -1, "超过下发次数", nil)
  105. return
  106. }
  107. timeUnix := time.Now().Unix()
  108. random := strconv.FormatInt(timeUnix, 10)
  109. url := common.SdkSmsUrl + "?sdkappid=" + common.SdkAppId + "&random=" + random
  110. // 请求包体
  111. var templ models.SmsTempl
  112. templ.Ext = ""
  113. templ.Extend = ""
  114. templ.Params = []string{req.Content}
  115. templ.Sig = utils.CalculateSigForTempl(common.SdkAppKey, random, []string{req.Mobile}, timeUnix)
  116. templ.Sign = ""
  117. templ.Time = timeUnix
  118. templ.TplID = common.SdkTemplId
  119. templ.Tel.NationCode = "86"
  120. templ.Tel.Mobile = req.Mobile
  121. // 请求腾讯云短信API
  122. jsonBytes, _ := json.Marshal(templ)
  123. resp, err := http.Post(url, "application/x-www-form-urlencoded", bytes.NewReader(jsonBytes))
  124. if err != nil {
  125. common.GenResp(c, 500, err.Error(), nil)
  126. return
  127. }
  128. defer func() {
  129. _ = resp.Body.Close()
  130. }()
  131. body, err := ioutil.ReadAll(resp.Body)
  132. if err != nil {
  133. common.GenResp(c, 500, err.Error(), nil)
  134. return
  135. }
  136. // 发送成功后插入数据
  137. sms := &models.RemindSms{
  138. Mobile: req.Mobile,
  139. SmsType: 1,
  140. Content: req.Content,
  141. IpAddr: gopkg.GetRemoteIP(c.Request),
  142. }
  143. if err := sms.Save(common.DB); err != nil {
  144. common.GenMessageResp(c, 500, err.Error(), nil)
  145. return
  146. }
  147. //fmt.Println(string(body))
  148. var smsResp models.SmsTemplResp
  149. _ = json.Unmarshal(body, &smsResp)
  150. if smsResp.Result == 0 {
  151. common.GenResp(c, common.Success, "SUCCESS", nil)
  152. } else {
  153. common.GenResp(c, 500, smsResp.ErrMsg, nil)
  154. }
  155. }