package wechat import ( "eta/eta_mini_api/models" "eta/eta_mini_api/utils" "fmt" "github.com/silenceper/wechat/v2" "github.com/silenceper/wechat/v2/cache" "github.com/silenceper/wechat/v2/credential" "github.com/silenceper/wechat/v2/officialaccount/user" "time" "github.com/silenceper/wechat/v2/officialaccount" "github.com/silenceper/wechat/v2/officialaccount/config" ) type WechatAccessToken struct{} func GetWxChat() (officialAccount *officialaccount.OfficialAccount) { wc := wechat.NewWechat() memory := cache.NewMemory() conf := &config.Config{ AppID: utils.WX_APPID, AppSecret: utils.WX_APP_SECRET, Token: "", EncodingAESKey: "", Cache: memory, } officialAccount = wc.GetOfficialAccount(conf) wechatAccessToken := &WechatAccessToken{} officialAccount.SetAccessTokenHandle(wechatAccessToken) return } // GetAccessToken 获取accessToken func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) { wxToken, err := models.GetWxTokenById() if err != nil && err.Error() != utils.ErrNoRow() { return } //如果300s就要过期了,那么就去刷新accessToken if wxToken.ExpiresIn < time.Now().Unix()+300 { tmpAccessToken, expires, tmpErr := getTokenFromServer(utils.WX_APPID, utils.WX_APP_SECRET) if tmpErr != nil { err = tmpErr return } var updateCols = []string{"access_token", "expires_in"} wxToken.AccessToken = tmpAccessToken wxToken.ExpiresIn = time.Now().Unix() + expires - 600 //快过期前10分钟就刷新掉 wxToken.Update(updateCols) } accessToken = wxToken.AccessToken return } // getTokenFromServer 服务端获取accessToken func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) { apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret)) if err != nil { return } expires = resAccessToken.ExpiresIn accessToken = resAccessToken.AccessToken return } // GetUserInfo 获取微信用户详情 func GetUserInfo(openid string) (userInfo *user.Info, err error) { wechatClient := GetWxChat() userClient := wechatClient.GetUser() userInfo, err = userClient.GetUserInfo(openid) return } type WxUserInfo struct { OpenId string `json:"openid"` AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` Scope string `json:"scope"` ErrCode int ErrMsg string } //func GetWxUserInfo(code string) (info *WxUserInfo, err error) { // httpUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code` // // httpUrl = fmt.Sprintf(httpUrl, utils.WX_APPID, utils.WX_APP_SECRET, code) // // client := http.Client{} // wxReq, err := http.NewRequest("GET", httpUrl, nil) // if err != nil { // return // } // response, err := client.Do(wxReq) // if err != nil { // return // } // defer response.Body.Close() // body, err := io.ReadAll(response.Body) // if err != nil { // return // } // alarm_msg.SendAlarmMsg(string(body), 1) // if err = json.Unmarshal(body, &info); err != nil { // return // } // return //}