Browse Source

Merge branch 'feature/fix_wx_token' of hongze/hongze_api into master

xyxie 1 year ago
parent
commit
b97fd68b38
5 changed files with 174 additions and 112 deletions
  1. 47 6
      controllers/wechat.go
  2. 5 9
      services/alarm_msg/alarm_msg.go
  3. 9 97
      services/wechat.go
  4. 89 0
      services/wechat/token.go
  5. 24 0
      utils/config.go

+ 47 - 6
controllers/wechat.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"hongze/hongze_api/models"
 	"hongze/hongze_api/services"
+	"hongze/hongze_api/services/wechat"
 	"hongze/hongze_api/utils"
 	"strconv"
 	"strings"
@@ -351,19 +352,39 @@ func (this *WechatController) GetWxSign() {
 	}
 	getUrl := this.GetString("Url")
 	fmt.Println("getUrl:", getUrl)
-	accessToken, err, errMsg := services.GetWxAccessToken(appId, appSecret)
+	tReq := wechat.WxTokenReq{
+		WxAppId:     appId,
+		WxAppSecret: appSecret,
+	}
+	accessToken, err, errMsg := wechat.GetAccessToken(tReq)
 	if err != nil {
-		br.Msg = "获取用户信息失败"
+		br.Msg = "获取微信配置失败"
 		br.ErrMsg = "获取access_token失败,err:" + errMsg
 		return
 	}
 
-	ticket, err := services.GetWxTicket(accessToken)
+	errCode, ticket, err := services.GetWxTicket(accessToken)
 	if err != nil {
+		if errCode == 40001 {
+			accessToken, err, errMsg = wechat.GetAccessToken(tReq)
+			if err != nil {
+				br.Msg = "获取微信配置失败"
+				br.ErrMsg = "获取access_token失败,err:" + errMsg
+				return
+			}
+
+			errCode, ticket, err = services.GetWxTicket(accessToken)
+			if err != nil {
+				br.Msg = "获取Ticket失败,请联系客服"
+				br.ErrMsg = "获取Ticket失败,Err" + err.Error()
+				return
+			}
+		}
 		br.Msg = "获取Ticket失败,请联系客服"
 		br.ErrMsg = "获取Ticket失败,Err" + err.Error()
 		return
 	}
