From 294a208d6c482ad14bccb86aef9aef4fad43d7d2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Jun 2018 18:49:26 +0800 Subject: [PATCH] - elm and weixin token refresh added. --- business/elm/controller/order.go | 2 +- business/freshfood/freshfood.go | 10 ++-- business/models/config.go | 8 +++ business/tasks/configrefresh.go | 90 ++++++++++++++++++++++++++++++++ globals/globals2/globals2.go | 86 +++++++++++++++++------------- main.go | 3 ++ 6 files changed, 160 insertions(+), 39 deletions(-) create mode 100644 business/models/config.go create mode 100644 business/tasks/configrefresh.go diff --git a/business/elm/controller/order.go b/business/elm/controller/order.go index 6f052c629..7f4455679 100644 --- a/business/elm/controller/order.go +++ b/business/elm/controller/order.go @@ -72,7 +72,7 @@ func (o *OrderController) OrderStatusChanged(msg *elmapi.CallbackMsg, orderId st return errResponseDBError } if rec.Type != msg.Type { - err = globals2.FreshFoodAPI.ELMOrderStatus(orderId, msg.Type, utils.GetCurTimestamp()) + err = globals2.FreshFoodAPI.ELMOrderStatus(orderId, msg.Type, utils.GetCurTimeStr()) if err != nil { return errResponseInternal } else { diff --git a/business/freshfood/freshfood.go b/business/freshfood/freshfood.go index fe71af91a..53e15b133 100644 --- a/business/freshfood/freshfood.go +++ b/business/freshfood/freshfood.go @@ -102,7 +102,11 @@ func (f *FreshFoodAPI) AccessFreshFood(apiStr string, params url.Values) error { var response *http.Response fullURL := f.baseURL + "/" + apiStr for i := 0; i < retryCount; i++ { - response, err = f.client.PostForm(fullURL, params) + if params != nil { + response, err = f.client.PostForm(fullURL, params) + } else { + response, err = f.client.Get(fullURL) + } // err = error(nil) // globals.SugarLogger.Debug(fullURL) // globals.SugarLogger.Debug(params) @@ -172,12 +176,12 @@ func (f *FreshFoodAPI) NewELMOrder(order map[string]interface{}) error { return f.AccessFreshFood(URL_FRESHFOOD_ORDER_CREATE_ELEME, params) } -func (f *FreshFoodAPI) ELMOrderStatus(orderId string, status int, timestamp int64) error { +func (f *FreshFoodAPI) ELMOrderStatus(orderId string, status int, statusTime string) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_VENDERID, utils.Int2Str(ELM_VENDERID)) params.Set(URL_FRESHFOOD_PARA_ORDERID, orderId) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, utils.Int2Str(status)) - params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, utils.Timestamp2Str(timestamp)) + params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, statusTime) return f.AccessFreshFood(URL_FRESHFOOD_PARA_ORDERSTATUS, params) } diff --git a/business/models/config.go b/business/models/config.go new file mode 100644 index 000000000..30340a393 --- /dev/null +++ b/business/models/config.go @@ -0,0 +1,8 @@ +package models + +type Config struct { + Id int + Thirdparty string `orm:"size(20);unique"` + Token string `orm:"size(300)"` + Date string `orm:"size(30)"` +} diff --git a/business/tasks/configrefresh.go b/business/tasks/configrefresh.go new file mode 100644 index 000000000..35ced2c12 --- /dev/null +++ b/business/tasks/configrefresh.go @@ -0,0 +1,90 @@ +package tasks + +import ( + "time" + + "git.rosy.net.cn/jx-callback/globals/globals2" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" + + "git.rosy.net.cn/jx-callback/business/models" + "github.com/astaxie/beego/orm" +) + +const ( + weixinTokenExpires = 7200 * time.Second + elmTokenExpires = 20 * 24 * 3600 * time.Second +) + +func RefreshConfig(configKey string, expiresTime time.Duration, configGetter func() string) { + go func() { + sleepGap := expiresTime / 10 + needRefreshGap := expiresTime * 8 / 10 + + for { + curConfig := &models.Config{ + Thirdparty: configKey, + } + + db := orm.NewOrm() + // 0: don't refresh, 1 update, 2 insert + handleType := 0 + if err := db.Read(curConfig, "Thirdparty"); err != nil { + if err != orm.ErrNoRows { + globals.SugarLogger.Error("db error:%v", err) + } else { + curConfig.Token = configGetter() + handleType = 2 + } + } else { + latestTimeStr := utils.Time2Str(time.Now().Add(-needRefreshGap)) + if curConfig.Date <= latestTimeStr { + curConfig.Token = configGetter() + handleType = 1 + } + } + + if handleType != 0 { + globals.SugarLogger.Debug(configKey) + curConfig.Date = utils.GetCurTimeStr() + var num int64 + var err error + + if handleType == 1 { + num, err = db.Update(curConfig, "Token", "Date") + } else { + num, err = db.Insert(curConfig) + } + if err != nil || num == 0 { + globals.SugarLogger.Errorf("db error:%v, num:%d", err, num) + } else { + if configKey == "wechat" { + globals2.FreshFoodAPI.AccessFreshFood("weixin/accesstoken/update", nil) + } else if configKey == "eleme" { + globals2.FreshFoodAPI.AccessFreshFood("eleme/token/update", nil) + } + } + } + time.Sleep(sleepGap) + } + }() +} + +func RefreshWeixinToken() { + RefreshConfig("wechat", weixinTokenExpires, func() string { + if tokenInfo, err := globals2.WeixinAPI.RefreshToken(); err == nil { + return tokenInfo.AccessToken + } + return "" + }) +} + +func RefreshElmToken() { + RefreshConfig("eleme", elmTokenExpires, func() string { + if tokenInfo, err := globals2.ElmAPI.RefreshToken(); err == nil { + return string(utils.MustMarshal(tokenInfo)) + } + return "" + }) +} diff --git a/globals/globals2/globals2.go b/globals/globals2/globals2.go index 52deed855..221b7bf71 100644 --- a/globals/globals2/globals2.go +++ b/globals/globals2/globals2.go @@ -5,52 +5,55 @@ import ( "git.rosy.net.cn/baseapi/platformapi/elmapi" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/mtpsapi" + "git.rosy.net.cn/baseapi/platformapi/weixinapi" "git.rosy.net.cn/baseapi/utils" elmmodels "git.rosy.net.cn/jx-callback/business/elm/models" "git.rosy.net.cn/jx-callback/business/freshfood" - "git.rosy.net.cn/jx-callback/business/jd/models" + jdmodels "git.rosy.net.cn/jx-callback/business/jd/models" + "git.rosy.net.cn/jx-callback/business/models" + "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" // import your used driver ) const ( - // freshFoodServerURL = "http://test.jxc4.com" - freshFoodServerURL = "http://portal.int.jxc4.com" + freshFoodServerURL = "http://test.jxc4.com" + // freshFoodServerURL = "http://portal.int.jxc4.com" ) const ( // 京东西安账号 - // jdToken = "c8854ef2-f80a-45ee-aceb-dc8014d646f8" - // jdAppKey = "06692746f7224695ad4788ce340bc854" - // jdSecret = "d6b42a35a7414a5490d811654d745c84" + jdToken = "c8854ef2-f80a-45ee-aceb-dc8014d646f8" + jdAppKey = "06692746f7224695ad4788ce340bc854" + jdSecret = "d6b42a35a7414a5490d811654d745c84" // 京东全国账号 - jdToken = "91633f2a-c5f5-4982-a925-a220d19095c3" - jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" - jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" + // jdToken = "91633f2a-c5f5-4982-a925-a220d19095c3" + // jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" + // jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" ) const ( - // 饿了么生产 - elmIsProd = true - elmToken = "" //"bab2a27f99562f394b411dbb9a6214da" - elmAppKey = "KLRDcOZGrk" - elmSecret = "1fc221f8265506531da36fb613d5f5ad673f2e9a" + elmIsProd = false + elmToken = "2d2b583447b04b6bba5a6f3faed3559b" + elmAppKey = "RwT214gAsS" + elmSecret = "56afff4b9ebd8a7eb532d18fa33f17be57f9b9db" - // elmIsProd = false - // elmToken = "2d2b583447b04b6bba5a6f3faed3559b" - // elmAppKey = "RwT214gAsS" - // elmSecret = "56afff4b9ebd8a7eb532d18fa33f17be57f9b9db" + // 饿了么生产 + // elmIsProd = true + // elmToken = "" //"bab2a27f99562f394b411dbb9a6214da" + // elmAppKey = "KLRDcOZGrk" + // elmSecret = "1fc221f8265506531da36fb613d5f5ad673f2e9a" ) const ( // 美团外卖测试 - // mtpsAppKey = "25e816550bc9484480642f19a95f13fd" - // mtpsSecret = "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^" + mtpsAppKey = "25e816550bc9484480642f19a95f13fd" + mtpsSecret = "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^" // 美团外卖生产 - mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" - mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + // mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" + // mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" ) const ( @@ -58,19 +61,29 @@ const ( dadaAppSecret = "30c2abbfe8a8780ad5aace46300c64b9" // 达达测试 - // dadaIsProd = false - // dadaCallbackURL = "http://callback.jxc4.com/dada/order" - // dadaSourceID = "73753" + dadaIsProd = false + dadaCallbackURL = "http://callback.jxc4.com/dada/order" + dadaSourceID = "73753" // 达达生产 - dadaIsProd = true - dadaCallbackURL = "http://portal.jingxicaishi.com/dada/order" - dadaSourceID = "6660" + // dadaIsProd = true + // dadaCallbackURL = "http://portal.jingxicaishi.com/dada/order" + // dadaSourceID = "6660" ) const ( - // dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jx-callback?charset=utf8&loc=Local" - dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jx_dev_0?charset=utf8&loc=Local" + // test + weixinAppID = "wxbf235770edaabc5c" + weixinSecret = "ba32b269a068a5b72486a0beafd171e8" + + // prod + // weixinAppID = "wx2bb99eb5d2c9b82c" + // weixinSecret = "6bbbed1443cc062c20a015a64c07a531" +) + +const ( + dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jx-callback?charset=utf8&loc=Local" + // dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jx_dev_0?charset=utf8&loc=Local" ) const ( @@ -80,10 +93,11 @@ const ( var ( FreshFoodAPI *freshfood.FreshFoodAPI - Jdapi *jdapi.API - ElmAPI *elmapi.API - MtpsAPI *mtpsapi.API - DadaAPI *dadaapi.API + Jdapi *jdapi.API + ElmAPI *elmapi.API + MtpsAPI *mtpsapi.API + DadaAPI *dadaapi.API + WeixinAPI *weixinapi.API ) func init() { @@ -93,6 +107,7 @@ func init() { initElm() MtpsAPI = mtpsapi.New(mtpsAppKey, mtpsSecret) DadaAPI = dadaapi.New(dadaAppKey, dadaAppSecret, dadaSourceID, dadaCallbackURL, dadaIsProd) + WeixinAPI = weixinapi.New(weixinAppID, weixinSecret) } func initElm() { @@ -119,8 +134,9 @@ func initDB() { orm.RegisterDataBase("default", "mysql", dbConnectStr, 30) // register model - orm.RegisterModel(new(models.Jdorder)) + orm.RegisterModel(new(jdmodels.Jdorder)) orm.RegisterModel(new(elmmodels.ELMOrder)) + orm.RegisterModel(new(models.Config)) // create table orm.RunSyncdb("default", false, true) diff --git a/main.go b/main.go index 74864d141..4f98de725 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "git.rosy.net.cn/baseapi" "git.rosy.net.cn/jx-callback/business/jd/controller" + "git.rosy.net.cn/jx-callback/business/tasks" "git.rosy.net.cn/jx-callback/globals" _ "git.rosy.net.cn/jx-callback/routers" "github.com/astaxie/beego" @@ -15,6 +16,8 @@ func main() { baseapi.Init(globals.SugarLogger) controller.InitOrder() + tasks.RefreshWeixinToken() + tasks.RefreshElmToken() if beego.BConfig.RunMode == "dev" { beego.BConfig.WebConfig.DirectoryIndex = true