diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index 422f3057c..3a4ca25f7 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -43,7 +43,6 @@ type EventInfo struct { type tRegisterInfo struct { notifyChan chan *EventInfo - eventCategory string eventTypeList []string criteria interface{} } @@ -177,8 +176,7 @@ func (e *EventHub) registerConsumer(eventCategory string, eventTypeList []string realEventTypeList[index] = composeEventType(eventCategory, eventType) } info := &tRegisterInfo{ - eventCategory: eventCategory, - eventTypeList: eventTypeList, + eventTypeList: realEventTypeList, notifyChan: make(chan *EventInfo, 1), criteria: criteria, } diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 5ef2c63de..6e892522a 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -13,7 +13,8 @@ import ( const ( EventCategory = "sys" - EventTypeWXToken = "wxtoken" + EventTypeWXToken = "wxtoken" + EventTypeYLYToken = "ylytoken" ) type Hub struct { @@ -23,7 +24,7 @@ type Hub struct { type Criteria struct { } -type WXTokenInfo struct { +type TokenInfo struct { IsNew bool `json:"isNew"` Token string `json:"token"` } @@ -55,22 +56,43 @@ func (h *Hub) OnNewWXToken(token string) { }) } -func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WXTokenInfo) { - token := api.WeixinAPI.CBGetToken() +func (h *Hub) OnNewYLYToken(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypeYLYToken, + Data: token, + }) +} + +func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + var token string + switch tokenType { + case EventTypeWXToken: + token = api.WeixinAPI.CBGetToken() + case EventTypeYLYToken: + token = api.YilianyunAPI.GetToken() + } if token != oldToken { - tokenInfo = &WXTokenInfo{ + tokenInfo = &TokenInfo{ IsNew: false, Token: token, } } else { - eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, nil, waitTime) + eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{tokenType}, nil, waitTime) if err == nil && eventInfo != nil { - tokenInfo = &WXTokenInfo{ + tokenInfo = &TokenInfo{ IsNew: true, Token: eventInfo.Data.(string), } } } - globals.SugarLogger.Debugf("GetWXToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + globals.SugarLogger.Debugf("GetToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) return tokenInfo } + +func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeWXToken, oldToken, waitTime) +} + +func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeYLYToken, oldToken, waitTime) +} diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 7297ddf1d..ce071d76f 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -26,7 +26,6 @@ import ( const ( weixinTokenExpires = 7200 * time.Second dingdingTokenExpires = 7200 * time.Second - elmTokenExpires = 20 * 24 * 3600 * time.Second weimobTokenExpires = 7200 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second @@ -35,16 +34,6 @@ const ( minRefreshGap = 1 * time.Second ) -type ElmTokenForCompatible struct { - Error string `json:"error"` - ErrorDescription string `json:"error_description"` - AccessToken string `json:"accessToken"` - TokenType string `json:"tokenType"` - Expires int `json:"expires"` - RefreshToken string `json:"refreshToken"` - Success bool `json:"success"` -} - type CallResult struct { Code string `json:"code"` Desc string `json:"desc"` @@ -151,39 +140,10 @@ func RefreshWeixinToken() (err error) { return err } -func RefreshElmToken() (err error) { - if api.ElmAPI != nil { - err = RefreshConfig("eleme", elmTokenExpires, func() (string, string) { - if globals.IsProductEnv() { - if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { - tokenInfo2 := &ElmTokenForCompatible{ - Error: "", - ErrorDescription: "", - AccessToken: tokenInfo.AccessToken, - TokenType: tokenInfo.TokenType, - Expires: tokenInfo.ExpiresIn, - RefreshToken: "", - Success: true, - } - return string(utils.MustMarshal(tokenInfo2)), "" - } - } - return "", "" - }, func(value string) { - var tokenInfo ElmTokenForCompatible - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.ElmAPI.SetToken(tokenInfo.AccessToken) - } - }) - } - return err -} - func RefreshWeimobToken() (err error) { if api.WeimobAPI != nil { err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) { - if globals.IsProductEnv() { + if globals.IsMainProductEnv() { if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) } @@ -230,62 +190,37 @@ func SaveWeimobToken(token *weimobapi.TokenInfo) (err error) { } func RefreshYilianyunToken() (err error) { - return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (string, string) { + return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (token string, expireTimeStr string) { globals.SugarLogger.Debugf("RefreshYilianyunToken RunMode:%s", beego.BConfig.RunMode) - if globals.IsProductEnv() { - if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key - if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil { - return string(utils.MustMarshal(tokenInfo)), "" - } else { - globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err) - } + if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key + if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil { + token = string(utils.MustMarshal(tokenInfo)) + } else { + globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err) + } + } else { + if tokenInfo := getYLYTokenFromRemote(api.YilianyunAPI.GetToken()); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-yilianyunTokenExpires)) + token = tokenInfo.Token } } - return "", "" + return token, expireTimeStr }, func(value string) { + token := value var tokenInfo *yilianyunapi.TokenInfo - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.YilianyunAPI.SetToken(tokenInfo.AccessToken) + if err := utils.TryUnmarshalUseNumber([]byte(value), &tokenInfo); err == nil { + token = tokenInfo.AccessToken } + syseventhub.SysEventHub.OnNewYLYToken(token) + api.YilianyunAPI.SetToken(token) }) } -func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { +func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { if IsGetWXTokenFromRemote() { - for { - waitSecond := 5 * 60 - globals.SugarLogger.Debugf("getWXTokenFromProd1") - response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond)) - globals.SugarLogger.Debugf("getWXTokenFromProd2 error:%v", err) - if err == nil { - defer response.Body.Close() - if response.StatusCode == http.StatusOK { - data, err2 := ioutil.ReadAll(response.Body) - if err = err2; err == nil { - var result CallResult - if err = utils.UnmarshalUseNumber(data, &result); err == nil { - if result.Code == "0" { - if result.Data != "" { - if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { - globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) - break - } - } - } else { - err = fmt.Errorf("return code is:%s", result.Code) - } - } - } - } else { - err = platformapi.ErrHTTPCodeIsNot200 - } - } - globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) - if err != nil { - time.Sleep(errRefreshGap) - } - } + tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) } return tokenInfo } @@ -293,3 +228,55 @@ func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) func IsGetWXTokenFromRemote() bool { return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" } + +func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]interface{}) (tokenInfo *syseventhub.TokenInfo) { + if waitSecond == 0 { + waitSecond = 5 * 60 + } + params2 := utils.MergeMaps(params, map[string]interface{}{ + "accessKey": globals.GetWeixinTokenKey, + "waitSecond": waitSecond, + }) + for { + globals.SugarLogger.Debugf("PollingRemotEvent") + response, err := http.Get(utils.GenerateGetURL(remoteURL, "", params2)) + globals.SugarLogger.Debugf("PollingRemotEvent2 error:%v", err) + if err == nil { + defer response.Body.Close() + if response.StatusCode == http.StatusOK { + data, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + var result CallResult + if err = utils.UnmarshalUseNumber(data, &result); err == nil { + if result.Code == "0" { + if result.Data != "" { + if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { + globals.SugarLogger.Debugf("PollingRemotEvent %s:%s", remoteURL, utils.Format4Output(tokenInfo, false)) + break + } + } + } else { + err = fmt.Errorf("return code is:%s", result.Code) + } + } + } + } else { + err = platformapi.ErrHTTPCodeIsNot200 + } + } + globals.SugarLogger.Infof("PollingRemotEvent failed with error:%v", err) + if err != nil { + time.Sleep(errRefreshGap) + } + } + return tokenInfo +} + +func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} diff --git a/controllers/sys.go b/controllers/sys.go index 96d67fdc6..26ad57cce 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -20,8 +20,8 @@ type SysController struct { beego.Controller } -// @Title 得到京西门店信息 -// @Description 得到京西门店信息,如下条件之间是与的关系 +// @Title 得到微信token +// @Description 得到微信token // @Param accessKey query string true "假token" // @Param oldToken query string false "之前的token" // @Param waitSecond query int false "等待秒数" @@ -37,6 +37,23 @@ func (c *SysController) GetWXToken() { }) } +// @Title 得到易联云token +// @Description 得到易联云token +// @Param accessKey query string true "假token" +// @Param oldToken query string false "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetYLYToken [get] +func (c *SysController) GetYLYToken() { + c.callGetYLYToken(func(params *tSysGetYLYTokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetYLYToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} + // @Title 得到饿百RTF转换内容 // @Description 得到饿百RTF转换内容 // @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的" diff --git a/globals/globals.go b/globals/globals.go index bb99b38ca..3bd30d243 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -40,6 +40,7 @@ var ( GetWeixinTokenURL string GetWeixinTokenKey string + GetYLYTokenURL string StoreName string @@ -82,6 +83,7 @@ func Init() { WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "") GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "") + GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "") GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市") diff --git a/main.go b/main.go index dfd8d3d20..4088c347f 100644 --- a/main.go +++ b/main.go @@ -118,10 +118,6 @@ func main() { globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err) return } - // if err := tasks.RefreshElmToken(); err != nil { - // globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err) - // return - // } if err := tasks.RefreshWeimobToken(); err != nil { globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) return diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 157c07787..6cec894c6 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1647,6 +1647,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], + beego.ControllerComments{ + Method: "GetYLYToken", + Router: `/GetYLYToken`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"], beego.ControllerComments{ Method: "CancelTask",