From 0873043449081982f848529781fb403815080e4c Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 15 Jan 2019 15:56:01 +0800 Subject: [PATCH] - weimob token --- business/jxutils/tasks/configrefresh.go | 84 +++++++++++++++++++------ conf/app.conf | 7 +++ controllers/weimob_callback.go | 15 ++++- globals/api/api.go | 33 +++++----- globals/globals.go | 7 ++- main.go | 22 ++++--- 6 files changed, 120 insertions(+), 48 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 1c54eceee..fdb9b596d 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -1,21 +1,24 @@ package tasks import ( - "fmt" "time" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/globals/api" + "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" + "github.com/astaxie/beego" "github.com/astaxie/beego/orm" ) const ( weixinTokenExpires = 7200 * time.Second elmTokenExpires = 20 * 24 * 3600 * time.Second + weimobTokenExpires = 7200 * time.Second maxRefreshGap = 5 * 60 * time.Second ) @@ -48,14 +51,22 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun return "", err } handleType = 2 - } else if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) { - handleType = 1 + } else { + configSetter(curConfig.Token) + if curConfig.Date <= utils.Time2Str(time.Now().Add(-needRefreshGap)) { + handleType = 1 + } } if handleType != 0 { if curConfig.Token = configGetter(); curConfig.Token == "" { - return "", fmt.Errorf("can not get token for %s", configKey) + if beego.BConfig.RunMode == "prod" { + globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey) + } else { + globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) + } + return "", nil } - globals.SugarLogger.Debugf("refresh %s, value:%s", configKey, curConfig.Token) + globals.SugarLogger.Debugf("RefreshConfig refresh %s, value:%s", configKey, curConfig.Token) curConfig.Date = utils.GetCurTimeStr() var num int64 @@ -69,15 +80,16 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if err != nil || num == 0 { globals.SugarLogger.Errorf("db error:%v, num:%d, curConfig:%v", err, num, curConfig) return "", err - } else { - configSetter(curConfig.Token) } + configSetter(curConfig.Token) } return curConfig.Token, nil } token, err := refreshFunc() // 这样写的目的是强制第一次调用时要刷新一次 if err == nil { - configSetter(token) + if token != "" { + configSetter(token) + } utils.CallFuncAsync(func() { for { time.Sleep(sleepGap) @@ -90,8 +102,10 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun func RefreshWeixinToken() error { return RefreshConfig("wechat", weixinTokenExpires, func() string { - if tokenInfo, err := api.WeixinAPI.RefreshToken(); err == nil { - return tokenInfo.AccessToken + if beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.WeixinAPI.RefreshToken(); err == nil { + return tokenInfo.AccessToken + } } return "" }, func(value string) { @@ -101,17 +115,19 @@ func RefreshWeixinToken() error { func RefreshElmToken() error { return RefreshConfig("eleme", elmTokenExpires, func() string { - if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { - tokenInfo2 := &ElmTokenForCompatible{ - Error: "", - ErrorDescription: "", - AccessToken: tokenInfo.AccessToken, - TokenType: tokenInfo.TokenType, - Expires: tokenInfo.ExpiresIn, - RefreshToken: "", - Success: true, + if beego.BConfig.RunMode == "prod" { + 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 string(utils.MustMarshal(tokenInfo2)) } return "" }, func(value string) { @@ -122,3 +138,31 @@ func RefreshElmToken() error { } }) } + +func RefreshWeimobToken() error { + return RefreshConfig("weimob", weimobTokenExpires, func() string { + if true { //beego.BConfig.RunMode == "prod" { + if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { + return string(utils.MustMarshal(tokenInfo)) + } + } + return "" + }, func(value string) { + var tokenInfo *weimobapi.TokenInfo + err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) + if err == nil { + api.WeimobAPI.SetToken(tokenInfo) + } + }) +} + +func SaveWeimobToken(token *weimobapi.TokenInfo) (err error) { + db := dao.GetDB() + config := &legacymodel.Config{ + Thirdparty: "weimob", + Token: string(utils.MustMarshal(token)), + Date: utils.GetCurTimeStr(), + LastOperator: "admin", + } + return dao.CreateOrUpdate(db, config) +} diff --git a/conf/app.conf b/conf/app.conf index 064d42df9..6c3f65e5d 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -42,6 +42,11 @@ weixinMiniSecret = "2a57228a716ce991a52739f0ff41111d" jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHBUOPCIUXDX4MQEAYEPUFFOAD4WJECT4R3K22T24MKC7OMIRDLX7S55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" +weimobAppID = "319F5E7FB6784DFCA3684C9333EB7744" +weimobAppSecret = "7267AA7F58261F6965599218F5A1D592" +weimobStateSecret = "87ae9570-92dc-4c01-bcd9-1a15d441df6b" +weimobCallbackURL = "http://callback.test.jxc4.com/weimob" + [dev] jdToken = "c8854ef2-f80a-45ee-aceb-dc8014d646f8" jdAppKey = "06692746f7224695ad4788ce340bc854" @@ -97,6 +102,8 @@ enableStoreWrite = true enableEbaiStoreWrite = true enableMtwmStoreWrite = true +weimobCallbackURL = "http://callback.jxc4.com/weimob" + [prod2] httpport = 8082 diff --git a/controllers/weimob_callback.go b/controllers/weimob_callback.go index 1dc9c2b27..0e6d08ae9 100644 --- a/controllers/weimob_callback.go +++ b/controllers/weimob_callback.go @@ -1,6 +1,9 @@ package controllers import ( + "git.rosy.net.cn/jx-callback/business/jxutils/tasks" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -14,5 +17,15 @@ func (c *WeimobController) onCallbackMsg(msgType string) { } func (c *WeimobController) Code() { - c.onCallbackMsg("code") + globals.SugarLogger.Debugf("WeimobController code, code:%s, state:%s", c.GetString("code"), c.GetString("state")) + state := c.GetString("state") + if state == globals.WeimobStateSecret { // 防止有人故意搞坏,添加一个secret + code := c.GetString("code") + token, err := api.WeimobAPI.RefreshTokenByCode(code, globals.WeimobCallbackURL+"/code") + if err == nil { + tasks.SaveWeimobToken(token) + } else { + globals.SugarLogger.Warnf("RefreshTokenByCode failed with error:%v", err) + } + } } diff --git a/globals/api/api.go b/globals/api/api.go index 5fdf766b9..aac9af5a7 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -9,13 +9,12 @@ import ( "git.rosy.net.cn/baseapi/platformapi/mtpsapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/platformapi/showapi" + "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/baseapi/platformapi/weixinapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/cache" "git.rosy.net.cn/jx-callback/business/jxutils/cache/redis" "github.com/astaxie/beego" - "github.com/astaxie/beego/orm" "github.com/qiniu/api.v7/auth/qbox" ) @@ -32,6 +31,7 @@ var ( AutonaviAPI *autonavi.API QiniuAPI *qbox.Mac ShowAPI *showapi.API + WeimobAPI *weimobapi.API Cacher cache.ICacher ) @@ -67,23 +67,24 @@ func Init() { } ShowAPI = showapi.New(beego.AppConfig.DefaultInt("showAppID", 0), beego.AppConfig.DefaultString("showAppSecret", "")) Cacher = redis.New(beego.AppConfig.DefaultString("redisHost", "localhost"), beego.AppConfig.DefaultInt("redisPort", 0), beego.AppConfig.DefaultString("redisPassword", "")) + WeimobAPI = weimobapi.New(nil, beego.AppConfig.DefaultString("weimobAppID", ""), beego.AppConfig.DefaultString("weimobAppSecret", "")) } func initElm() { - token := beego.AppConfig.String("elmToken") - if token == "" { - db := orm.NewOrm() - var tokenInfo []orm.Params - num, err := db.Raw("SELECT * FROM config WHERE thirdparty='eleme'").Values(&tokenInfo) - if err != nil || num != 1 { - panic(err.Error()) - } + token := beego.AppConfig.DefaultString("elmToken", "") + // if token == "" { + // db := orm.NewOrm() + // var tokenInfo []orm.Params + // num, err := db.Raw("SELECT * FROM config WHERE thirdparty='eleme'").Values(&tokenInfo) + // if err != nil || num != 1 { + // panic(err.Error()) + // } - var tokenInfo2 map[string]interface{} - if err := utils.UnmarshalUseNumber([]byte(tokenInfo[0]["token"].(string)), &tokenInfo2); err != nil { - panic(err.Error()) - } - token = tokenInfo2["accessToken"].(string) - } + // var tokenInfo2 map[string]interface{} + // if err := utils.UnmarshalUseNumber([]byte(tokenInfo[0]["token"].(string)), &tokenInfo2); err != nil { + // panic(err.Error()) + // } + // token = tokenInfo2["accessToken"].(string) + // } ElmAPI = elmapi.New(token, beego.AppConfig.String("elmAppKey"), beego.AppConfig.String("elmSecret"), beego.AppConfig.DefaultBool("elmIsProd", false)) } diff --git a/globals/globals.go b/globals/globals.go index 4ec63597c..bd9518c7e 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -32,7 +32,9 @@ var ( OrderUseNewTable bool - QiniuBucket string + QiniuBucket string + WeimobCallbackURL string + WeimobStateSecret string ) func init() { @@ -66,4 +68,7 @@ func Init() { OrderUseNewTable = beego.AppConfig.DefaultBool("orderUseNewTable", false) } QiniuBucket = beego.AppConfig.String("qiniuBucket") + + WeimobCallbackURL = beego.AppConfig.DefaultString("weimobCallbackURL", "") + WeimobStateSecret = beego.AppConfig.DefaultString("weimobStateSecret", "") } diff --git a/main.go b/main.go index 96a1f5555..c8822ee97 100644 --- a/main.go +++ b/main.go @@ -81,17 +81,19 @@ func checkCmdFlags() bool { func main() { if !checkCmdFlags() { Init() - if beego.BConfig.RunMode == "prod" { - if err := tasks.RefreshWeixinToken(); err != nil { - 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 - } - orderman.LoadPendingOrders() + if err := tasks.RefreshWeixinToken(); err != nil { + 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 + } + orderman.LoadPendingOrders() if beego.BConfig.RunMode != "prod" { beego.BConfig.WebConfig.DirectoryIndex = true