+
 	if ticket == "" {
 		br.Msg = "获取Ticket失败,请联系客服"
 		br.ErrMsg = "ticket为空" + ticket
@@ -634,15 +655,35 @@ func (this *WechatCommonController) GetWxSign() {
 	}
 	getUrl := this.GetString("Url")
 	fmt.Println("getUrl:", getUrl)
-	accessToken, err, errMsg := services.GetWxAccessToken(appId, appSecret)
+
+	tReq := wechat.WxTokenReq{
+		WxAppId:     appId,
+		WxAppSecret: appSecret,
+	}
+	accessToken, err, errMsg := wechat.GetAccessToken(tReq)
 	if err != nil {
-		br.Msg = "获取用户信息失败"
+		br.Msg = "获取微信配置失败"
 		br.ErrMsg = "获取access_token失败,err:" + errMsg
 		return
 	}
 
-	ticket, err := services.GetWxTicket(accessToken)
+	errCode, ticket, err := services.GetWxTicket(accessToken)
 	if err != nil {
+		if errCode == 40001 {
+			accessToken, err, errMsg = wechat.GetAccessToken(tReq)
+			if err != nil {
+				br.Msg = "获取微信配置失败"
+				br.ErrMsg = "获取access_token失败,err:" + errMsg
+				return
+			}
+
+			errCode, ticket, err = services.GetWxTicket(accessToken)
+			if err != nil {
+				br.Msg = "获取Ticket失败,请联系客服"
+				br.ErrMsg = "获取Ticket失败,Err" + err.Error()
+				return
+			}
+		}
 		br.Msg = "获取Ticket失败,请联系客服"
 		br.ErrMsg = "获取Ticket失败,Err" + err.Error()
 		return

+ 5 - 9
services/alarm_msg/alarm_msg.go

@@ -6,14 +6,10 @@ import (
 	"hongze/hongze_api/utils"
 )
 
-var (
-	AlarmMsgUrl = "http://127.0.0.1:8606/api/alarm/send"
-)
-
-//projectName-项目名称
-//runMode-运行模式
-//msgBody-消息内容
-//level:消息基本,1:提示消息,2:警告消息,3:严重错误信息,默认为1 提示消息
+// projectName-项目名称
+// runMode-运行模式
+// msgBody-消息内容
+// level:消息基本,1:提示消息,2:警告消息,3:严重错误信息,默认为1 提示消息
 func SendAlarmMsg(msgBody string, level int) {
 	params := make(map[string]interface{})
 	params["ProjectName"] = utils.APPNAME
@@ -25,5 +21,5 @@ func SendAlarmMsg(msgBody string, level int) {
 		utils.FileLog.Info("SendAlarmMsg json.Marshal Err:" + err.Error())
 		return
 	}
-	http.Post(AlarmMsgUrl, string(param))
+	http.Post(utils.AlarmMsgUrl, string(param))
 }

+ 9 - 97
services/wechat.go

@@ -6,7 +6,7 @@ import (
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/http"
 	"hongze/hongze_api/models"
-	"hongze/hongze_api/services/go_redis"
+	"hongze/hongze_api/services/wechat"
 	"hongze/hongze_api/utils"
 	"strconv"
 	"strings"
@@ -141,21 +141,21 @@ func WxGetUserInfo(openId, accessToken string) (item *WxUserInfo, err error) {
 	return
 }
 
-func GetWxTicket(accessToken string) (string, error) {
+func GetWxTicket(accessToken string) (int, string, error) {
 	Url := strings.Join([]string{"https://api.weixin.qq.com/cgi-bin/ticket/getticket",
 		"?access_token=", accessToken,
 		"&type=jsapi"}, "")
 	infoBody, err := http.Get(Url)
 	if err != nil {
-		return "", err
+		return 0, "", err
 	}
 	atr := models.WxTicket{}
 	err = json.Unmarshal(infoBody, &atr)
 	fmt.Println("ticket result:", string(infoBody))
 	if err != nil {
-		return atr.Errmsg, err
+		return atr.Errcode, atr.Errmsg, err
 	} else {
-		return atr.Ticket, nil
+		return 0, atr.Ticket, nil
 	}
 }
 
@@ -230,98 +230,10 @@ func GetDefaultWxAccessToken() (accessToken string, err error, errMsg string) {
 		err = errors.New(errMsg)
 		return
 	}
-	accessToken, err, errMsg = GetWxAccessToken(appId, appSecret)
-	return
-}
-
-// GetWxAccessToken 获取微信token
-func GetWxAccessToken(wxAppId, wxAppSecret string) (accessToken string, err error, errMsg string) {
-	redisKey := getRedisKeyByAppid(wxAppId)
-	if redisKey == `` {
-		errMsg = "未配置缓存key"
-		err = errors.New(errMsg)
-		return
-	}
-
-	accessToken, err = go_redis.RedisString(redisKey)
-	//fmt.Println(err)
-	//fmt.Println(accessToken)
-	//if err != nil {
-	//	errMsg = "GetWxAccessToken Err:" + err.Error()
-	//	utils.FileLog.Info("获取Token失败,msg:" + errMsg)
-	//	return
-	//}
-	//取到数据后就直接返回了,没有后续了
-	if accessToken != "" {
-		return
-	}
-
-	//缓存中没有取到数据,那么需要去强制刷新新的accessToken
-	return refreshWxAccessToken(wxAppId, wxAppSecret)
-}
-
-// refreshWxAccessToken 强制刷新微信token
-func refreshWxAccessToken(wxAppId, wxAppSecret string) (accessToken string, err error, errMsg string) {
-	fmt.Println("强制刷新" + wxAppId + "微信token")
-	defer func() {
-		if errMsg != `` {
-			utils.FileLog.Info(fmt.Sprintf("强制刷新%s微信token异常:%s", wxAppId, errMsg))
-		}
-	}()
-	redisKey := getRedisKeyByAppid(wxAppId)
-	if redisKey == `` {
-		errMsg = "未配置缓存key"
-		err = errors.New(errMsg)
-		return
-	}
-	if wxAppSecret == "" {
-		err = errors.New("缺少密钥信息")
-		utils.FileLog.Info(fmt.Sprintf("获取Token失败, errMsg:%s", err.Error()))
-		return
-	}
-
-	//调用微信官方接口获取新的accessToken
-	wxAccessToken, tmpErr := WxGetToken(wxAppId, wxAppSecret)
-	if tmpErr != nil {
-		err = tmpErr
-		errMsg = "通过微信接口获取accessToken失败 Err:" + err.Error()
-		return
-	}
-
-	//如果没有token数据
-	if wxAccessToken.AccessToken == "" {
-		errMsg = "微信返回的accessToken异常: Err:" + wxAccessToken.Errmsg
-		err = errors.New(errMsg)
-		return
-	}
-
-	accessToken = wxAccessToken.AccessToken
-	//如果是弘则研究的appid,那么需要更新mysql的accessToken
-	if wxAppId == utils.WxAppId {
-		expiresIn := time.Now().Add(time.Duration(wxAccessToken.ExpiresIn) * time.Second).Unix()
-		err = models.ModifyAccessToken(wxAccessToken.AccessToken, expiresIn)
-		if err != nil {
-			errMsg = "更新mysql中的accessToken失败 Err:" + err.Error()
-			return
-		}
-	}
-
-	//更新redis的accessToken(过期时间提前十分钟)
-	redisTimeExpire := time.Duration(wxAccessToken.ExpiresIn-600) * time.Second
-	bo := go_redis.SetNX(redisKey, accessToken, redisTimeExpire)
-	if !bo {
-		errMsg = "更新redis中的accessToken失败"
-		return
+	req := wechat.WxTokenReq{
+		WxAppId:     appId,
+		WxAppSecret: appSecret,
 	}
-
+	accessToken, err, errMsg = wechat.GetAccessToken(req)
 	return
 }
-
-// 根据微信appid获取对应的缓存key
-func getRedisKeyByAppid(wxAppId string) (redisKey string) {
-	switch wxAppId {
-	case utils.WxAppId:
-		redisKey = utils.CACHE_WX_ACCESS_TOKEN_HZ
-	}
-	return redisKey
-}

+ 89 - 0
services/wechat/token.go

@@ -0,0 +1,89 @@
+package wechat
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_api/services/alarm_msg"
+	"hongze/hongze_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+type WxTokenResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        WxTokenData
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-"`
+}
+
+type WxTokenReq struct {
+	WxAppId     string `description:"公众号appId"`
+	WxAppSecret string `description:"公众号appSecret"`
+}
+
+type WxTokenData struct {
+	AccessToken string `description:"微信token"`
+}
+
+// GetAccessToken 获取微信token
+func GetAccessToken(tokenReq WxTokenReq) (accessToken string, err error, errMsg string) {
+	if utils.EtaPubUrl == `` {
+		// 找不到推送服务
+		return
+	}
+	url := fmt.Sprintf("%s%s", utils.EtaPubUrl, "v1/wechat/access_token")
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(errMsg, 1)
+		}
+	}()
+	postData, err := json.Marshal(tokenReq)
+	if err != nil {
+		errMsg = "SendTemplateMsg json.Marshal Err:" + err.Error()
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(postData)))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		errMsg = "SendTemplateMsg http.NewRequest Err:" + err.Error()
+		return
+	}
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.EtaPubAuthorization)
+	resp, err := client.Do(req)
+	if err != nil {
+		errMsg = "http client.Do Err:" + err.Error()
+		return
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		errMsg = "ioutil.ReadAll Err:" + err.Error()
+		return
+	}
+	result := new(WxTokenResp)
+	err = json.Unmarshal(b, &result)
+	if err != nil {
+		errMsg = "json.Unmarshal Err:" + err.Error()
+		return
+	}
+	if result.Ret != 200 {
+		err = errors.New(string(b))
+		errMsg = "请求失败:" + err.Error()
+		return
+	}
+	accessToken = result.Data.AccessToken
+	if accessToken == "" {
+		err = errors.New("请求accessToken失败")
+		errMsg = "请求accessToken失败"
+		return
+	}
+	return
+}

+ 24 - 0
utils/config.go

@@ -52,6 +52,18 @@ var (
 	ReportNameArr []string
 )
 
+// 公共api内部服务调用
+var (
+	// EtaPubUrl 模板消息推送
+	EtaPubUrl string
+
+	// EtaPubAuthorization 模板推送秘钥
+	EtaPubAuthorization string
+
+	// AlarmMsgUrl 报警服务地址
+	AlarmMsgUrl string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -120,6 +132,18 @@ func init() {
 		STATIC_DIR = "/home/static/imgs/"
 	}
 
+	// 系统内部服务地址
+	{
+		// 发送微信模板消息地址
+		EtaPubUrl = config["eta_pub_url"]
+
+		// 发送微信模板消息地址
+		EtaPubAuthorization = config["eta_pub_authorization"]
+
+		// 报警服务地址
+		AlarmMsgUrl = config["alarm_msg_url"]
+	}
+
 	// 初始化redis缓存
 	initRedis(config)
 	initAutoReply()