瀏覽代碼

Merge branch 'feature/fix_wx_token' into debug

xyxie 1 年之前
父節點
當前提交
5b4d60a370
共有 5 個文件被更改,包括 127 次插入105 次删除
  1. 12 3
      controllers/wechat.go
  2. 5 9
      services/alarm_msg/alarm_msg.go
  3. 5 93
      services/wechat.go
  4. 81 0
      services/wechat/token.go
  5. 24 0
      utils/config.go

+ 12 - 3
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,9 +352,13 @@ 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
 	}
@@ -634,7 +639,11 @@ 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.ErrMsg = "获取access_token失败,err:" + errMsg

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

+ 5 - 93
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"
@@ -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
-}

+ 81 - 0
services/wechat/token.go

@@ -0,0 +1,81 @@
+package wechat
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_api/models"
+	"hongze/hongze_api/services/alarm_msg"
+	"hongze/hongze_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+type WxTokenReq struct {
+	WxAppId     string `description:"公众号appId"`
+	WxAppSecret string `description:"公众号appSecret"`
+}
+
+type WxTokenResp 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(models.BaseResponse)
+	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
+	}
+	data := result.Data.(WxTokenResp)
+	accessToken = data.AccessToken
+	if accessToken == "" {
+		err = errors.New("请求accessToken失败")
+		errMsg = "请求accessToken失败"
+		return
+	}
+	return
+}

+ 24 - 0
utils/config.go

@@ -53,6 +53,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 {
@@ -123,6 +135,18 @@ func init() {
 		EsEnglishReportIndexName = "test_english_report_v1"
 	}
 
+	// 系统内部服务地址
+	{
+		// 发送微信模板消息地址
+		EtaPubUrl = config["eta_pub_url"]
+
+		// 发送微信模板消息地址
+		EtaPubAuthorization = config["eta_pub_authorization"]
+
+		// 报警服务地址
+		AlarmMsgUrl = config["alarm_msg_url"]
+	}
+
 	// 初始化redis缓存
 	initRedis(config)
 	initAutoReply()