Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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
        }