first commit
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
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()), "登录成功!")
|
||||
}
|
||||
Reference in New Issue
Block a user