You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

access_token.go 1.6 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package wechat
  2. import (
  3. "code.gitea.io/gitea/modules/redis/redis_client"
  4. "code.gitea.io/gitea/modules/redis/redis_key"
  5. "code.gitea.io/gitea/modules/redis/redis_lock"
  6. "time"
  7. )
  8. const EMPTY_REDIS_VAL = "Nil"
  9. var accessTokenLock = redis_lock.NewDistributeLock(redis_key.AccessTokenLockKey())
  10. func GetWechatAccessToken() string {
  11. token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
  12. if token != "" {
  13. if token == EMPTY_REDIS_VAL {
  14. return ""
  15. }
  16. live, _ := redis_client.TTL(redis_key.WechatAccessTokenKey())
  17. //refresh wechat access token when expire time less than 5 minutes
  18. if live > 0 && live < 300 {
  19. refreshAccessToken()
  20. }
  21. return token
  22. }
  23. return refreshAndGetAccessToken()
  24. }
  25. func refreshAccessToken() {
  26. if ok := accessTokenLock.Lock(3 * time.Second); ok {
  27. defer accessTokenLock.UnLock()
  28. callAccessTokenAndUpdateCache()
  29. }
  30. }
  31. func refreshAndGetAccessToken() string {
  32. if ok := accessTokenLock.LockWithWait(3*time.Second, 3*time.Second); ok {
  33. defer accessTokenLock.UnLock()
  34. token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
  35. if token != "" {
  36. if token == EMPTY_REDIS_VAL {
  37. return ""
  38. }
  39. return token
  40. }
  41. return callAccessTokenAndUpdateCache()
  42. }
  43. return ""
  44. }
  45. func callAccessTokenAndUpdateCache() string {
  46. r := callAccessToken()
  47. var token string
  48. if r != nil {
  49. token = r.Access_token
  50. }
  51. if token == "" {
  52. redis_client.Setex(redis_key.WechatAccessTokenKey(), EMPTY_REDIS_VAL, 10*time.Second)
  53. return ""
  54. }
  55. redis_client.Setex(redis_key.WechatAccessTokenKey(), token, time.Duration(r.Expires_in)*time.Second)
  56. return token
  57. }