wechat.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package services
  2. import (
  3. "eta/eta_mini_bridge/models"
  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. var (
  16. WxAppId string
  17. WxAppSecret string
  18. )
  19. type WechatAccessToken struct {
  20. }
  21. func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
  22. wc := wechat.NewWechat()
  23. memory := cache.NewMemory()
  24. conf := &config.Config{
  25. AppID: utils.DW_WX_APPID,
  26. AppSecret: utils.DW_WX_APP_SECRET,
  27. Token: "",
  28. EncodingAESKey: "",
  29. Cache: memory,
  30. }
  31. officialAccount = wc.GetOfficialAccount(conf)
  32. wechatAccessToken := &WechatAccessToken{}
  33. officialAccount.SetAccessTokenHandle(wechatAccessToken)
  34. return
  35. }
  36. // GetAccessToken 获取accessToken
  37. func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) {
  38. wxToken, err := models.GetWxTokenById()
  39. if err != nil {
  40. return
  41. }
  42. //如果300s就要过期了,那么就去刷新accessToken
  43. if wxToken.ExpiresIn < time.Now().Unix()+300 {
  44. tmpAccessToken, expires, tmpErr := getTokenFromServer(WxAppId, WxAppSecret)
  45. if tmpErr != nil {
  46. err = tmpErr
  47. return
  48. }
  49. var updateCols = []string{"access_token", "expires_in"}
  50. wxToken.AccessToken = tmpAccessToken
  51. wxToken.ExpiresIn = expires - 600 //快过期前10分钟就刷新掉
  52. wxToken.Update(updateCols)
  53. }
  54. accessToken = wxToken.AccessToken
  55. return
  56. }
  57. // getTokenFromServer 服务端获取accessToken
  58. func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) {
  59. apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
  60. resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret))
  61. if err != nil {
  62. return
  63. }
  64. expires = resAccessToken.ExpiresIn
  65. accessToken = resAccessToken.AccessToken
  66. return
  67. }
  68. // GetUserInfo 获取微信用户详情
  69. func GetUserInfo(openid string) (userInfo *user.Info, err error) {
  70. wechatClient := GetWxChat()
  71. userClient := wechatClient.GetUser()
  72. userInfo, err = userClient.GetUserInfo(openid)
  73. return
  74. }
  75. // GetJsConfig 获取公众号jsConfig
  76. func GetJsConfig(signUrl string) (jsConf *js.Config, err error) {
  77. wechatClient := GetWxChat()
  78. j := wechatClient.GetJs()
  79. jsConf, err = j.GetConfig(signUrl)
  80. return
  81. }