/// <summary> /// 登陆函数 /// </summary> /// <param name="name">用户名</param> /// <param name="pass">密码</param> /// <param name="imgCode">图片验证码,如果没有可以为空串string.Empty</param> /// <returns>将得到的登陆结果全部放到WxPublicUser</returns> public static WxPublicUser ExecLogin(string name, string pass, string imgCode) { WxPublicUser pubUser = new WxPublicUser();// return result if (name == string.Empty || pass == string.Empty) { pubUser.LoginRetInfo = new WxLoginRetInfo(); pubUser.LoginRetInfo.ErrCode = 233;//TODO:自己定义的ErrCode,先hard code了 =。=||| return(pubUser); } string password = GetMd5Str32(pass).ToUpper(); string padata = "username="******"&pwd=" + password + "&imgcode=" + imgCode + "&f=json"; string url = "http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN ";//请求登录的URL try { CookieContainer cc = new CookieContainer(); //接收缓存 byte[] byteArray = Encoding.UTF8.GetBytes(padata); // 转化 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); //新建一个WebRequest对象用来请求或者响应url webRequest.CookieContainer = cc; //保存cookie webRequest.Method = "POST"; //请求方式是POST webRequest.ContentType = "application/x-www-form-urlencoded"; //请求的内容格式为application/x-www-form-urlencoded webRequest.ContentLength = byteArray.Length; webRequest.Referer = "https://mp.weixin.qq.com/"; Stream newStream = webRequest.GetRequestStream(); //返回用于将数据写入 Internet 资源的 Stream。 newStream.Write(byteArray, 0, byteArray.Length); //写入参数 newStream.Close(); HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default); WxLoginRetInfo retinfo = Newtonsoft.Json.JsonConvert.DeserializeObject <WxLoginRetInfo>(sr.ReadToEnd()); pubUser.LoginRetInfo = retinfo; if (retinfo.ErrMsg.Length > 0 && retinfo.ErrMsg.Contains("ok")) { pubUser.Token = retinfo.ErrMsg.Split(new char[] { '&' })[2].Split(new char[] { '=' })[1].ToString();//取得令牌; pubUser.LoginCookie = cc; //通过访问首页,得到相关的WxPublicUser信息 //https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1835487172 HttpWebRequest homePage = (HttpWebRequest)WebRequest.Create("https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=" + pubUser.Token); homePage.CookieContainer = cc; homePage.Method = "GET"; //https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&action=index&token=1835487172&lang=zh_CN homePage.Referer = "https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&action=index&token=" + pubUser.Token + "&lang=zh_CN"; HttpWebResponse homeResponse = (HttpWebResponse)homePage.GetResponse(); StreamReader srHome = new StreamReader(homeResponse.GetResponseStream(), Encoding.Default); string pageSource = srHome.ReadToEnd(); pubUser.Ticket = RegexPageSource(pageSource, "ticket:\"\\w*\""); pubUser.Uin = RegexPageSource(pageSource, "uin:\"\\w*\""); pubUser.User_name = RegexPageSource(pageSource, "user_name:\"\\w*\""); pubUser.Time = RegexPageSource(pageSource, "time:\"\\w*\""); pubUser.Lang = "zh_CN";//TODO } //TODO:也是hard code了,其实这段可有可无,方便检查而已 switch (pubUser.LoginRetInfo.ErrCode) { case -6: pubUser.LoginRetInfo.ErrMsg = "请输入图中的验证码"; break; case -2: pubUser.LoginRetInfo.ErrMsg = "帐号或密码错误"; break; } } catch (Exception ex) { throw new Exception(ex.StackTrace); } return(pubUser); }
/* 0,65201,65202 成功 * -2,-3,-4 密码或账号错误 * -6,-32 输入验证码 * -5,-200 账号被注销 **/ /// <summary> /// 分析登陆时的返回码的含义,主要是根据微信公众平台的javascript来设定的 /// </summary> /// <param name="retInfo">返回码</param> /// <returns>其含义</returns> public static string ParseLoginRetInfo(WxLoginRetInfo retInfo) { if (retInfo == null) { return("LoginRetInfo为空指针"); } string errMsg = null; switch (retInfo.ErrCode) { case 233: errMsg = "用户名或密码不能为空!"; break; case 65201: case 65202: case 0: errMsg = "登陆成功"; break; case -1: errMsg = "微信公众平台系统出现错误,请稍候再试。"; break; case -2: errMsg = "帐号或密码错误。"; break; case -3: errMsg = "您输入的帐号或者密码不正确,请重新输入。"; break; case -4: errMsg = "不存在该帐户。"; break; case -5: errMsg = "您目前处于访问受限状态。"; break; case -6: errMsg = "请输入图中的验证码"; break; case -32: errMsg = "您输入的验证码不正确,请重新输入"; break; case -7: errMsg = "此帐号已绑定私人微信号,不可用于公众平台登录。"; break; case -8: errMsg = "邮箱已存在。"; break; case -200: errMsg = "因频繁提交虚假资料,该帐号被拒绝登录。"; break; case -94: errMsg = "请使用邮箱登录。"; break; case 10: errMsg = "该公众会议号已经过期,无法再登录使用。"; break; case -100: errMsg = "海外帐号请在公众平台海外版登录,<a href=\"http://admin.wechat.com/\">点击登录</a>"; break; default: errMsg = "未知错误,请稍后再试"; break; } return(errMsg); }