Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /* 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);
        }