package wxrouter import ( "errors" "time" "xiawan/wx/clientsdk" "xiawan/wx/clientsdk/baseinfo" "xiawan/wx/db" "xiawan/wx/protobuf/wechat" "xiawan/wx/srv/wxcore" "xiawan/wx/srv/wxface" ) // WXAutoAuthRouter token登陆响应路由 type WXAutoAuthRouter struct { wxcore.WXBaseRouter } // Handle 处理conn业务的方法 func (glqr *WXAutoAuthRouter) Handle(wxResp wxface.IWXResponse) error { defer wxcore.TryE("(glqr *WXAutoAuthRouter) Handle(wxResp wxface.IWXResponse)") currentWXConn := wxResp.GetWXConncet() currentWXAccount := currentWXConn.GetWXAccount() currentUserInfo := currentWXAccount.GetUserInfo() //currentInvoker := currentWXConn.GetWXReqInvoker() // 解析 token 登陆响应 var manualResponse wechat.ManualAuthResponse err := clientsdk.ParseResponseData(currentUserInfo, wxResp.GetPackHeader(), &manualResponse) if err != nil { // 请求出问题了,判断是否掉线,并重连 time.Sleep(1 * time.Second) go currentWXConn.CheckOnLineStatusLogin() return err } retCode := manualResponse.GetBaseResponse().GetRet() currentUserInfo.UpdateLastAuthTime() // 更新上次自动登录的二次登录时间 // Mysql 提交登录日志 db.SetLoginLog("AutoAuth", currentWXAccount, manualResponse.GetBaseResponse().GetErrMsg().GetStr(), retCode) switch retCode { case baseinfo.MMOk: //success WXAutoAuthSuccess(&manualResponse, currentWXConn) //redis 发布消息 发布登录状态 //db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState()) currentWXAccount.SetLoginState(baseinfo.MMLoginStateOnLine) return nil case baseinfo.MMErrDropped: //出现用户主动退出获取被T下线在线状态不存在需要调用Push // -2023 登录出现错误可重新登录 /*if strings.Contains(manualResponse.GetBaseResponse().GetErrMsg().GetStr(), "登录出现错误") { currentWXConn.SendAutoAuthWaitingMinutes(5) return nil }*/ //fmt.Println(hex.EncodeToString(currentUserInfo.AutoAuthKey)) // 登录状态改为登录后退出 currentWXAccount.SetLoginState(baseinfo.MMLoginStateLogout) // 保存登录状态到数据库 db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentWXAccount.GetLoginState()), "你已退出微信") // 关闭重新启动,再次发送登陆请求 currentWXConn.Stop() //redis 发布消息 发布登录状态 //db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState()) return errors.New("WXAutoAuthRouter retCode = - 2023,err: " + manualResponse.GetBaseResponse().GetErrMsg().GetStr()) case -100: // 关闭重新启动,再次发送登陆请求 currentWXConn.Stop() // 登录状态改为未登录 currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin) errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr() // 保存登录状态到数据库 db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(currentUserInfo.GetLoginState()), errMsg) //redis 发布消息 发布登录状态 //db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState()) return errors.New("WXAutoAuthRouter retCode = - 100,err: " + manualResponse.GetBaseResponse().GetErrMsg().GetStr()) case -6: // 登录状态改为未登录 currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin) // 关闭重新启动,再次发送登陆请求 currentWXConn.Stop() // 保存登录状态到数据库 errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr() db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentUserInfo.GetLoginState()), errMsg) //redis 发布消息 发布登录状态 //db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState()) return errors.New("WXAutoAuthRouter err: " + errMsg) default: currentWXAccount.SetLoginState(baseinfo.MMLoginStateNoLogin) // 关闭重新启动,再次发送登陆请求 currentWXConn.Stop() // 保存登录状态到数据库 errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr() db.UpdateLoginStatus(currentUserInfo.WxId, int32(currentUserInfo.GetLoginState()), errMsg) //redis 发布消息 发布登录状态 //db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState()) return errors.New("WXAutoAuthRouter err: " + errMsg) } } func WXAutoAuthSuccess(manualResponse *wechat.ManualAuthResponse, connect wxface.IWXConnect) { account := connect.GetWXAccount() userInfo := account.GetUserInfo() reqInvoker := connect.GetWXReqInvoker() // 获取aesKey userInfo.ConsultSessionKey(manualResponse.AuthParam.EcdhKey.Key.GetBuffer(), manualResponse.AuthParam.SessionKey.Key) // SetAutoKey userInfo.SetAutoKey(manualResponse.AuthParam.AutoAuthKey.Buffer) // SetNetworkSect userInfo.SetNetworkSect(manualResponse.DnsInfo) // 登录成功可与服务器重新建立长链接 isConnected := connect.IsConnected() if !isConnected { connect.Start() } // 是否需要初始化cdn信息 if userInfo.CheckCdn() { // 获取CDNDns信息 _ = reqInvoker.SendGetCDNDnsRequest() } // 获取账号的wxProfile _ = reqInvoker.SendGetProfileRequest() // 登录状态改为在线 account.SetLoginState(baseinfo.MMLoginStateOnLine) // 发送心跳 GetHeartBeatTime := connect.GetHeartBeatTime() nowTime := time.Now().Unix() HeartBeatWaiting := 175 if GetHeartBeatTime == 0 { HeartBeatWaiting = 1 } else if nowTime-GetHeartBeatTime >= 60 { HeartBeatWaiting = 1 } else { HeartBeatWaiting = 175 - int(nowTime-GetHeartBeatTime) } connect.SendHeartBeatWaitingSeconds(uint32(HeartBeatWaiting)) // 等待发送二次登录30分钟 connect.SendAutoAuthWaitingMinutes(60) // 保存UserInfo db.UpdateUserInfo(userInfo) // 更新状态到数据库 db.UpdateLoginStatus(userInfo.GetUserName(), int32(account.GetLoginState()), "登录成功!") }