token.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package wx
  2. import (
  3. "github.com/silenceper/wechat/oauth"
  4. "sync"
  5. "time"
  6. )
  7. type tokenTiming struct {
  8. Token *oauth.ResAccessToken
  9. Timing time.Time
  10. }
  11. var tokenMap map[string]*tokenTiming
  12. var mutex sync.Mutex
  13. func init(){
  14. tokenMap = make(map[string]*tokenTiming)
  15. tokenCheckLoop()
  16. }
  17. func addToken(openId string, token *oauth.ResAccessToken) {
  18. mutex.Lock()
  19. defer mutex.Unlock()
  20. // 无则添加,有则更新
  21. tokenMap[openId] = &tokenTiming{
  22. Token: token,
  23. Timing: time.Now(),
  24. }
  25. }
  26. func getToken(openId string) *oauth.ResAccessToken{
  27. mutex.Lock()
  28. defer mutex.Unlock()
  29. if t, exists := tokenMap[openId]; !exists{
  30. return nil
  31. }else{
  32. return t.Token
  33. }
  34. }
  35. func removeToken(openId string){
  36. mutex.Lock()
  37. defer mutex.Unlock()
  38. if _, exists := tokenMap[openId]; exists{
  39. delete(tokenMap, openId)
  40. }
  41. }
  42. func tokenCheckLoop(){
  43. go func(){
  44. t:=time.NewTicker(10 * 60 * time.Second)
  45. for {
  46. select {
  47. case <-t.C:
  48. mutex.Lock()
  49. ks := make([]string, 0)
  50. for k, v := range tokenMap{
  51. if time.Now().Sub(v.Timing) > 90 * time.Minute{
  52. ks = append(ks, k)
  53. }
  54. }
  55. for i := range ks{
  56. //t, err := wxoauth.RefreshAccessToken(tokenMap[ks[i]].Token.RefreshToken)
  57. //if err != nil{
  58. // delete(tokenMap, ks[i])
  59. // continue
  60. //}else{
  61. // tokenMap[ks[i]] = t
  62. //}
  63. // 暂时删除不刷新
  64. delete(tokenMap, ks[i])
  65. }
  66. mutex.Unlock()
  67. }
  68. }
  69. }()
  70. }