Browse Source

新公众号:弘则部门 微信授权绑定手机号

xiexiaoyuan 2 years ago
parent
commit
18f16797b7

+ 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 == "" || unionId == "" {
+		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
+}

+ 89 - 1
controllers/wechat.go

@@ -38,7 +38,7 @@ func (c *WeChatCommon) WeChatLogin() {
 	if openId == "" {
 		c.FailWithMessage("获取用户信息失败", "获取openid失败,openid:"+item.Openid)
 	}
-	accessToken, err := services.WxGetAccessToken()
+	accessToken, err := services.WxGetAccessToken(utils.WxAppId, utils.WxAppSecret)
 	if err != nil {
 		c.FailWithMessage("获取用户信息失败", "获取access_token失败,err:"+err.Error())
 	}
@@ -284,3 +284,91 @@ 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 {
+		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.WxGetAccessToken(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
+	}
+	if wxUserInfo.Errcode != 0 {
+		userInfoJson, _ := json.Marshal(wxUserInfo)
+		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())
+		}
+		code := 200
+		utils.FileLog.Info(c.Ctx.Input.URI()+" code: %s , return data: %s", code, string(returnResult))
+	}
+
+	c.OkDetailed(resp, "登录成功")
+}

+ 49 - 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,50 @@ 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
+}

+ 3 - 2
models/tables/wx_token/wx_token.go

@@ -6,16 +6,17 @@ type WxToken struct {
 	AccessToken string
 	ExpiresIn   int64
 	Id          int `orm:"column(id);pk"`
+	WxAppId     string
 }
 
