- weimob token

This commit is contained in:
gazebo
2019-01-15 15:56:01 +08:00
parent 1e2d3ae0bb
commit 0873043449
6 changed files with 120 additions and 48 deletions

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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)
}
}
}

View File

@@ -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))
}

View File

@@ -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", "")
}

22
main.go
View File

@@ -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