package weixin import ( "time" "zhiyuan/models" "zhiyuan/pkg/config" "zhiyuan/pkg/db" "zhiyuan/pkg/errcode" "zhiyuan/pkg/redis" "zhiyuan/pkg/utils" ) const tokenPrefix = "weixin_token_" func CheckToken(token string) (*models.WeixinUser, errcode.Err) { result, err := redis.Get(tokenPrefix + token) var user models.WeixinUser if err != nil { db.GetModel(map[string]interface{}{ "access_token": token, }, &user) if user.ID == 0 { return nil, errcode.TokenInvalid } redis.Set(tokenPrefix+"_"+token, user, 3600) redis.Set(tokenPrefix+"_"+utils.ToStr(user.ID), tokenPrefix+token, 3600) } else { utils.JsonDecode(result).To(&user) } if user.ID == 0 || time.Now().Unix() >= utils.StrTo(utils.ToStr(user.AccessTokenExpired)).MustInt64() { return nil, errcode.TokenExpired } return &user, errcode.Err{} } func UpdateToken(id int) (string, error) { token := utils.MD5(utils.ToStr(time.Now().UnixNano()) + string(utils.RandomCreateBytes(10, utils.RAND_KIND_ALL))) tokenExpired := int(time.Now().Unix()) + config.Cfg.App.TokenExpire err := db.UpdateModel(db.Type(models.WeixinUser{}), int64(id), map[string]interface{}{ "access_token": token, "access_token_expired": tokenExpired}) if err != nil { return token, err } preToken, _ := redis.Get(tokenPrefix + "_" + utils.ToStr(id)) if preToken != "" { redis.Del(preToken) } return token, nil } func ClearToken(id int) error { db.UpdateModel(db.Type(models.WeixinUser{}), int64(id), map[string]interface{}{ "access_token": ""}) preToken, err := redis.Get(tokenPrefix + "_" + utils.ToStr(id)) if preToken != "" { redis.Del(preToken) } return err }