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