Files
wechat_ipad_pro/srv/wxrouter/wxmanualauth.go
T

149 lines
5.6 KiB
Go
Raw Normal View History

2026-02-17 13:06:23 +08:00
package wxrouter
import (
"errors"
"fmt"
"time"
"xiawan/wx/clientsdk"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/db"
"xiawan/wx/protobuf/wechat"
"xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
)
// WXManualAuthRouter 扫码登陆响应路由
type WXManualAuthRouter struct {
wxcore.WXBaseRouter
}
// Handle 处理conn业务的方法
func (glqr *WXManualAuthRouter) Handle(wxResp wxface.IWXResponse) error {
defer wxcore.TryE("WXManualAuthRouter Handle")
currentWXConn := wxResp.GetWXConncet()
currentWXAccount := currentWXConn.GetWXAccount()
currentCache := currentWXConn.GetWXCache()
currentInvoker := currentWXConn.GetWXReqInvoker()
currentUserInfo := currentWXAccount.GetUserInfo()
currentPackHeader := wxResp.GetPackHeader()
currentWXSyncMgr := currentWXConn.GetWXSyncMgr()
//currentWXFileHelperMgr := currentWXConn.GetWXFileHelperMgr()
// 解析扫码登陆响应
var manualResponse wechat.ManualAuthResponse
err := clientsdk.ParseResponseData(currentUserInfo, currentPackHeader, &manualResponse)
if err != nil {
// 请求出问题了,判断是否掉线,并重连
time.Sleep(1 * time.Second)
go currentWXConn.CheckOnLineStatusLogin()
return err
}
retCode := manualResponse.GetBaseResponse().GetRet()
// 重定向
switch retCode {
case baseinfo.MMErrIdcRedirect:
currentUserInfo.ShortHost = manualResponse.GetDnsInfo().GetNewHostList().GetList()[1].GetSubstitute()
currentUserInfo.LongHost = manualResponse.GetDnsInfo().GetNewHostList().GetList()[0].GetSubstitute()
//提交登录日志
db.SetLoginLog("ManualAuth", currentWXAccount, fmt.Sprintf("重定向登录 ShortHost :%s,LongHost:%s", currentUserInfo.ShortHost, currentUserInfo.LongHost), retCode)
// 关闭重新启动,再次发送登陆请求
currentWXConn.Stop()
time.Sleep(2 * time.Second)
_ = currentWXConn.Start()
qrcodeInfo := currentCache.GetQrcodeInfo()
if qrcodeInfo.QrCodePassword == "" {
return currentInvoker.SendManualAuthByDeviceIdRequest()
} else {
return currentInvoker.SendManualAuthRequest(qrcodeInfo.QrCodePassword, qrcodeInfo.QrCodeWxId)
}
case baseinfo.MMOk:
//取基本信息
accountInfo := manualResponse.GetAccountInfo()
currentUserInfo.SetWxId(accountInfo.GetWxid())
currentUserInfo.NickName = accountInfo.GetNickName()
// 协商密钥
currentUserInfo.ConsultSessionKey(manualResponse.GetAuthParam().GetEcdhKey().GetKey().GetBuffer(), manualResponse.AuthParam.SessionKey.Key)
// AutoAuthKey
currentUserInfo.SetAutoKey(manualResponse.AuthParam.AutoAuthKey.Buffer)
// 随机一个字符红包AesKey
currentUserInfo.GenHBKey()
// 如果数据库有存储这个微信号的信息
if len(currentUserInfo.FavSyncKey) <= 0 {
// 刷新收藏同步Key
oldUserInfo := db.GetUserInfoByWXID(currentUserInfo.WxId)
if oldUserInfo != nil {
currentUserInfo.FavSyncKey = oldUserInfo.FavSyncKey
}
}
// 开始发送心跳包
currentWXConn.SendHeartBeatWaitingSeconds(10)
// 设置登陆状态,发送提示
currentWXAccount.SetLoginState(baseinfo.MMLoginStateOnLine)
go func() {
// 如果开了切号, 不管登录什么, 数据库里面都是iPad的设备信息
db.UpdateLoginStatus(currentUserInfo.GetUserName(), int32(currentWXAccount.GetLoginState()), "登录成功!")
// 获取账号的wxProfile
currentInvoker.SendGetProfileRequest()
// 获取联系人标签列表
currentInvoker.SendGetContactLabelListRequest(false)
// 获取CDNDns信息
currentInvoker.SendGetCDNDnsRequest()
// 开始发送二次登录包
currentWXConn.SendAutoAuthWaitingMinutes(60)
// 初始化通讯录
// contactSeq := currentCache.GetContactSeq()
// currentInvoker.SendInitContactRequest(contactSeq)
currentCache.SetInitContactFinished(true)
// 同步消息
currentWXSyncMgr.SendNewSyncRequest()
// 同步收藏
// currentWXSyncMgr.SendFavSyncRequest()
// 打印当前链接状态
currentWXConn.GetWXServer().GetWXConnectMgr().ShowConnectInfo()
//currentWXFileHelperMgr.AddNewTipMsg("上线成功!")
//currentWXFileHelperMgr.AddNewTipMsg("系统正在初始化...")
//redis 发布消息 发布登录状态
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
//Mysql 提交登录日志
currentUserInfo.UpdateLastLoginTime() // 更新上次手动登录时间
// 手动登录成功: 扫码登录、62登录、16登录等等
db.SetLoginLog("ManualAuth", currentWXAccount, "登录成功!", retCode)
fmt.Println("currentUserInfo扫码登录响应路由", currentUserInfo.DeviceInfo)
db.SaveUserInfo(currentUserInfo)
/*time.Sleep(time.Second * 10)
currentWXConn.Stop()*/
}()
default:
// 登陆失败
errMsg := manualResponse.GetBaseResponse().GetErrMsg().GetStr()
baseutils.PrintLog(errMsg)
// 将登录失败的错误信息保存到状态缓存中,这样前端就能获取到验证码URL等错误信息
db.AddCheckStatusCache(currentUserInfo.UUID, &baseinfo.CheckLoginQrCodeResult{
LoginQRCodeNotify: nil,
Ret: retCode,
Msg: "登录失败:" + errMsg,
})
//Mysql 提交登录日志
//db.SetLoginLog("ManualAuth", currentWXAccount, errMsg, retCode)
//Mysql 保存用户信息
//db.SaveUserInfo(currentUserInfo)
//Mysql 保存登录状态
//db.UpdateLoginStatus(currentUserInfo.GetUserName(), retCode, errMsg)
currentWXConn.Stop()
//redis 发布消息 发布登录状态
//db.PublishLoginState(currentWXAccount.GetUserInfo().UUID, currentWXAccount.GetLoginState())
fmt.Println("登录失败:" + errMsg)
return errors.New("login failed" + errMsg)
}
return nil
}