C#第三方使用微信授权登录

后面代码需要用到的参数、方法、类

    private string WeChatRedirectUrl = "www.test.com";//需要被授权的页面地址
    //对页面进行授权重新返回的新地址,新地址包含code
    private string WeChatOauth2Url = @"https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=STATE#123";
    private string WeChatAccessTokenUrl = @"https://api.weixin.qq.com/sns/oauth2/access_token";//网页授权access_token,获取用户唯一标识openID
    private string WeChatUserInfoUrl = @"https://api.weixin.qq.com/sns/userinfo";//获取用户信息地址
    private string WeChatAppId = "wx123456789abcdefg";//公众号的唯一标识
    private string WeChatAppSecret = "a6d6ccf8182fn2a5a8e1ae1234e638c9";//公众号的appsecret


    /// <summary>
    /// GET请求
    /// </summary>
    /// <param name="Url">The URL.</param>
    /// <param name="postDataStr">The post data string.</param>
    /// <returns>System.String.</returns>
    public static string HttpGet(string Url, string postDataStr = "")
    {
        HttpWebRequest request =
            (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
        request.Method = "GET";
        request.ContentType = "text/html;charset=UTF-8";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream myResponseStream = response.GetResponseStream();
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
        string retString = myStreamReader.ReadToEnd();
        myStreamReader.Close();
        myResponseStream.Close();

        return retString;
    }

    public class JsonHelper
    {
        public JsonHelper()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        /// <summary>
        /// 把对象序列化 JSON 字符串 
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="obj">对象实体</param>
        /// <returns>JSON字符串</returns>
        public static string GetJson<T>(T obj)
        {
            DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream())
            {
                json.WriteObject(ms, obj);
                string szJson = Encoding.UTF8.GetString(ms.ToArray());
                return szJson;
            }
        }

        /// <summary>
        /// 把JSON字符串还原为对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="szJson">JSON字符串</param>
        /// <returns>对象实体</returns>
        public static T ParseFormJson<T>(string szJson)
        {
            T obj = Activator.CreateInstance<T>();
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
            {
                DataContractJsonSerializer dcj = new DataContractJsonSerializer(typeof(T));
                return (T)dcj.ReadObject(ms);
            }
        }
    }

    //授权成功返回的信息
    public class OutWechatSuccessInfo
    {
        /// <summary>
        ///  code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
        /// </summary>
        public string code { get; set; }
        /// <summary>
        /// 接口调用凭证
        /// </summary>
        public string access_token { get; set; }
        /// <summary>
        /// access_token接口调用凭证超时时间,单位(秒)
        /// </summary>
        public int expires_in { get; set; }
        /// <summary>
        /// 用户刷新access_token
        /// </summary>
        public string refresh_token { get; set; }
        /// <summary>
        /// 授权用户唯一标识
        /// </summary>
        public string openid { get; set; }
        /// <summary>
        /// 用户授权的作用域,使用逗号(,)分隔
        /// </summary>
        public string scope { get; set; }
    }

    //拉取的用户信息
    public class OutWeChatUserInfo
    {
        /// <summary>
        ///  用户的唯一标识
        /// </summary>
        public string openid { get; set; }
        /// <summary>
        /// 用户昵称
        /// </summary>
        public string nickname { get; set; }
        /// <summary>
        /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
        /// </summary>
        public int sex { get; set; }
        /// <summary>
        /// 用户个人资料填写的省份
        /// </summary>
        public string province { get; set; }
        /// <summary>
        /// 普通用户个人资料填写的城市
        /// </summary>
        public string city { get; set; }
        /// <summary>
        /// 国家,如中国为CN
        /// </summary>
        public string country { get; set; }
        /// <summary>
        /// 用户头像,最后一个数值代表正方形头像大小
        /// </summary>
        public string headimgurl { get; set; }
        /// <summary>
        /// 用户特权信息
        /// </summary>
        public string privilege { get; set; }
    }

第一步:用户同意授权,获取code

    /// <summary>
    /// 获取授权后的URL
    /// </summary>
    /// <returns></returns>
    public async Task<ReturnJson> GetRedirectUrl()
    {
        try
        {
            string url = string.Format(WeChatOauth2Url, WeChatAppId, WeChatRedirectUrl);
            return ReturnJson.ToResult(ReturnCode.Success, new { redirectURL = url });
        }
        catch (Exception e)
        {
            return ReturnJson.ToResult(ReturnCode.ServiceError, e.Message);
        }
    }

第二步:通过code换取网页授权access_token和用户唯一标识openID

    /// <summary>
    /// 获取用户唯一标识openID
    /// </summary>
    /// <param name="code"></param>
    /// <returns></returns>
    public OutWechatSuccessInfo GetOpenID(string code)
    {
        string sUrlpara = "appid=" + WeChatAppId + "&secret=" + WeChatAppSecret + "&code=" + code + "&grant_type=authorization_code";//请求的参数
        string jsonStr = HttpHelper.HttpGet(WeChatAccessTokenUrl, sUrlpara);

        if (jsonStr.Contains("errcode"))
        {
            return null;
        }

        //放回json解析
        OutWechatSuccessInfo result = new OutWechatSuccessInfo();
        result = JsonHelper.ParseFormJson<OutWechatSuccessInfo>(jsonStr);

        return result;
    }

第三步:拉取用户信息(需scope为 snsapi_userinfo)

/// <summary>
    /// 拉取登录用户信息
    /// </summary>
    /// <param name="accessToken"></param>
    /// <param name="openId"></param>
    /// <returns></returns>
    public OutWeChatUserInfo GetWeChatUserInfo(string accessToken, string openId)
    {
        string sUrlpara = "access_token=" + accessToken + "&openid=" + openId + "?=zh_CN"; ;//请求的参数
        string jsonStr = HttpHelper.HttpGet(WeChatUserInfoUrl, sUrlpara);

        if (jsonStr.Contains("errcode"))
        {
            return null;
        }

        //放回json解析
        OutWeChatUserInfo result = new OutWeChatUserInfo();
        result = JsonHelper.ParseFormJson<OutWeChatUserInfo>(jsonStr);

        return result;
    }

 

C#第三方使用微信授权登录

上一篇:Windows Server 2008 多元密码策略配置


下一篇:android api (83) —— InputMethodSession [输入法]