xiexiaoyuan il y a 2 ans
Parent
commit
355049e1d2

+ 208 - 0
controllers/admin_wx.go

@@ -0,0 +1,208 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/services"
+	"hongze/hongze_mobile_admin/utils"
+	"time"
+)
+
+type AdminWxController struct {
+	BaseCommon
+}
+
+// SendSmsCode
+// @Title 发送短信验证码
+// @Description 发送短信验证码
+// @Param   Mobile   query   string  true       "手机号"
+// @Param   Token   query   string  true       "授权token"
+// @Success 200 {object} wechat.WxLoginResp
+// @router /send_sms_code [post]
+func (c *AdminWxController) SendSmsCode()  {
+	var req admin.SmsCodeReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	if req.Mobile == "" {
+		c.FailWithMessage("请输入手机号", "请输入手机号")
+		return
+	}
+	if req.Token == "" {
+		c.FailWithMessage("请输入授权标识", "请输入授权标识")
+		return
+	}
+	//获取token,如果没有token不允许发送验证码
+	infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
+	if err != nil {
+		c.FailWithMessage("授权信息不存在", "授权信息不存在"+err.Error())
+		return
+	}
+	info := map[string]string{"open_id":"", "union_id":""}
+	err = json.Unmarshal([]byte(infoJson), &info)
+	if err != nil {
+		c.FailWithMessage("授权信息解析失败", "授权信息解析失败"+err.Error())
+		return
+	}
+	openId := info["open_id"]
+	if openId == "" {
+		c.FailWithMessage("授权信息不存在", "授权信息不存在")
+		return
+	}
+	//如果该token中的openID已经被其他手机号绑定,则不允许发送验证码
+	adminInfo, err := admin.GetAdminWxByAdminOpenId(openId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+		}else{
+			c.FailWithMessage("查询管理员信息失败", "查询管理员信息失败"+err.Error())
+			return
+		}
+	}else{
+		if adminInfo.Mobile != req.Mobile {
+			c.FailWithMessage("该微信已被其他账号绑定", "该微信已被其他账号绑定")
+			return
+		}else{
+			resp := &admin.WxSmsResp{
+				BindFlag:  true,
+			}
+			c.OkDetailed(resp, "已绑定")
+			return
+		}
+	}
+
+	//判断手机号是否已绑定,如果已绑定openId,并且和token相等,则不允许发送验证码
+	adminMobileInfo, err := admin.GetAdminByMobile(req.Mobile)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			c.FailWithMessage("账号不存在,联系管理员", "账号不存在,联系管理员")
+			return
+		}
+		c.FailWithMessage("管理员账号查询失败", "管理员账号查询失败"+err.Error())
+		return
+	}
+	if adminMobileInfo.OpenId == openId {
+		resp := &admin.WxSmsResp{
+			BindFlag:  true,
+		}
+		c.OkDetailed(resp, "已绑定")
+		return
+	}
+
+	//发送短信
+	code :=  utils.GetRandDigit(4)
+	err = services.SendSmsCode(req.Mobile,"",utils.LOGIN_CODE, code)
+	if err != nil {
+		c.FailWithMessage("发送验证码失败", "发送验证码失败"+err.Error())
+		return
+	}
+	//存储验证码
+	err = utils.Rc.Put(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE+req.Mobile, code, 5*time.Minute)
+	if err != nil {
+		c.FailWithMessage("发送验证码失败", "保存验证码到redis中失败"+err.Error())
+		return
+	}
+	resp := &admin.WxSmsResp{
+		SmsFlag:  true,
+	}
+	c.OkDetailed(resp, "发送成功")
+	return
+}
+
+// BindMobile
+// @Title 绑定手机号
+// @Description 绑定手机号
+// @Param   Mobile   query   string  true       "手机号"
+// @Param   Token    query   string  true       "授权token"
+// @Param   Code     query   string  true       "短信验证码"
+// @Success 200 {object} wechat.WxLoginResp
+// @router /bind_mobile [post]
+func (c *AdminWxController) BindMobile()  {
+	var req admin.BindMobileReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	if req.Mobile == "" {
+		c.FailWithMessage("请输入手机号", "请输入手机号")
+		return
+	}
+	if req.Token == "" {
+		c.FailWithMessage("请输入授权标识", "请输入授权标识")
+		return
+	}
+	if req.Code == "" {
+		c.FailWithMessage("请输入验证码", "请输入验证码")
+		return
+	}
+	//校验验证码
+	_, err = utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE+req.Mobile)
+	if err != nil {
+		c.FailWithMessage("验证码错误或者已过期", "验证码错误或者已过期"+err.Error())
+		return
+	}
+	//获取token,如果没有token不允许发送验证码
+	infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
+	if err != nil {
+		c.FailWithMessage("授权信息不存在", "授权信息不存在"+err.Error())
+		return
+	}
+	info := map[string]string{"open_id":"", "union_id":""}
+	err = json.Unmarshal([]byte(infoJson), &info)
+	if err != nil {
+		c.FailWithMessage("授权信息解析失败", "授权信息解析失败"+err.Error())
+		return
+	}
+	openId := info["open_id"]
+	unionId := info["union_id"]
+	if openId == "" {
+		c.FailWithMessage("授权信息不存在", "授权信息不存在")
+		return
+	}
+	//如果该token中的openID已经被其他手机号绑定,则绑定openId
+	adminInfo, err := admin.GetAdminWxByAdminOpenId(openId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+		}else{
+			c.FailWithMessage("查询管理员信息失败", "查询管理员信息失败"+err.Error())
+			return
+		}
+	}else{
+		if adminInfo.Mobile != req.Mobile {
+			c.FailWithMessage("该微信已被其他账号绑定", "该微信已被其他账号绑定")
+			return
+		}else{
+			c.Ok()
+			return
+		}
+	}
+
+	//判断手机号是否已绑定,如果已绑定openId,并且和token不相等,则更新
+	adminMobileInfo, err := admin.GetAdminByMobile(req.Mobile)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			c.FailWithMessage("账号不存在,联系管理员", "账号不存在,联系管理员")
+			return
+		}
+		c.FailWithMessage("管理员账号查询失败", "管理员账号查询失败"+err.Error())
+		return
+	}
+	if adminMobileInfo.OpenId == openId {
+		c.Ok()
+		return
+	}
+
+	//更新openid
+	err = admin.UpdateAdminOpenIdUnionId(adminMobileInfo.AdminId, openId, unionId)
+	if err != nil {
+		c.FailWithMessage("绑定手机号失败", "绑定手机号失败"+err.Error())
+		return
+	}
+
+	c.Ok()
+	return
+}

