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); }
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); }
/// <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); }
/// <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 }