- jxgy刷新token

This commit is contained in:
gazebo
2019-04-27 17:41:33 +08:00
parent 0f85ed964e
commit 94484a92b7

View File

@@ -28,8 +28,11 @@ const (
dingdingTokenExpires = 7200 * time.Second dingdingTokenExpires = 7200 * time.Second
elmTokenExpires = 20 * 24 * 3600 * time.Second elmTokenExpires = 20 * 24 * 3600 * time.Second
weimobTokenExpires = 7200 * time.Second weimobTokenExpires = 7200 * time.Second
maxRefreshGap = 5 * 60 * time.Second
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
maxRefreshGap = 5 * 60 * time.Second
errRefreshGap = 10 * time.Second
minRefreshGap = 1 * time.Second
) )
type ElmTokenForCompatible struct { type ElmTokenForCompatible struct {
@@ -49,12 +52,14 @@ type CallResult struct {
} }
func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() (string, string), configSetter func(value string)) error { func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() (string, string), configSetter func(value string)) error {
sleepGap := expiresTime / 10
needRefreshGap := expiresTime * 8 / 10 needRefreshGap := expiresTime * 8 / 10
sleepGap := expiresTime / 10
if sleepGap > maxRefreshGap { if sleepGap > maxRefreshGap {
sleepGap = maxRefreshGap sleepGap = maxRefreshGap
} }
refreshFunc := func() (string, error) {
refreshFunc := func() (sleepDuration time.Duration) {
sleepDuration = sleepGap
curConfig := &legacymodel.Config{ curConfig := &legacymodel.Config{
Thirdparty: configKey, Thirdparty: configKey,
} }
@@ -64,7 +69,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun
if err := db.Read(curConfig, "Thirdparty"); err != nil { if err := db.Read(curConfig, "Thirdparty"); err != nil {
if err != orm.ErrNoRows { if err != orm.ErrNoRows {
globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig) globals.SugarLogger.Errorf("db error:%v, curConfig:%v", err, curConfig)
return "", err return errRefreshGap
} }
handleType = 2 handleType = 2
} else { } else {
@@ -77,15 +82,18 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun
if curConfig.Token, curConfig.Date = configGetter(); curConfig.Token == "" { if curConfig.Token, curConfig.Date = configGetter(); curConfig.Token == "" {
if beego.BConfig.RunMode == "prod" { if beego.BConfig.RunMode == "prod" {
globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey) globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey)
sleepDuration = errRefreshGap
} else { } else {
globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey)
} }
return "", nil return sleepDuration
} }
globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token) globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token)
configSetter(curConfig.Token)
if curConfig.Date == "" { if curConfig.Date == "" {
curConfig.Date = utils.GetCurTimeStr() curConfig.Date = utils.GetCurTimeStr()
} else {
sleepDuration = expiresTime - time.Now().Sub(utils.Str2Time(curConfig.Date))
} }
var num int64 var num int64
var err error var err error
@@ -97,25 +105,20 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun
} }
if err != nil || num == 0 { if err != nil || num == 0 {
globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig)
return "", err
} }
configSetter(curConfig.Token)
} }
return curConfig.Token, nil if sleepDuration < minRefreshGap {
sleepDuration = minRefreshGap
} else if sleepDuration > maxRefreshGap {
sleepDuration = maxRefreshGap
} }
token, err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次 return sleepDuration
if err == nil {
if token != "" {
configSetter(token)
} }
utils.CallFuncAsync(func() { utils.CallFuncAsync(func() {
for { sleepGap := refreshFunc()
time.Sleep(sleepGap) time.Sleep(sleepGap)
refreshFunc()
}
}) })
} return nil
return err
} }
func RefreshWeixinToken() (err error) { func RefreshWeixinToken() (err error) {
@@ -250,7 +253,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) {
if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { if globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" {
for { for {
waitSecond := 5 * 60 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)) 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 { if err == nil {
defer response.Body.Close() defer response.Body.Close()
if response.StatusCode == http.StatusOK { if response.StatusCode == http.StatusOK {
@@ -260,7 +265,7 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) {
if err = utils.UnmarshalUseNumber(data, &result); err == nil { if err = utils.UnmarshalUseNumber(data, &result); err == nil {
if result.Code == "0" { if result.Code == "0" {
if result.Data != "" { if result.Data != "" {
if err = utils.UnmarshalUseNumber(data, &tokenInfo); err == nil && tokenInfo != nil { if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil {
globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false))
break break
} }
@@ -274,9 +279,9 @@ func getWXTokenFromProd(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) {
err = platformapi.ErrHTTPCodeIsNot200 err = platformapi.ErrHTTPCodeIsNot200
} }
} }
if err != nil {
globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err)
time.Sleep(30 * time.Second) if err != nil {
time.Sleep(errRefreshGap)
} }
} }
} }