Преглед изворни кода

新增获取短信/邮件验证码接口

rdluck пре 4 година
родитељ
комит
5097e72332
6 измењених фајлова са 362 додато и 62 уклоњено
  1. 136 34
      controllers/wechat.go
  2. 7 0
      models/db.go
  3. 33 0
      models/msg_code.go
  4. 116 0
      services/sms.go
  5. 40 15
      swagger/swagger.json
  6. 30 13
      swagger/swagger.yml

+ 136 - 34
controllers/wechat.go

@@ -3,6 +3,7 @@ package controllers
 import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
 	"hongze/hongze_cygx/utils"
 	"strconv"
 	"github.com/medivhzhan/weapp/v2"
@@ -335,54 +336,155 @@ func (this *WechatController) GetPhoneNumber() {
 }
 
 
-// @Title 绑定手机号或邮箱
-// @Description 绑定手机号或邮箱
-// @Param	request	body models.WxGetPhoneNumberReq true "type json string"
-// @Success 200 {object} models.WxGetPhoneNumberResp
-// @router /bind [post]
-func (this *WechatController) Bind() {
+// @Title 获取短信验证码
+// @Description 获取短信验证码接口
+// @Param   Mobile   query   string  true       "手机号码"
+// @Param   AreaNum   query   string  true       "地区编码"
+// @Success Ret=200 获取成功
+// @router /getSmsCode [get]
+func (this *WechatController) GetSmsCode() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	var req models.WxGetPhoneNumberReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+	mobile := this.GetString("Mobile")
+	if mobile == "" {
+		br.Msg = "请输入手机号"
 		return
 	}
-	if req.EncryptedData == "" || req.Iv == "" {
-		br.Msg = "参数错误"
-		return
+	areaNum := this.GetString("AreaNum")
+	msgCode := utils.GetRandDigit(4)
+	var result bool
+	if areaNum == "86" || areaNum == "" || areaNum == "0" {
+		result = services.SendSmsCode(mobile, msgCode)
+	} else {
+		result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
 	}
-	user := this.User
-	if user == nil {
-		br.Msg = "请登陆"
-		br.Ret = 408
+	//发送成功
+	if result {
+		item := new(models.MsgCode)
+		item.OpenId = ""
+		item.Code = msgCode
+		item.Mobile = mobile
+		item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
+		item.Enabled = 1
+		item.CreatedTime = time.Now()
+		err := models.AddMsgCode(item)
+		if err != nil {
+			br.Msg = "发送失败"
+			br.ErrMsg = "发送失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "发送成功"
+	} else {
+		br.Msg = "发送失败"
+	}
+	br.Ret = 200
+	br.Success = true
+}
+
+
+// @Title 获取邮件验证码
+// @Description 获取邮件验证码接口
+// @Param   Email   query   string  true       "邮箱"
+// @Success Ret=200 获取成功
+// @router /getEmailCode [get]
+func (this *WechatController) GetEmailCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	email := this.GetString("Email")
+	if email == "" {
+		br.Msg = "请输入邮箱地址"
 		return
 	}
-	sessionKey := user.SessionKey
-	wxMobile, err := weapp.DecryptMobile(sessionKey, req.EncryptedData, req.Iv)
-	if err != nil {
-		br.Msg = "解析用户手机号信息失败"
-		br.ErrMsg = "解析用户手机号信息失败,Err:" + err.Error()
+	if !utils.ValidateEmailFormatat(email) {
+		br.Msg = "邮箱格式错误,请重新输入"
 		return
 	}
-	err = models.ModifyUsersMobile(user.UserId, wxMobile.PurePhoneNumber)
+	msgCode := utils.GetRandDigit(4)
+	content := "尊敬的用户:</br>您好,感谢您使用弘则研究,您正在进行邮箱验证,本次请求的验证码为:" + msgCode + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>弘则研究团队 </br>2019年05月11日"
+	title := "弘则研究登陆验证"
+	//发送邮件
+	result, err := utils.SendEmailByHz(title, content, email)
 	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
+		br.Msg = "发送失败"
+		br.ErrMsg = "发送失败,Err:" + err.Error()
 		return
 	}
-	resp := new(models.WxGetPhoneNumberResp)
-	resp.Authorization = this.Token
-	resp.PhoneNumber = wxMobile.PhoneNumber
-	resp.PurePhoneNumber = wxMobile.PurePhoneNumber
-	resp.CountryCode = wxMobile.CountryCode
-	br.Msg = "获取成功!"
+	if result {
+		item := new(models.MsgCode)
+		item.OpenId = ""
+		item.Code = msgCode
+		item.Mobile = email
+		item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
+		item.Enabled = 1
+		item.CreatedTime = time.Now()
+		err := models.AddMsgCode(item)
+		if err != nil {
+			br.Msg = "发送失败"
+			br.ErrMsg = "发送失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "发送成功"
+	} else {
+		br.Msg = "发送失败"
+	}
 	br.Ret = 200
 	br.Success = true
-	br.Data = resp
-}
+}
+//
+//// @Title 绑定手机号或邮箱
+//// @Description 绑定手机号或邮箱
+//// @Param	request	body models.WxGetPhoneNumberReq true "type json string"
+//// @Success 200 {object} models.WxGetPhoneNumberResp
+//// @router /bind [post]
+//func (this *WechatController) Bind() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.WxGetPhoneNumberReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.EncryptedData == "" || req.Iv == "" {
+//		br.Msg = "参数错误"
+//		return
+//	}
+//	user := this.User
+//	if user == nil {
+//		br.Msg = "请登陆"
+//		br.Ret = 408
+//		return
+//	}
+//	sessionKey := user.SessionKey
+//	wxMobile, err := weapp.DecryptMobile(sessionKey, req.EncryptedData, req.Iv)
+//	if err != nil {
+//		br.Msg = "解析用户手机号信息失败"
+//		br.ErrMsg = "解析用户手机号信息失败,Err:" + err.Error()
+//		return
+//	}
+//	err = models.ModifyUsersMobile(user.UserId, wxMobile.PurePhoneNumber)
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取失败,Err:" + err.Error()
+//		return
+//	}
+//	resp := new(models.WxGetPhoneNumberResp)
+//	resp.Authorization = this.Token
+//	resp.PhoneNumber = wxMobile.PhoneNumber
+//	resp.PurePhoneNumber = wxMobile.PurePhoneNumber
+//	resp.CountryCode = wxMobile.CountryCode
+//	br.Msg = "获取成功!"
+//	br.Ret = 200
+//	br.Success = true
+//	br.Data = resp
+//}

+ 7 - 0
models/db.go

@@ -18,6 +18,13 @@ func init() {
 	db, _ := orm.GetDB("default")
 	db.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("rddp", "mysql", utils.MYSQL_URL_RDDP)
+	orm.SetMaxIdleConns("rddp", 50)
+	orm.SetMaxOpenConns("rddp", 100)
+
+	report_db, _ := orm.GetDB("rddp")
+	report_db.SetConnMaxLifetime(10 * time.Minute)
+
 	//注册对象
 	orm.RegisterModel(
 		new(WxUser),

+ 33 - 0
models/msg_code.go

@@ -0,0 +1,33 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type MsgCode struct {
+	MsgCodeId       int `orm:"column(msg_code_id);pk"`
+	OpenId          string
+	Mobile          string
+	Code            string
+	ExpiredIn       int64
+	Enabled         int
+	CreatedTime     time.Time
+	LastUpdatedTime time.Time
+}
+
+//添加用户session信息
+func AddMsgCode(item *MsgCode) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	_, err = o.Insert(item)
+	return
+}
+
+func GetMsgCode(mobile, code string) (item *MsgCode, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `SELECT * FROM msg_code WHERE mobile=? AND code=? AND FROM_UNIXTIME(expired_in)>=NOW() `
+	err = o.Raw(sql, mobile, code).QueryRow(&item)
+	return
+}

+ 116 - 0
services/sms.go

@@ -0,0 +1,116 @@
+package services
+
+import (
+	"hongze/hongze_cygx/utils"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/url"
+	"net/http"
+)
+
+func SendSmsCode(mobile, vcode string) bool {
+	flag := false
+	tplId := "65692"
+	result, err := sendSms(mobile, tplId, vcode)
+	if err != nil {
+		fmt.Println("发送短信失败")
+		return false
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		go utils.SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		flag = true
+	} else {
+		go utils.SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	return flag
+}
+
+func sendSms(mobile, tplId, code string) (rs []byte, err error) {
+	var Url *url.URL
+	apiURL := "http://v.juhe.cn/sms/send"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("mobile", mobile)            //接受短信的用户手机号码
+	param.Set("tpl_id", tplId)             //您申请的短信模板ID,根据实际情况修改
+	param.Set("tpl_value", "#code#="+code) //您设置的模板变量,根据实际情况
+	param.Set("key", utils.JhGnAppKey)     //应用APPKEY(应用详细页查询)
+
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = param.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}
+
+
+func SendSmsCodeGj(mobile, vcode,areaNum string) bool {
+	flag := false
+	result, err := sendSmsGj(mobile, vcode,areaNum)
+	if err != nil {
+		fmt.Println("发送短信失败")
+		return false
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		go utils.SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		flag = true
+	} else {
+		go utils.SendEmail("短信验证码发送失败", " result"+string(result), utils.EmailSendToUsers)
+		flag = false
+	}
+	return flag
+}
+
+
+func sendSmsGj(mobile, code,areaNum string) (rs []byte, err error) {
+	var Url *url.URL
+	apiURL := "http://v.juhe.cn/smsInternational/send.php"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("mobile", mobile)            //接受短信的用户手机号码
+	param.Set("tplId", "10054")             //您申请的短信模板ID,根据实际情况修改
+	param.Set("tplValue", "#code#="+code) //您设置的模板变量,根据实际情况
+	param.Set("key", utils.JhGjAppKey)     //应用APPKEY(应用详细页查询)
+	param.Set("areaNum", areaNum)     //应用APPKEY(应用详细页查询)
+
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = param.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}

+ 40 - 15
swagger/swagger.json

@@ -15,30 +15,25 @@
     },
     "basePath": "/api",
     "paths": {
-        "/wechat/bind": {
-            "post": {
+        "/wechat/getEmailCode": {
+            "get": {
                 "tags": [
                     "wechat"
                 ],
-                "description": "绑定手机号或邮箱",
-                "operationId": "WechatController.绑定手机号或邮箱",
+                "description": "获取邮件验证码接口",
+                "operationId": "WechatController.获取邮件验证码",
                 "parameters": [
                     {
-                        "in": "body",
-                        "name": "request",
-                        "description": "type json string",
+                        "in": "query",
+                        "name": "Email",
+                        "description": "邮箱",
                         "required": true,
-                        "schema": {
-                            "$ref": "#/definitions/models.WxGetPhoneNumberReq"
-                        }
+                        "type": "string"
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "description": "",
-                        "schema": {
-                            "$ref": "#/definitions/models.WxGetPhoneNumberResp"
-                        }
+                    "Ret=200": {
+                        "description": "获取成功"
                     }
                 }
             }
@@ -71,6 +66,36 @@
                 }
             }
         },
+        "/wechat/getSmsCode": {
+            "get": {
+                "tags": [
+                    "wechat"
+                ],
+                "description": "获取短信验证码接口",
+                "operationId": "WechatController.获取短信验证码",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "Mobile",
+                        "description": "手机号码",
+                        "required": true,
+                        "type": "string"
+                    },
+                    {
+                        "in": "query",
+                        "name": "AreaNum",
+                        "description": "地区编码",
+                        "required": true,
+                        "type": "string"
+                    }
+                ],
+                "responses": {
+                    "Ret=200": {
+                        "description": "获取成功"
+                    }
+                }
+            }
+        },
         "/wechat/getUserInfo": {
             "post": {
                 "tags": [

+ 30 - 13
swagger/swagger.yml

@@ -11,24 +11,21 @@ info:
     url: http://www.apache.org/licenses/LICENSE-2.0.html
 basePath: /api
 paths:
-  /wechat/bind:
-    post:
+  /wechat/getEmailCode:
+    get:
       tags:
       - wechat
-      description: 绑定手机号或邮箱
-      operationId: WechatController.绑定手机号或邮箱
+      description: 获取邮件验证码接口
+      operationId: WechatController.获取邮件验证码
       parameters:
-      - in: body
-        name: request
-        description: type json string
+      - in: query
+        name: Email
+        description: 邮箱
         required: true
-        schema:
-          $ref: '#/definitions/models.WxGetPhoneNumberReq'
+        type: string
       responses:
-        "200":
-          description: ""
-          schema:
-            $ref: '#/definitions/models.WxGetPhoneNumberResp'
+        Ret=200:
+          description: 获取成功
   /wechat/getPhoneNumber:
     post:
       tags:
@@ -47,6 +44,26 @@ paths:
           description: ""
           schema:
             $ref: '#/definitions/models.WxGetPhoneNumberResp'
+  /wechat/getSmsCode:
+    get:
+      tags:
+      - wechat
+      description: 获取短信验证码接口
+      operationId: WechatController.获取短信验证码
+      parameters:
+      - in: query
+        name: Mobile
+        description: 手机号码
+        required: true
+        type: string
+      - in: query
+        name: AreaNum
+        description: 地区编码
+        required: true
+        type: string
+      responses:
+        Ret=200:
+          description: 获取成功
   /wechat/getUserInfo:
     post:
       tags: