wechat.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package auth
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_ht_api/models"
  5. "fmt"
  6. "github.com/silenceper/wechat/v2"
  7. "github.com/silenceper/wechat/v2/cache"
  8. "gorm.io/gorm"
  9. "io"
  10. "net/http"
  11. "time"
  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. // 海通公众号配置
  23. const (
  24. HT_WX_APPID = "wxf0dfb65c325fee66"
  25. HT_WX_APP_SECRET = "4f2a6c4f9b0a9dee08d1b3b316f33228"
  26. HT_WX_ID = "gh_b2f5b115ec8d"
  27. )
  28. type WechatAccessToken struct {
  29. }
  30. var DefaultKey = "zcmRedis"
  31. // GetAccessToken 获取accessToken
  32. func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) {
  33. wxToken, err := models.GetWxTokenById()
  34. var isRegister bool
  35. if err != nil {
  36. if err == gorm.ErrRecordNotFound {
  37. isRegister = true
  38. } else {
  39. return
  40. }
  41. }
  42. if isRegister {
  43. tmpAccessToken, expires, tmpErr := getTokenFromServer(HT_WX_APPID, HT_WX_APP_SECRET)
  44. if tmpErr != nil {
  45. err = tmpErr
  46. return
  47. }
  48. token := new(models.WxToken)
  49. token.AccessToken = tmpAccessToken
  50. token.ExpiresIn = expires
  51. err = models.RegisterWxToken(token)
  52. if err != nil {
  53. return "", err
  54. }
  55. accessToken = tmpAccessToken
  56. return
  57. }
  58. //如果300s就要过期了,那么就去刷新accessToken
  59. if wxToken.ExpiresIn < time.Now().Unix()+300 {
  60. tmpAccessToken, expires, tmpErr := getTokenFromServer(HT_WX_APPID, HT_WX_APP_SECRET)
  61. if tmpErr != nil {
  62. err = tmpErr
  63. return
  64. }
  65. expiresIn := time.Now().Unix() + expires - 600 //快过期前10分钟就刷新掉
  66. models.UpdateWxToken(tmpAccessToken, expiresIn)
  67. accessToken = tmpAccessToken
  68. }
  69. accessToken = wxToken.AccessToken
  70. return
  71. }
  72. // getTokenFromServer 服务端获取accessToken
  73. func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) {
  74. apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
  75. resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret))
  76. if err != nil {
  77. return
  78. }
  79. expires = resAccessToken.ExpiresIn
  80. accessToken = resAccessToken.AccessToken
  81. return
  82. }
  83. func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
  84. wc := wechat.NewWechat()
  85. memory := cache.NewMemory()
  86. conf := &config.Config{
  87. AppID: HT_WX_APPID,
  88. AppSecret: HT_WX_APP_SECRET,
  89. Token: "",
  90. EncodingAESKey: "",
  91. Cache: memory,
  92. }
  93. officialAccount = wc.GetOfficialAccount(conf)
  94. wechatAccessToken := &WechatAccessToken{}
  95. officialAccount.SetAccessTokenHandle(wechatAccessToken)
  96. return
  97. }
  98. // GetUserInfo 获取微信用户详情
  99. func GetUserInfo(openid string) (userInfo *user.Info, err error) {
  100. wechatClient := GetWxChat()
  101. userClient := wechatClient.GetUser()
  102. userInfo, err = userClient.GetUserInfo(openid)
  103. return
  104. }
  105. // GetJsConfig 获取公众号jsConfig
  106. func GetJsConfig(signUrl string) (jsConf *js.Config, err error) {
  107. wechatClient := GetWxChat()
  108. j := wechatClient.GetJs()
  109. jsConf, err = j.GetConfig(signUrl)
  110. return
  111. }
  112. type WxUserInfo struct {
  113. OpenId string `json:"openid"`
  114. AccessToken string `json:"access_token"`
  115. RefreshToken string `json:"refresh_token"`
  116. Scope string `json:"scope"`
  117. ErrCode int
  118. ErrMsg string
  119. }
  120. func GetWxUserInfo(code string) (info *WxUserInfo, err error) {
  121. httpUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
  122. httpUrl = fmt.Sprintf(httpUrl, HT_WX_APPID, HT_WX_APP_SECRET, code)
  123. client := http.Client{}
  124. wxReq, err := http.NewRequest("GET", httpUrl, nil)
  125. if err != nil {
  126. return
  127. }
  128. response, err := client.Do(wxReq)
  129. if err != nil {
  130. return
  131. }
  132. defer response.Body.Close()
  133. body, err := io.ReadAll(response.Body)
  134. if err != nil {
  135. return
  136. }
  137. if err = json.Unmarshal(body, &info); err != nil {
  138. return
  139. }
  140. return
  141. }
  142. // GetUserInfo 获取微信用户详情
  143. func GetWxUserDetail(openid string) (userInfo *user.Info, err error) {
  144. wechatClient := GetWxChat()
  145. userClient := wechatClient.GetUser()
  146. userInfo, err = userClient.GetUserInfo(openid)
  147. return
  148. }