+ 5 - 5
controllers/base_common.go

@@ -27,6 +27,7 @@ const (
 	TOKEN_ERROR = 401 //代表token异常,用户需要重新静默授权,获取最新的token
 	BIND_ERROR  = 403 //403代表用户需要进行绑定操作,需要跳转到输入账号密码绑定页面
 	SIGN_ERROR  = 3   //签名异常
+	WX_CODE_USED_ERROR = 4011 //待表微信授权code已使用
 )
 
 //返回数据
@@ -91,14 +92,13 @@ func (c BaseCommon) FailWithMessage(message, errMessage string) {
 	c.Result()
 }
 
-//token异常
-func (c BaseCommon) TokenError(data interface{}, message string) {
-	c.Response.Code = TOKEN_ERROR
+func (c BaseCommon) FailWithCodeUsed(message, errMessage string) {
+	c.Response.Code = WX_CODE_USED_ERROR
 	c.Response.Msg = message
-	c.Response.Data = data
+	c.Response.ErrMsg = errMessage
+	c.Response.Data = map[string]interface{}{}
 	c.Result()
 }
-
 //token异常
 func (c BaseCommon) TokenMsgError(message, errMessage string) {
 	c.Response.Code = TOKEN_ERROR

+ 93 - 0
controllers/wechat.go

@@ -284,3 +284,96 @@ func (c *WeChatCommon) WxAppLogin() {
 //	br.Ret = 200
 //	br.Success = true
 //}
+
+// AdminWeChatLogin
+// @Title 内部员工公众号(弘则部门)微信绑定接口
+// @Description 内部员工公众号(弘则部门)微信绑定接口
+// @Param   Code   query   string  true       "微信唯一编码code"
+// @Success 200 {object} wechat.WxLoginResp
+// @router /admin/login [get]
+func (c *WeChatCommon) AdminWeChatLogin() {
+	code := c.GetString("Code")
+	fmt.Println("code:", code)
+	utils.FileLog.Info("WechatLogin code:%s", code)
+
+	item, err := services.WxGetAdminOpenIdByCode(code)
+	if err != nil {
+		c.FailWithMessage(fmt.Sprintf("%v", err), fmt.Sprintf("%v", err))
+		return
+	}
+
+	if item.Errcode != 0 {
+		if item.Errcode == 40163 {
+			c.FailWithCodeUsed("获取用户信息失败", "获取access_token 失败 errCode:"+strconv.Itoa(item.Errcode)+" ;errMsg:"+item.Errmsg)
+			return
+		}
+		c.FailWithMessage("获取用户信息失败", "获取access_token 失败 errCode:"+strconv.Itoa(item.Errcode)+" ;errMsg:"+item.Errmsg)
+		return
+	}
+	openId := item.Openid
+	if openId == "" {
+		c.FailWithMessage("获取用户信息失败", "获取openid失败,openid:"+item.Openid)
+		return
+	}
+	accessToken, err := services.WxGetRedisAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
+	if err != nil {
+		c.FailWithMessage("获取用户信息失败", "获取access_token失败,err:"+err.Error())
+	}
+	//获取用户信息
+	wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
+	if err != nil {
+		c.FailWithMessage("获取用户信息失败", "获取微信用户信息失败,Err:"+err.Error())
+		return
+	}
+	userInfoJson, _ := json.Marshal(wxUserInfo)
+	utils.FileLog.Info("services.WxGetUserInfo:%s", string(userInfoJson))
+	if wxUserInfo.Errcode != 0 {
+		c.FailWithMessage("登录失败", "获取用户信息失败,err:"+string(userInfoJson))
+		return
+	}
+	/*item := &services.WxAccessToken{
+		AccessToken:  "",
+		ExpiresIn:    0,
+		RefreshToken: "",
+		Openid:       "openid1231243124343",
+		Unionid:      "unionid123123123",
+		Scope:        "",
+		Errcode:      0,
+		Errmsg:       "",
+	}
+
+	wxUserInfo := &services.WxUserInfo{
+		Openid:         "openid1231243124343",
+		Nickname:       "",
+		Sex:            0,
+		Language:       "",
+		City:           "",
+		Province:       "",
+		Country:        "",
+		Headimgurl:     "",
+		SubscribeTime:  0,
+		Unionid:        "unionid123123123",
+		Remark:         "",
+		Groupid:        0,
+		SubscribeScene: "",
+		SessionKey:     "",
+		Errcode:        0,
+		Errmsg:         "",
+	}*/
+	resp, err, errMsg := services.AdminWxLogin(item, wxUserInfo)
+	if err != nil {
+		c.FailWithMessage(errMsg, "微信登录失败,err:"+err.Error())
+		return
+	}
+
+	//登录日志
+	{
+		returnResult, err := json.Marshal(resp)
+		if err != nil {
+			utils.FileLog.Info(c.Ctx.Input.URI() + " Err:%s" + err.Error())
+		}
+		utils.FileLog.Info(c.Ctx.Input.URI()+" code: %s , return data: %s", code, string(returnResult))
+	}
+
+	c.OkDetailed(resp, "登录成功")
+}

+ 64 - 0
models/tables/admin/admin.go

@@ -31,6 +31,8 @@ type Admin struct {
 	GroupName               string `orm:"column(group_name);" json:"group_name"`           // 分组名称
 	Authority               int    `orm:"column(authority);" json:"authority"`             // 管理权限,0:无,1:部门负责人,2:小组负责人,3:超级管理员
 	Position                string `orm:"column(position);" json:"position"`               // 职位
+	OpenId                  string `orm:"column(open_id);" json:"open_id"`                 //弘则部门公众号的openid
+	UnionId                 string `orm:"column(union_id);" json:"union_id"`               //微信公众平台唯一标识
 }
 
 // 账号密码校验
@@ -121,3 +123,65 @@ type AdminItem struct {
 	DepartmentGroup         string `description:"部门分组"`
 	LabelVal                int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
 }
+
+type SmsCodeReq struct {
+	Mobile string
+	Token  string
+}
+
+type BindMobileReq struct {
+	Mobile string
+	Token  string
+	Code   string
+}
+type WxLoginResp struct {
+	BindToken string
+	BindFlag bool
+}
+
+
+type WxSmsResp struct {
+	SmsFlag  bool
+	BindFlag bool
+}
+
+// GetAdminWxByAdminOpenId 根据openId 获取管理员信息
+func GetAdminWxByAdminOpenId(openId string) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE open_id=? LIMIT 1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, openId).QueryRow(&item)
+	return
+}
+
+
+// GetAdminByMobile 根据手机号 获取管理员信息
+func GetAdminByMobile(mobile string) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE mobile=? LIMIT 1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, mobile).QueryRow(&item)
+	return
+}
+// UpdateAdminOpenIdUnionId 更新openId
+func UpdateAdminOpenIdUnionId(adminId int, openId, unionId string) (err error)  {
+	o := orm.NewOrm()
+	sql := `UPDATE admin
+			SET
+			  last_updated_time = NOW(),open_id=?,union_id=? WHERE admin_id = ? `
+	_, err = o.Raw(sql, openId, unionId, adminId).Exec()
+	return
+}
+
+type OpenIdList struct {
+	OpenId string
+	AdminId int
+}
+//GetOpenIdListByMobile 根据手机号获取用户的openid列表
+func GetOpenIdListByMobile(mobile, openIdStr string) (items []*OpenIdList, err error) {
+	sql := `SELECT admin_id, open_id FROM admin 
+          WHERE open_id != "" and mobile=? `
+	if openIdStr != "" {
+		sql += ` AND open_id in (` + openIdStr + `) `
+	}
+	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
+	return
+}

