RefreshYilianyunToken
This commit is contained in:
@@ -43,7 +43,6 @@ type EventInfo struct {
|
|||||||
|
|
||||||
type tRegisterInfo struct {
|
type tRegisterInfo struct {
|
||||||
notifyChan chan *EventInfo
|
notifyChan chan *EventInfo
|
||||||
eventCategory string
|
|
||||||
eventTypeList []string
|
eventTypeList []string
|
||||||
criteria interface{}
|
criteria interface{}
|
||||||
}
|
}
|
||||||
@@ -177,8 +176,7 @@ func (e *EventHub) registerConsumer(eventCategory string, eventTypeList []string
|
|||||||
realEventTypeList[index] = composeEventType(eventCategory, eventType)
|
realEventTypeList[index] = composeEventType(eventCategory, eventType)
|
||||||
}
|
}
|
||||||
info := &tRegisterInfo{
|
info := &tRegisterInfo{
|
||||||
eventCategory: eventCategory,
|
eventTypeList: realEventTypeList,
|
||||||
eventTypeList: eventTypeList,
|
|
||||||
notifyChan: make(chan *EventInfo, 1),
|
notifyChan: make(chan *EventInfo, 1),
|
||||||
criteria: criteria,
|
criteria: criteria,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ import (
|
|||||||
const (
|
const (
|
||||||
EventCategory = "sys"
|
EventCategory = "sys"
|
||||||
|
|
||||||
EventTypeWXToken = "wxtoken"
|
EventTypeWXToken = "wxtoken"
|
||||||
|
EventTypeYLYToken = "ylytoken"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Hub struct {
|
type Hub struct {
|
||||||
@@ -23,7 +24,7 @@ type Hub struct {
|
|||||||
type Criteria struct {
|
type Criteria struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type WXTokenInfo struct {
|
type TokenInfo struct {
|
||||||
IsNew bool `json:"isNew"`
|
IsNew bool `json:"isNew"`
|
||||||
Token string `json:"token"`
|
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) {
|
func (h *Hub) OnNewYLYToken(token string) {
|
||||||
token := api.WeixinAPI.CBGetToken()
|
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 {
|
if token != oldToken {
|
||||||
tokenInfo = &WXTokenInfo{
|
tokenInfo = &TokenInfo{
|
||||||
IsNew: false,
|
IsNew: false,
|
||||||
Token: token,
|
Token: token,
|
||||||
}
|
}
|
||||||
} else {
|
} 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 {
|
if err == nil && eventInfo != nil {
|
||||||
tokenInfo = &WXTokenInfo{
|
tokenInfo = &TokenInfo{
|
||||||
IsNew: true,
|
IsNew: true,
|
||||||
Token: eventInfo.Data.(string),
|
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
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import (
|
|||||||
const (
|
const (
|
||||||
weixinTokenExpires = 7200 * time.Second
|
weixinTokenExpires = 7200 * time.Second
|
||||||
dingdingTokenExpires = 7200 * time.Second
|
dingdingTokenExpires = 7200 * time.Second
|
||||||
elmTokenExpires = 20 * 24 * 3600 * time.Second
|
|
||||||
weimobTokenExpires = 7200 * time.Second
|
weimobTokenExpires = 7200 * time.Second
|
||||||
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
|
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
|
||||||
|
|
||||||
@@ -35,16 +34,6 @@ const (
|
|||||||
minRefreshGap = 1 * time.Second
|
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 {
|
type CallResult struct {
|
||||||
Code string `json:"code"`
|
Code string `json:"code"`
|
||||||
Desc string `json:"desc"`
|
Desc string `json:"desc"`
|
||||||
@@ -151,39 +140,10 @@ func RefreshWeixinToken() (err error) {
|
|||||||
return err
|
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) {
|
func RefreshWeimobToken() (err error) {
|
||||||
if api.WeimobAPI != nil {
|
if api.WeimobAPI != nil {
|
||||||
err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) {
|
err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) {
|
||||||
if globals.IsProductEnv() {
|
if globals.IsMainProductEnv() {
|
||||||
if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil {
|
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))
|
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) {
|
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)
|
globals.SugarLogger.Debugf("RefreshYilianyunToken RunMode:%s", beego.BConfig.RunMode)
|
||||||
if globals.IsProductEnv() {
|
if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key
|
||||||
if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key
|
if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil {
|
||||||
if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil {
|
token = string(utils.MustMarshal(tokenInfo))
|
||||||
return string(utils.MustMarshal(tokenInfo)), ""
|
} else {
|
||||||
} else {
|
globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err)
|
||||||
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) {
|
}, func(value string) {
|
||||||
|
token := value
|
||||||
var tokenInfo *yilianyunapi.TokenInfo
|
var tokenInfo *yilianyunapi.TokenInfo
|
||||||
err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo)
|
if err := utils.TryUnmarshalUseNumber([]byte(value), &tokenInfo); err == nil {
|
||||||
if err == nil {
|
token = tokenInfo.AccessToken
|
||||||
api.YilianyunAPI.SetToken(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() {
|
if IsGetWXTokenFromRemote() {
|
||||||
for {
|
tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{
|
||||||
waitSecond := 5 * 60
|
"oldToken": oldToken,
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return tokenInfo
|
return tokenInfo
|
||||||
}
|
}
|
||||||
@@ -293,3 +228,55 @@ func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo)
|
|||||||
func IsGetWXTokenFromRemote() bool {
|
func IsGetWXTokenFromRemote() bool {
|
||||||
return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != ""
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ type SysController struct {
|
|||||||
beego.Controller
|
beego.Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Title 得到京西门店信息
|
// @Title 得到微信token
|
||||||
// @Description 得到京西门店信息,如下条件之间是与的关系
|
// @Description 得到微信token
|
||||||
// @Param accessKey query string true "假token"
|
// @Param accessKey query string true "假token"
|
||||||
// @Param oldToken query string false "之前的token"
|
// @Param oldToken query string false "之前的token"
|
||||||
// @Param waitSecond query int false "等待秒数"
|
// @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转换内容
|
// @Title 得到饿百RTF转换内容
|
||||||
// @Description 得到饿百RTF转换内容
|
// @Description 得到饿百RTF转换内容
|
||||||
// @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的"
|
// @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的"
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ var (
|
|||||||
|
|
||||||
GetWeixinTokenURL string
|
GetWeixinTokenURL string
|
||||||
GetWeixinTokenKey string
|
GetWeixinTokenKey string
|
||||||
|
GetYLYTokenURL string
|
||||||
|
|
||||||
StoreName string
|
StoreName string
|
||||||
|
|
||||||
@@ -82,6 +83,7 @@ func Init() {
|
|||||||
WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "")
|
WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "")
|
||||||
|
|
||||||
GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "")
|
GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "")
|
||||||
|
GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "")
|
||||||
GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "")
|
GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "")
|
||||||
|
|
||||||
StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市")
|
StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市")
|
||||||
|
|||||||
4
main.go
4
main.go
@@ -118,10 +118,6 @@ func main() {
|
|||||||
globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err)
|
globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// if err := tasks.RefreshElmToken(); err != nil {
|
|
||||||
// globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
if err := tasks.RefreshWeimobToken(); err != nil {
|
if err := tasks.RefreshWeimobToken(); err != nil {
|
||||||
globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err)
|
globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1647,6 +1647,15 @@ func init() {
|
|||||||
Filters: nil,
|
Filters: nil,
|
||||||
Params: 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.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"],
|
||||||
beego.ControllerComments{
|
beego.ControllerComments{
|
||||||
Method: "CancelTask",
|
Method: "CancelTask",
|
||||||
|
|||||||
Reference in New Issue
Block a user