wechat.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package services
  2. import (
  3. "errors"
  4. "eta/eta_mini_bridge/utils"
  5. "fmt"
  6. "time"
  7. "github.com/silenceper/wechat/v2"
  8. "github.com/silenceper/wechat/v2/cache"
  9. "github.com/silenceper/wechat/v2/credential"
  10. "github.com/silenceper/wechat/v2/officialaccount"
  11. "github.com/silenceper/wechat/v2/officialaccount/config"
  12. "github.com/silenceper/wechat/v2/officialaccount/js"
  13. "github.com/silenceper/wechat/v2/officialaccount/user"
  14. )
  15. type WechatAccessToken struct {
  16. }
  17. func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
  18. wc := wechat.NewWechat()
  19. memory := cache.NewMemory()
  20. conf := &config.Config{
  21. AppID: utils.WX_APPID,
  22. AppSecret: utils.WX_APP_SECRET,
  23. Token: "",
  24. EncodingAESKey: "",
  25. Cache: memory,
  26. }
  27. officialAccount = wc.GetOfficialAccount(conf)
  28. wechatAccessToken := &WechatAccessToken{}
  29. officialAccount.SetAccessTokenHandle(wechatAccessToken)
  30. return
  31. }
  32. // GetAccessToken 获取accessToken
  33. func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) {
  34. accessToken, err = utils.Rc.RedisString(utils.CACHE_WX_ACCESS_TOKEN_HZ)
  35. if accessToken != "" {
  36. return
  37. }
  38. // 缓存中没有取到数据,那么就需要强制刷新的accessToken
  39. tmpAccessToken, expires, tmpErr := getTokenFromServer(utils.WX_APPID, utils.WX_APP_SECRET)
  40. if tmpAccessToken == "" {
  41. err = errors.New("获取微信token失败,Err:" + tmpErr.Error())
  42. return
  43. }
  44. redisTimeExpire := time.Duration(expires-600) * time.Second
  45. err = utils.Rc.Put(utils.CACHE_WX_ACCESS_TOKEN_HZ, tmpAccessToken, redisTimeExpire)
  46. if err != nil {
  47. err = errors.New("更新微信token失败")
  48. return
  49. }
  50. return
  51. }
  52. // //如果300s就要过期了,那么就去刷新accessToken
  53. // if wxToken.ExpiresIn < time.Now().Unix()+300 {
  54. // tmpAccessToken, expires, tmpErr := getTokenFromServer(WxAppId, WxAppSecret)
  55. // if tmpErr != nil {
  56. // err = tmpErr
  57. // return
  58. // }
  59. // var updateCols = []string{"access_token", "expires_in"}
  60. // wxToken.AccessToken = tmpAccessToken
  61. // wxToken.ExpiresIn = expires - 600 //快过期前10分钟就刷新掉
  62. // wxToken.Update(updateCols)
  63. // }
  64. // accessToken = wxToken.AccessToken
  65. // return refreshWxAccessToken(wxAppId, wxAppSecret)
  66. // getTokenFromServer 服务端获取accessToken
  67. func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) {
  68. apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
  69. resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret))
  70. if err != nil {
  71. return
  72. }
  73. expires = resAccessToken.ExpiresIn
  74. accessToken = resAccessToken.AccessToken
  75. return
  76. }
  77. // GetUserInfo 获取微信用户详情
  78. func GetUserInfo(openid string) (userInfo *user.Info, err error) {
  79. wechatClient := GetWxChat()
  80. userClient := wechatClient.GetUser()
  81. userInfo, err = userClient.GetUserInfo(openid)
  82. return
  83. }
  84. // GetJsConfig 获取公众号jsConfig
  85. func GetJsConfig(signUrl string) (jsConf *js.Config, err error) {
  86. wechatClient := GetWxChat()
  87. j := wechatClient.GetJs()
  88. jsConf, err = j.GetConfig(signUrl)
  89. return
  90. }