+ 5 - 0
routers/router.go

@@ -37,6 +37,11 @@ func init() {
 				&controllers.AdminCommon{},
 			),
 		),
+		web.NSNamespace("/admin_wx",
+			web.NSInclude(
+				&controllers.AdminWxController{},
+			),
+		),
 		web.NSNamespace("/approval",
 			web.NSInclude(
 				&controllers.ApprovalCommon{},

+ 54 - 0
services/admin_wechat.go

@@ -0,0 +1,54 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/utils"
+	"strconv"
+	"time"
+)
+
+
+//AdminWxLogin 内部员工公众号(弘则部门)微信登录
+func AdminWxLogin(wxAccessToken *WxAccessToken, wxUserInfo *WxUserInfo) (ret admin.WxLoginResp, err error, errMsg string) {
+	errMsg = `微信登录失败`
+	openId := wxAccessToken.Openid
+	unionId := wxAccessToken.Unionid
+	if unionId == "" {
+		unionId = wxUserInfo.Unionid
+	}
+
+	//firstLogin==1,强制绑定手机号或者邮箱
+	_, err = admin.GetAdminWxByAdminOpenId(openId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			//wxUser.FirstLogin = 1
+			/*err = ERR_ADMIN_NOT_BIND
+			errMsg = "用户没有绑定"
+			return*/
+			err = nil
+			timeUnix := time.Now().Unix()
+			timeUnixStr := strconv.FormatInt(timeUnix, 10)
+			ret.BindToken = utils.MD5(openId) + utils.MD5(timeUnixStr)
+			//把openid 相关信息保存到redis
+			content := make(map[string]string, 2)
+			content["open_id"] = openId
+			content["union_id"] = unionId
+			contentStr, _ := json.Marshal(content)
+			err = utils.Rc.Put(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+ret.BindToken, contentStr, 24*time.Hour)
+			if err != nil {
+				err = errors.New("保存登录信息到redis中失败 Err "+err.Error())
+				errMsg = "保存登录信息失败"
+				return
+			}
+			ret.BindFlag = false
+			return
+		}
+		errMsg = "查询账号失败"
+		return
+	}
+
+	ret.BindFlag = true
+	return
+}

