/// <summary> 检测登录二维码扫描状态 </summary> /// <param name="uid"></param> private WxLoginScanResult executeLoginScanHttpTask(string uid) { try { string tip = "1"; while (true) { HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetLoginScanParams(uid, tip)); if (ht == null) { return(null); } WxLoginScanResult result = WxRespUtil.ParseLoginScanResp(ht.ExecuteString()); #if Debug Console.WriteLine("wx login scan result =" + (result == null ? "null" : result.Code.ToString())); #endif if (result == null) { } else if (result.Code == WxResultCode.LOGIN_SCAN_SUCCESS)//201 { //已扫描,未登录,这里可以获取头像 tip = "0"; } else if (result.Code == WxResultCode.LOGIN_SCAN_LOGIN)//200 { //点击登录 return(result); } else if (result.Code == WxResultCode.LOGIN_SCAN_TIMEOUT)//408 { //微信端返的连接超时,继续连接 } else if (result.Code == WxResultCode.LOGIN_SCAN_EXPIRED)//400 { //二维码过期 return(result); } ThreadUtil.Sleep(500); if (!syncCheckLoginingState()) { return(null); } } } catch { } return(null); }
/// <summary> 线程任务 </summary> private void run() { //初始化cookie容器 mCookieContainer = new CookieContainer(); //获取微信登录随机设备Id string deviceId = WxUtil.GetRandomDeviceId(); #if Debug Console.WriteLine("WxTask login device id = " + deviceId); #endif //获取登录uid------------------------------------------ WxLoginUidResult loginUidResult = executeLoginUidHttpTask(); #if Debug Console.WriteLine("WxTask login uid = " + (loginUidResult == null ? "null" : loginUidResult.Uid)); #endif if (!syncCheckLoginingState()) { return; } //检测uid if (!WxResultUtil.CheckLoginUidResult(loginUidResult)) { callbackLoginFailed(WxLoginCode.UID_ERROR); return; } //获取微信登录二维码----------------------------------------------- byte[] qrCodeBytes = executeLoginQrCodeHttpTask(loginUidResult.Uid); #if Debug Console.WriteLine("WxTask login qrcode = " + (qrCodeBytes == null ? "null" : "has qr code")); #endif if (!syncCheckLoginingState()) { return; } if (qrCodeBytes == null) { callbackLoginFailed(WxLoginCode.QRCODE_ERROR); return; } //二维码回调 OnWxTaskLoginQrCodeHandler?.Invoke(qrCodeBytes); //检测扫描登录----------------------------------------------------------------- WxLoginScanResult loginScanResult = executeLoginScanHttpTask(loginUidResult.Uid); #if Debug Console.WriteLine("WxTask login scan = " + (loginScanResult == null ? "null" : loginScanResult.ToString())); #endif if (!syncCheckLoginingState()) { return; } if (!WxResultUtil.CheckLoginScanResult(loginScanResult)) { if (WxResultUtil.CheckLoginScanExpired(loginScanResult)) { callbackLoginFailed(WxLoginCode.SCAN_EXPIRED); } else { callbackLoginFailed(WxLoginCode.SCAN_ERROR); } return; } //开始登录操作回调----------------------------------- OnWxTaskLoginPreHandler?.Invoke(); //登录步骤完成,已获取各种唯一标识符,如果该步完成,手机端显示已登录-------------------------- WxLoginIdsResult loginIdsResult = executeLoginRedirectUriHttpTask(loginScanResult.RedirectUri); #if Debug Console.WriteLine("WxTask login ids = " + (loginIdsResult == null ? "null" : loginIdsResult.ToString())); #endif //设置全局host if (WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { setHost(loginIdsResult.RouteHost); } if (!syncCheckLoginingState()) { if (WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); } return; } if (!WxResultUtil.CheckLoginIdsResult(loginIdsResult)) { if (WxResultUtil.CheckLoginIdsAccountClosure(loginIdsResult))/*loginIdsResult != null && loginIdsResult.IsAccountException()*/ { callbackLoginFailed(WxLoginCode.IDS_ACCOUNT_CLOSURE); } else { callbackLoginFailed(WxLoginCode.IDS_ERROR); } return; } //访问初始化接口,这里面才有昵称-------------------------------------------------------- WxLoginInitResult loginInitResult = executeLoginInitHttpTask(GetHost(), loginIdsResult, deviceId); #if Debug Console.WriteLine("WxTask login init = " + (loginInitResult == null ? "null" : loginInitResult.ToString())); #endif if (!syncCheckLoginingState()) { executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); return; } if (!WxResultUtil.CheckResultSuccess(loginInitResult)) { callbackLoginFailed(WxLoginCode.INIT_ERROR); executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid); return; } //创建登录账号对象-------------------------------------------------------- WxAccount wxAccount = WxUtil.CreateWxAccount(loginIdsResult, loginInitResult, deviceId); //标记登录状态 syncSetLoginState(STATE_LOGINED); //发送状态通知消息,一定要发 if (syncCheckLoginInState()) { executeStatusNotifyHttpTask(GetHost(), wxAccount); } //微信登录成功回调 OnWxTaskLoginSuccessHandler?.Invoke(wxAccount); //微信初始化回调 OnWxTaskLoginInitHandler?.Invoke(wxAccount, loginInitResult); //获取所有联系人,一定要先获取 if (syncCheckLoginInState()) { WxContactAllResult contactAllResult = executeGetContactAllHttpTask(GetHost(), wxAccount); if (WxResultUtil.CheckResultSuccess(contactAllResult) && syncCheckLoginInState()) { OnWxTaskLoginGetContactAllHandler?.Invoke(wxAccount, contactAllResult.MemberList); } } //开始循环同步消息 int syncCode = WxResultCode.ACCOUNT_OFFLINE; if (syncCheckLoginInState()) { syncCode = executeSyncMsgLoop(GetHost(), wxAccount, loginInitResult.SyncKey); } //先给登出回调,再做登出请求操作 WxLogoutCode code = syncGetLogoutCode(syncCode); OnWxTaskLogoutHandler?.Invoke(wxAccount, code); string result = executeLogout(GetHost(), wxAccount); #if Debug Console.WriteLine("WxTask logout WxLogoutCode = " + code + ", nickName=" + wxAccount.NickName); #endif }