wechat.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package wechat
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_api/models"
  5. "eta/eta_mini_api/utils"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "time"
  10. "github.com/silenceper/wechat/v2"
  11. "github.com/silenceper/wechat/v2/cache"
  12. "github.com/silenceper/wechat/v2/credential"
  13. "github.com/silenceper/wechat/v2/officialaccount"
  14. "github.com/silenceper/wechat/v2/officialaccount/config"
  15. "github.com/silenceper/wechat/v2/officialaccount/js"
  16. "github.com/silenceper/wechat/v2/officialaccount/user"
  17. )
  18. var (
  19. WxAppId string
  20. WxAppSecret string
  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: utils.DW_WX_APPID,
  29. AppSecret: utils.DW_WX_APP_SECRET,
  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. // GetSession 获取用户详情
  79. // func GetSession(code string) (userInfo auth.ResCode2Session, err error) {
  80. // wechatClient := GetWxChat()
  81. // userClient := wechatClient.GetUser()
  82. // userInfo, err = authClient.Code2Session(code)
  83. // return
  84. // }
  85. // GetJsConfig 获取公众号jsConfig
  86. func GetJsConfig(signUrl string) (jsConf *js.Config, err error) {
  87. wechatClient := GetWxChat()
  88. j := wechatClient.GetJs()
  89. jsConf, err = j.GetConfig(signUrl)
  90. return
  91. }
  92. type WxUserToken struct {
  93. OpenId string
  94. UnionId string
  95. AccessToken string
  96. ExpiresIn string
  97. RefreshToken string
  98. Scope string
  99. }
  100. func GetOpenId(code string) (info *WxUserToken, err error) {
  101. httpUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?
  102. appid=%s&secret=%s&code=%s&grant_type=authorization_code`
  103. httpUrl = fmt.Sprintf(httpUrl, utils.WX_APPID, utils.WX_APP_SECRET, code)
  104. client := http.Client{}
  105. wxReq, err := http.NewRequest("GET", httpUrl, nil)
  106. if err != nil {
  107. return
  108. }
  109. response, err := client.Do(wxReq)
  110. if err != nil {
  111. return
  112. }
  113. defer response.Body.Close()
  114. body, err := io.ReadAll(response.Body)
  115. if err != nil {
  116. return
  117. }
  118. if err = json.Unmarshal(body, &info); err != nil {
  119. return
  120. }
  121. return
  122. }