+ 69 - 0
services/sms.go

@@ -0,0 +1,69 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_mobile_admin/services/alarm_msg"
+	"hongze/hongze_mobile_admin/utils"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+)
+
+func SendSmsCode(mobile, ip string, codeType int, vcode string) (err error) {
+	tplId := ""
+	switch codeType {
+	case utils.REGISTER_CODE:
+		tplId = "206722"
+	case utils.LOGIN_CODE:
+		tplId = "65692"
+	}
+	result, err := sendSms(mobile, tplId, vcode)
+	if err != nil {
+		return
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		go alarm_msg.SendAlarmMsg("短信验证码发送失败 ErrMsg:"+err.Error()+" result"+string(result), 3)
+		//go utils.SendEmail("短信验证码发送失败","err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		return
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+	} else {
+		err = errors.New(string(result))
+		go alarm_msg.SendAlarmMsg("短信验证码发送失败 ErrMsg:"+err.Error()+" result"+string(result), 3)
+		//go utils.SendEmail("短信验证码发送失败"," result"+string(result), utils.EmailSendToUsers)
+	}
+	return
+}
+
+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)
+}

+ 45 - 4
services/wechat.go

@@ -40,6 +40,22 @@ func WxGetUserOpenIdByCode(code string) (item *WxAccessToken, err error) {
 	return
 }
 
