token.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package weixin
  2. import (
  3. "time"
  4. "zhiyuan/models"
  5. "zhiyuan/pkg/config"
  6. "zhiyuan/pkg/db"
  7. "zhiyuan/pkg/errcode"
  8. "zhiyuan/pkg/redis"
  9. "zhiyuan/pkg/utils"
  10. )
  11. const tokenPrefix = "weixin_token_"
  12. func CheckToken(token string) (*models.WeixinUser, errcode.Err) {
  13. result, err := redis.Get(tokenPrefix + token)
  14. var user models.WeixinUser
  15. if err != nil {
  16. db.GetModel(map[string]interface{}{
  17. "access_token": token,
  18. }, &user)
  19. if user.ID == 0 {
  20. return nil, errcode.TokenInvalid
  21. }
  22. redis.Set(tokenPrefix+"_"+token, user, 3600)
  23. redis.Set(tokenPrefix+"_"+utils.ToStr(user.ID), tokenPrefix+token, 3600)
  24. } else {
  25. utils.JsonDecode(result).To(&user)
  26. }
  27. if user.ID == 0 || time.Now().Unix() >= utils.StrTo(utils.ToStr(user.AccessTokenExpired)).MustInt64() {
  28. return nil, errcode.TokenExpired
  29. }
  30. return &user, errcode.Err{}
  31. }
  32. func UpdateToken(id int) (string, error) {
  33. token := utils.MD5(utils.ToStr(time.Now().UnixNano()) + string(utils.RandomCreateBytes(10, utils.RAND_KIND_ALL)))
  34. tokenExpired := int(time.Now().Unix()) + config.Cfg.App.TokenExpire
  35. err := db.UpdateModel(db.Type(models.WeixinUser{}), int64(id), map[string]interface{}{
  36. "access_token": token,
  37. "access_token_expired": tokenExpired})
  38. if err != nil {
  39. return token, err
  40. }
  41. preToken, _ := redis.Get(tokenPrefix + "_" + utils.ToStr(id))
  42. if preToken != "" {
  43. redis.Del(preToken)
  44. }
  45. return token, nil
  46. }
  47. func ClearToken(id int) error {
  48. db.UpdateModel(db.Type(models.WeixinUser{}), int64(id), map[string]interface{}{
  49. "access_token": ""})
  50. preToken, err := redis.Get(tokenPrefix + "_" + utils.ToStr(id))
  51. if preToken != "" {
  52. redis.Del(preToken)
  53. }
  54. return err
  55. }