示例#1
0
        private WxLoginInitResult executeLoginInitHttpTask(string host, WxLoginIdsResult loginIdsResult, string deviceId)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetLoginInitParams(host, loginIdsResult, deviceId));
                if (ht != null)
                {
                    return(ht.ExecuteJson <WxLoginInitResult>());
                }
            }
            catch { }

            return(null);
        }
示例#2
0
        public WxLoginIdsResult executeLoginRedirectUriHttpTask(string redirectUri)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetLoginRedirectUriParams(redirectUri));
                if (ht != null)
                {
                    WxLoginIdsResult result = WxRespUtil.ParseLoginRedirectUriResp(ht.ExecuteString());
                    result.RouteHost  = WxRespUtil.ParseHost(redirectUri);
                    result.DataTicket = ht.GetCookie(string.Format("http://{0}", result.RouteHost), "webwx_data_ticket");
                    return(result);
                }
            }
            catch { }

            return(null);
        }
示例#3
0
        /// <summary>
        /// 获取微信登录初始化接口
        /// </summary>
        /// <param name="result"></param>
        /// <returns></returns>
        /// demo:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit
        /// ?r=665841145
        /// &lang=zh_CN
        /// &pass_ticket=zXbwZhRifdRRNcPjsjxyemYskxzSRQOxZF6T3HJuTpsdgPENMSMXylIlmsnrEZ5s
        public static HttpTaskParams GetLoginInitParams(string host, WxLoginIdsResult result, string deviceId)
        {
            //r时间戳取反
            string url = string.Format("{0}?r={1}&lang={2}&pass_ticket={3}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_INIT),
                                       (TimeUtil.CurrentTimeMillis() / 1000),
                                       "zh_CN",
                                       encoding(result.PassTicket));

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType             = "application/json;charset=utf-8";
            htp.CustomStringContentBody = JsonConvert.SerializeObject(WxReqUtil.GetBaseReq(result, deviceId));
#if Debug
            Console.WriteLine("init content body = " + htp.CustomStringContentBody);
#endif
            return(htp);
        }
示例#4
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
        }