Files
wechat_ipad_pro/srv/wxrouter/wxautoauth.go
2026-02-17 13:06:23 +08:00

147 lines
5.7 KiB
Go

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()), "登录成功!")
}