context.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package context
  2. import (
  3. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gogf/gf/frame/g"
  7. "sync"
  8. "time"
  9. )
  10. const (
  11. //AccessTokenURL 获取access_token的接口
  12. AccessTokenURL = "https://oapi.dingtalk.com/gettoken"
  13. )
  14. //ResAccessToken 结构体
  15. type ResAccessToken struct {
  16. AccessToken string `json:"access_token"`
  17. ExpiresIn int64 `json:"expires_in"`
  18. Code int64 `json:"errcode"`
  19. Msg string `json:"errmsg"`
  20. }
  21. type Context struct {
  22. *Config
  23. //accessTokenLock 读写锁 同一个AppKey一个
  24. accessTokenLock *sync.RWMutex
  25. SubsMessage *message.SubsMessage
  26. }
  27. //SetAccessTokenLock 设置读写锁(一个appID一个读写锁)
  28. func (ctx *Context) SetAccessTokenLock(l *sync.RWMutex) {
  29. ctx.accessTokenLock = l
  30. }
  31. //GetAccessToken 获取access_token
  32. func (ctx *Context) GetAccessToken() (accessToken string, err error) {
  33. ctx.accessTokenLock.Lock()
  34. defer ctx.accessTokenLock.Unlock()
  35. accessTokenCacheKey := fmt.Sprintf("access_token_%s", ctx.AppKey)
  36. val, _ := ctx.Cache.Get(accessTokenCacheKey)
  37. if val != nil {
  38. accessToken = val.(string)
  39. return
  40. }
  41. //从钉钉服务器获取
  42. var resAccessToken ResAccessToken
  43. resAccessToken, err = ctx.GetAccessTokenFromServer()
  44. if err != nil {
  45. return
  46. }
  47. accessToken = resAccessToken.AccessToken
  48. return
  49. }
  50. //CleanAccessTokenCache clean cache
  51. func (ctx *Context) CleanAccessTokenCache() {
  52. accessTokenCacheKey := fmt.Sprintf("access_token_%s", ctx.AppKey)
  53. ctx.Cache.Remove(accessTokenCacheKey)
  54. }
  55. //GetAccessTokenFromServer 强制从服务器获取token
  56. func (ctx *Context) GetAccessTokenFromServer() (token ResAccessToken, err error) {
  57. url := fmt.Sprintf("%s?appkey=%s&appsecret=%s", AccessTokenURL, ctx.AppKey, ctx.AppSecret)
  58. body := g.Client().GetBytes(url)
  59. err = json.Unmarshal(body, &token)
  60. if err != nil {
  61. return
  62. }
  63. if token.Code != 0 {
  64. err = fmt.Errorf("get access_token error : errcode=%v , errormsg=%v", token.Code, token.Msg)
  65. return
  66. }
  67. accessTokenCacheKey := fmt.Sprintf("access_token_%s", ctx.AppKey)
  68. expires := token.ExpiresIn - 1500
  69. err = ctx.Cache.Set(accessTokenCacheKey, token.AccessToken, time.Duration(expires)*time.Second)
  70. return
  71. }