+func WxGetAdminOpenIdByCode(code string) (item *WxAccessToken, err error) {
+	if code == "" {
+		err = errors.New("code is empty")
+		return nil, err
+	}
+	requestUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
+	requestUrl = fmt.Sprintf(requestUrl, utils.AdminWxAppId, utils.AdminWxAppSecret, code)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return nil, err
+	}
+	utils.FileLog.Info("WxGetAdminOpenIdByCode:%s", string(result))
+	err = json.Unmarshal(result, &item)
+	return
+}
+
 type WxToken struct {
 	AccessToken string `json:"access_token"`
 	ExpiresIn   int    `json:"expires_in"`
@@ -47,9 +63,9 @@ type WxToken struct {
 	Errmsg      string `json:"errmsg"`
 }
 
-func WxGetToken() (item *WxToken, err error) {
+func WxGetToken(wxAppId, wxAppSecret string) (item *WxToken, err error) {
 	requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
-	requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret)
+	requestUrl = fmt.Sprintf(requestUrl, wxAppId, wxAppSecret)
 	fmt.Println("requestUrl:", requestUrl)
 	result, err := http.Get(requestUrl)
 	if err != nil {
@@ -71,7 +87,7 @@ func WxGetAccessToken() (accessToken string, err error) {
 	}
 	//wx_token 不存在
 	if wxToken == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-		token, err := WxGetToken()
+		token, err := WxGetToken(utils.WxAppId, utils.WxAppSecret)
 		if err != nil {
 			return accessToken, err
 		}
@@ -88,7 +104,7 @@ func WxGetAccessToken() (accessToken string, err error) {
 		accessToken = token.AccessToken
 	} else {
 		if wxToken.ExpiresIn <= time.Now().Unix() {
-			token, err := WxGetToken()
+			token, err := WxGetToken(utils.WxAppId, utils.WxAppSecret)
 			if err != nil {
 				return accessToken, err
 			}
@@ -110,6 +126,31 @@ func WxGetAccessToken() (accessToken string, err error) {
 	return
 }
 
+// WxGetRedisAccessToken 从redis中获取token
+func WxGetRedisAccessToken(wxAppId, wxAppSecret string) (accessToken string, err error) {
+	//从redis中获取token校验验证码
+	accessToken, err = utils.Rc.RedisString(utils.HZ_ADMIN_WX_ACCESS_TOEKN+wxAppId)
+	if err != nil {
+		err = nil
+		token, tErr := WxGetToken(wxAppId, wxAppSecret)
+		if tErr != nil {
+			return "", tErr
+		}
+		if token.Errmsg != "" {
+			err = errors.New("获取access_token 失败 errcode:" + token.Errmsg + " ;errmsg:" + token.Errmsg)
+			return "", err
+		}
+		err = utils.Rc.Put(utils.HZ_ADMIN_WX_ACCESS_TOEKN+wxAppId, token.AccessToken, 110 * time.Minute)
+		if err != nil {
+			err = errors.New("保存access_token失败 " + err.Error())
+			return accessToken, err
+		}
+		accessToken = token.AccessToken
+		return
+	}
+	return
+}
+
 type WxUserInfo struct {
 	Openid         string `json:"openid"`
 	Nickname       string `json:"nickname"`

+ 13 - 0
utils/config.go

@@ -29,6 +29,10 @@ var (
 	TemplateIdByCompanyApply        string //客户申请单审批通知-模板ID
 	TemplateCompanyApplyRedirectUrl string //审批单模板消息跳转地址
 
+	//内部员工公众号(弘则部门)
+	AdminWxAppId                    string
+	AdminWxAppSecret                string
+
 	//微信小程序appid
 	WxId2        string //微信原始ID
 	WxAppId2     string
@@ -186,6 +190,11 @@ func wxConfig() {
 
 		// 研报小程序
 		WxMsgTemplateIdWithYbCommunityQuestion = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0" // 研报小程序->问答社区回复通知
+
+		//内部员工公众号(弘则部门)
+		AdminWxAppId = "wx1392111da5426e9e"
+		AdminWxAppSecret = "30eceb7cf29bf2f046031155ab55d7b4"
+
 	} else {
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
@@ -205,6 +214,10 @@ func wxConfig() {
 		
 		// 研报小程序
 		WxMsgTemplateIdWithYbCommunityQuestion = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM" // 研报小程序->问答社区回复通知
+
+		//内部员工公众号(弘则部门)
+		AdminWxAppId = "wx1392111da5426e9e"
+		AdminWxAppSecret = "30eceb7cf29bf2f046031155ab55d7b4"
 	}
 
 }

+ 17 - 0
utils/constants.go

@@ -29,6 +29,20 @@ const (
 	RegularEmail  = `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`                                             //匹配电子邮箱
 )
 
+//验证码code
+const (
+	REGISTER_CODE = iota + 1 //注册
+	LOGIN_CODE               //登录
+)
+
+//聚合短信
+var (
+	JhGnTplId  = "65692"                            //聚合国内模板编码
+	JhGjTplId  = "10054"                            //聚合国内模板编码
+	JhGnAppKey = "4c8504c49dd335e99cfd7b6a3a9e2415" //聚合国内AppKey
+	JhGjAppKey = "3326ad2c1047a4cd92ace153e6044ca3"
+)
+
 //客户状态
 const (
 	COMPANY_STATUS_TRY_OUT       = "试用"
@@ -97,6 +111,9 @@ const (
 	CACHE_KEY_LOGS     = "HZ_ADMIN_CACHE_KEY_LOGS" //api用户操作日志队列
 	CACHE_KEY_ADMIN    = "calendar:admin:list"     //系统用户列表缓存key
 	CACHE_KEY_ADMIN_ID = "calendar:admin:id:list"  //系统用户列表缓存key
+	HZ_MOBILE_ADMIN_WXLOGIN_TOKEN = "hz_mobile_admin:wxLogin:admin_token:"
+	HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE = "hz_mobile_admin:wxLogin:mobile_code:"
+	HZ_ADMIN_WX_ACCESS_TOEKN = "hz_admin:wx:access_token:"
 )
 
 // 微信用户user_record注册平台