-func GetWxToken() (item *WxToken, err error) {
+func GetWxToken(wxAppId string) (item *WxToken, err error) {
 	sql := `SELECT *  FROM wx_token `
 	o := orm.NewOrm()
 	err = o.Raw(sql).QueryRow(&item)
 	return
 }
 
-func AddWxToken(token string, expiresIn int64) (err error) {
+func AddWxToken(token string, expiresIn int64, wxAppId string) (err error) {
 	sql := `INSERT INTO wx_token(access_token, expires_in)VALUES(?,?) `
 	o := orm.NewOrm()
 	_, err = o.Raw(sql, token, expiresIn).Exec()

+ 27 - 0
routers/commentsRouter.go

@@ -277,6 +277,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminWxController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminWxController"],
+        beego.ControllerComments{
+            Method: "BindMobile",
+            Router: `/bind_mobile`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminWxController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminWxController"],
+        beego.ControllerComments{
+            Method: "SendSmsCode",
+            Router: `/send_sms_code`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
         beego.ControllerComments{
             Method: "ApplyApprove",
@@ -655,6 +673,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"],
+        beego.ControllerComments{
+            Method: "AdminWeChatLogin",
+            Router: `/admin/login`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"],
         beego.ControllerComments{
             Method: "WeChatLogin",

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

+ 24 - 8
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 {
@@ -63,15 +79,15 @@ func WxGetToken() (item *WxToken, err error) {
 	return
 }
 
-func WxGetAccessToken() (accessToken string, err error) {
-	wxToken, err := wx_token.GetWxToken()
+func WxGetAccessToken(wxAppId, wxAppSecret string) (accessToken string, err error) {
+	wxToken, err := wx_token.GetWxToken(wxAppId)
 	fmt.Println(err, wxToken)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return
 	}
 	//wx_token 不存在
 	if wxToken == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-		token, err := WxGetToken()
+		token, err := WxGetToken(wxAppId, wxAppSecret)
 		if err != nil {
 			return accessToken, err
 		}
@@ -80,7 +96,7 @@ func WxGetAccessToken() (accessToken string, err error) {
 			return "", err
 		}
 		expiresIn := time.Now().Add(110 * time.Minute).Unix()
-		err = wx_token.AddWxToken(token.AccessToken, expiresIn)
+		err = wx_token.AddWxToken(token.AccessToken, expiresIn, wxAppId)
 		if err != nil {
 			err = errors.New("新增wx_token失败" + err.Error())
 			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(wxAppId, wxAppSecret)
 			if err != nil {
 				return accessToken, err
 			}
@@ -195,7 +211,7 @@ type WxUsers struct {
 }
 
 func WxUsersGet() (openIdStr string) {
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.WxAppId, utils.WxAppSecret)
 	if err != nil {
 		utils.FileLog.Info("GetWxAccessToken Err:%s", err.Error())
 		return

+ 10 - 84
services/wechat_send_msg.go

@@ -4,89 +4,15 @@ import (
 	"bytes"
 	"encoding/json"
 	"fmt"
-	"hongze/hongze_mobile_admin/models/tables/report"
 	"hongze/hongze_mobile_admin/models/tables/user_template_record"
 	"hongze/hongze_mobile_admin/models/tables/wx_user"
 	"hongze/hongze_mobile_admin/services/alarm_msg"
 	"hongze/hongze_mobile_admin/utils"
 	"io/ioutil"
 	"net/http"
-	"strconv"
 	"time"
 )
 
-func SendWxTemplateMsg(reportId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
-			//go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
-		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-	utils.FileLog.Info("%s", "services SendMsg")
-
-	report, err := report.GetReportById(reportId)
-	if err != nil {
-		msg = "GetReportInfo Err:" + err.Error()
-		return
-	}
-	if report == nil {
-		utils.FileLog.Info("报告信息不存在")
-		return
-	}
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	//获取openid列表
-	openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdList(openIdStr)
-	if err != nil {
-		msg = "get openIdList err:" + err.Error()
-		return
-	}
-	fmt.Println("openIdListCount:", len(openIdList))
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	fmt.Println("send start")
-	utils.FileLog.Info("send start")
-	//if report.MsgIsSend == 0 {
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
-	redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
-	keyword1 := "弘则日度点评"
-	first := "Hi,最新一期日度点评已上线,欢迎查看"
-	keyword2 := report.Title
-	//keyword3 := report.PublishTime.Format(utils.FormatDateTime)
-	keyword3 := report.PublishTime
-	keyword4 := report.Abstract
-
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-
-	sendMap["template_id"] = utils.TemplateIdByProduct
-	sendMap["url"] = redirectUrl
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(reportId), utils.TEMPLATE_MSG_REPORT)
-
-	//}
-	fmt.Println("send end")
-	utils.FileLog.Info("send end")
-	return
-}
-
 func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList, resource string, sendType int) (err error) {
 	for _, v := range items {
 		sendMap["touser"] = v.OpenId
@@ -175,7 +101,7 @@ func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgM
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
 
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()
 		return
@@ -241,7 +167,7 @@ func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgM
 	return
 }
 
-// 路演->销售收到处理结果
+// SendWxMsgWithRoadshowDetailResult 路演->销售收到处理结果
 func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile, redirectUrl, wxAppPath string) (err error) {
 	var msg string
 	defer func() {
@@ -256,7 +182,7 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
 
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()
 		return
@@ -302,7 +228,7 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile
 	return
 }
 
-// 路演->研究员收到待处理的申请
+// SendWxMsgWithRoadshowPending 路演->研究员收到待处理的申请
 func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, mobile string) (err error) {
 	//utils.WxMsgTemplateIdWithRoadshowPending
 	var msg string
@@ -318,7 +244,7 @@ func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4,
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
 
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()
 		return
@@ -364,7 +290,7 @@ func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4,
 	return
 }
 
-// 路演->研究员收到活动删除通知
+// SendWxMsgWithRoadshowDeleteNotice 路演->研究员收到活动删除通知
 func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, mobile string) (err error) {
 	var msg string
 	defer func() {
@@ -379,7 +305,7 @@ func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppP
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
 
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()
 		return
@@ -420,7 +346,7 @@ func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppP
 	return
 }
 
-// 给销售发送 用印申请已签回的模版消息
+// SendSealFinishedWxTemplateMsg 给销售发送 用印申请已签回的模版消息
 func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int) (err error) {
 	var msg string
 	defer func() {
@@ -434,7 +360,7 @@ func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int
 		}
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		msg = "GetWxAccessToken Err:" + err.Error()
 		return
@@ -493,7 +419,7 @@ func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle
 		}
 	}()
 
-	accessToken, err := WxGetAccessToken()
+	accessToken, err := WxGetAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
 	if err != nil {
 		errMsg = "GetWxAccessToken Err:" + err.Error()
 		return

+ 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"
 	}
 
 }

+ 16 - 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,8 @@ 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:"
 )
 
 // 微信用户user_record注册平台