wechat.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package wechat
  2. import (
  3. "eta/eta_mini_api/models"
  4. "eta/eta_mini_api/utils"
  5. "fmt"
  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/user"
  10. "time"
  11. "github.com/silenceper/wechat/v2/officialaccount"
  12. "github.com/silenceper/wechat/v2/officialaccount/config"
  13. )
  14. type WechatAccessToken struct{}
  15. func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
  16. wc := wechat.NewWechat()
  17. memory := cache.NewMemory()
  18. conf := &config.Config{
  19. AppID: utils.WX_APPID,
  20. AppSecret: utils.WX_APP_SECRET,
  21. Token: "",
  22. EncodingAESKey: "",
  23. Cache: memory,
  24. }
  25. officialAccount = wc.GetOfficialAccount(conf)
  26. wechatAccessToken := &WechatAccessToken{}
  27. officialAccount.SetAccessTokenHandle(wechatAccessToken)
  28. return
  29. }
  30. // GetAccessToken 获取accessToken
  31. func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) {
  32. wxToken, err := models.GetWxTokenById()
  33. if err != nil && err.Error() != utils.ErrNoRow() {
  34. return
  35. }
  36. //如果300s就要过期了,那么就去刷新accessToken
  37. if wxToken.ExpiresIn < time.Now().Unix()+300 {
  38. tmpAccessToken, expires, tmpErr := getTokenFromServer(utils.WX_APPID, utils.WX_APP_SECRET)
  39. if tmpErr != nil {
  40. err = tmpErr
  41. return
  42. }
  43. var updateCols = []string{"access_token", "expires_in"}
  44. wxToken.AccessToken = tmpAccessToken
  45. wxToken.ExpiresIn = time.Now().Unix() + expires - 600 //快过期前10分钟就刷新掉
  46. wxToken.Update(updateCols)
  47. }
  48. accessToken = wxToken.AccessToken
  49. return
  50. }
  51. // getTokenFromServer 服务端获取accessToken
  52. func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) {
  53. apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
  54. resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret))
  55. if err != nil {
  56. return
  57. }
  58. expires = resAccessToken.ExpiresIn
  59. accessToken = resAccessToken.AccessToken
  60. return
  61. }
  62. // GetUserInfo 获取微信用户详情
  63. func GetUserInfo(openid string) (userInfo *user.Info, err error) {
  64. wechatClient := GetWxChat()
  65. userClient := wechatClient.GetUser()
  66. userInfo, err = userClient.GetUserInfo(openid)
  67. return
  68. }
  69. type WxUserInfo struct {
  70. OpenId string `json:"openid"`
  71. AccessToken string `json:"access_token"`
  72. RefreshToken string `json:"refresh_token"`
  73. Scope string `json:"scope"`
  74. ErrCode int
  75. ErrMsg string
  76. }
  77. //func GetWxUserInfo(code string) (info *WxUserInfo, err error) {
  78. // httpUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
  79. //
  80. // httpUrl = fmt.Sprintf(httpUrl, utils.WX_APPID, utils.WX_APP_SECRET, code)
  81. //
  82. // client := http.Client{}
  83. // wxReq, err := http.NewRequest("GET", httpUrl, nil)
  84. // if err != nil {
  85. // return
  86. // }
  87. // response, err := client.Do(wxReq)
  88. // if err != nil {
  89. // return
  90. // }
  91. // defer response.Body.Close()
  92. // body, err := io.ReadAll(response.Body)
  93. // if err != nil {
  94. // return
  95. // }
  96. // alarm_msg.SendAlarmMsg(string(body), 1)
  97. // if err = json.Unmarshal(body, &info); err != nil {
  98. // return
  99. // }
  100. // return
  101. //}