wechat.go 2.5 KB

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