- jxgy刷新token
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user