cache.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package wx
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. type CacheItem struct {
  7. Value string
  8. ExpiresIn int64
  9. UpdatedAt time.Time
  10. }
  11. func (item *CacheItem) IsExpired() bool {
  12. periodDuration := time.Duration((item.ExpiresIn - 120) * 1000 * 1000 * 1000)
  13. return item.UpdatedAt.Add(periodDuration).Before(time.Now())
  14. }
  15. type WXCache interface {
  16. GetAccessToken() (string, error)
  17. GetJsTicket() (string, error)
  18. }
  19. func NewWXCache(appId, secret string) WXCache {
  20. return DefaultWXCache{
  21. "appId": appId,
  22. "secret": secret,
  23. }
  24. }
  25. type DefaultWXCache map[string]interface{}
  26. func (cache DefaultWXCache) GetAccessToken() (string, error) {
  27. if accessTokenCache, ok := cache["accessTokenCache"]; ok {
  28. if cacheItem, ok := accessTokenCache.(*CacheItem); ok && !cacheItem.IsExpired() {
  29. return cacheItem.Value, nil
  30. }
  31. }
  32. weixin := NewWeixin(cache["appId"].(string), cache["secret"].(string))
  33. accessTokenRes, err := weixin.GetAccessToken()
  34. if err != nil {
  35. return "", err
  36. }
  37. if accessTokenRes.ErrCode != 0 {
  38. return "", errors.New(accessTokenRes.ErrMsg)
  39. }
  40. //cache accesstoken
  41. tokenCache := &CacheItem{
  42. Value: accessTokenRes.AccessToken,
  43. UpdatedAt: time.Now(),
  44. ExpiresIn: accessTokenRes.ExpiresIn,
  45. }
  46. cache["accessTokenCache"] = tokenCache
  47. return accessTokenRes.AccessToken, nil
  48. }
  49. func (cache DefaultWXCache) GetJsTicket() (string, error) {
  50. if jsTicketCache, ok := cache["jsTicketCache"]; ok {
  51. if cacheItem, ok := jsTicketCache.(*CacheItem); ok && !cacheItem.IsExpired() {
  52. return cacheItem.Value, nil
  53. }
  54. }
  55. accessToken, err := cache.GetAccessToken()
  56. if err != nil {
  57. return "", err
  58. }
  59. wxJsSdk := NewJsSdk()
  60. ticketRes, err := wxJsSdk.GetTicket(accessToken)
  61. if err != nil {
  62. return "", err
  63. }
  64. if ticketRes.ErrCode != 0 {
  65. return "", errors.New(ticketRes.ErrMsg)
  66. }
  67. //cache
  68. //jsTicket
  69. ticketCache := &CacheItem{
  70. Value: ticketRes.Ticket,
  71. UpdatedAt: time.Now(),
  72. ExpiresIn: ticketRes.ExpiresIn,
  73. }
  74. cache["jsTicketCache"] = ticketCache
  75. return ticketCache.Value, nil
  76. }