qy_access_token.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package context
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "sync"
  7. "time"
  8. "github.com/silenceper/wechat/util"
  9. )
  10. const (
  11. //qyAccessTokenURL 获取access_token的接口
  12. qyAccessTokenURL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s"
  13. )
  14. //ResQyAccessToken struct
  15. type ResQyAccessToken struct {
  16. util.CommonError
  17. AccessToken string `json:"access_token"`
  18. ExpiresIn int64 `json:"expires_in"`
  19. }
  20. //SetQyAccessTokenLock 设置读写锁(一个appID一个读写锁)
  21. func (ctx *Context) SetQyAccessTokenLock(l *sync.RWMutex) {
  22. ctx.accessTokenLock = l
  23. }
  24. //GetQyAccessToken 获取access_token
  25. func (ctx *Context) GetQyAccessToken() (accessToken string, err error) {
  26. ctx.accessTokenLock.Lock()
  27. defer ctx.accessTokenLock.Unlock()
  28. accessTokenCacheKey := fmt.Sprintf("qy_access_token_%s", ctx.AppID)
  29. val := ctx.Cache.Get(accessTokenCacheKey)
  30. if val != nil {
  31. accessToken = val.(string)
  32. return
  33. }
  34. //从微信服务器获取
  35. var resQyAccessToken ResQyAccessToken
  36. resQyAccessToken, err = ctx.GetQyAccessTokenFromServer()
  37. if err != nil {
  38. return
  39. }
  40. accessToken = resQyAccessToken.AccessToken
  41. return
  42. }
  43. //GetQyAccessTokenFromServer 强制从微信服务器获取token
  44. func (ctx *Context) GetQyAccessTokenFromServer() (resQyAccessToken ResQyAccessToken, err error) {
  45. log.Printf("GetQyAccessTokenFromServer")
  46. url := fmt.Sprintf(qyAccessTokenURL, ctx.AppID, ctx.AppSecret)
  47. var body []byte
  48. body, err = util.HTTPGet(url)
  49. if err != nil {
  50. return
  51. }
  52. err = json.Unmarshal(body, &resQyAccessToken)
  53. if err != nil {
  54. return
  55. }
  56. if resQyAccessToken.ErrCode != 0 {
  57. err = fmt.Errorf("get qy_access_token error : errcode=%v , errormsg=%v", resQyAccessToken.ErrCode, resQyAccessToken.ErrMsg)
  58. return
  59. }
  60. qyAccessTokenCacheKey := fmt.Sprintf("qy_access_token_%s", ctx.AppID)
  61. expires := resQyAccessToken.ExpiresIn - 1500
  62. err = ctx.Cache.Set(qyAccessTokenCacheKey, resQyAccessToken.AccessToken, time.Duration(expires)*time.Second)
  63. return
  64. }