147 lines
5.7 KiB
Go
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()), "登录成功!")
|
|
}
|