使用.net 操作 微信公众平台 —— 第三方登录 —— .net MVC

目录

  1. 使用.net 操作 微信公众平台 —— 接入

  2. 使用.net 操作 微信公众平台 —— 生成微信菜单

  3. 使用.net 操作 微信公众平台 —— 接收并回复用户消息

  4. 使用.net 操作 微信公众平台 —— 第三方登录

    4.1 使用.net 操作 微信公众平台 —— 第三方登录 —— .net MVC


 工具


第三方登录

获取登录者微信信息需要进行以下步骤

  • 用户同意,获取code
  • 使用code换取网页授权access_token和用户openid
  • (根据需求) 使用 access_token 和 openid 获取用户的具体信息

1. 生成获取code的链接

var redirect_uri = HttpUtility.UrlEncode("http://a.com/GetUserWxMsg", Encoding.UTF8);
var getCode = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", appId, redirect_uri, "snsapi_userinfo");
Response.Redirect(getCode);
参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (未关注,不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

2. 如果 scope = snsapi_base 则直接跳转页面,否则弹出授权页面,用户点击后跳转到授权页面

3. 使用code获取access_token和openid

跳转后的链接为 http://a.com/GetUserWxMsg?code=code&state=STATE

/// <summary>
/// 获取access_token和openid
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static Response_AccessToken GetAccessToken(string code)
{
    var url = "https://api.weixin.qq.com/sns/oauth2/access_token";

    Dictionary<string, string> dict = new Dictionary<string, string>();
    dict.Add("appid", appId);
    dict.Add("secret", secret);
    dict.Add("code", code);
    dict.Add("grant_type", "authorization_code");

    return WebService.HttpGet<Response_AccessToken>(dict, url);
}

/// <summary>
/// 微信返回信息提示
/// </summary>
public class Response_Error
{
    /// <summary>
    /// 错误代码
    /// </summary>
    public int errcode { get; set; }

    /// <summary>
    /// 错误信息
    /// </summary>
    public string errmsg { get; set; }
}

/// <summary>
/// 
/// </summary>
public class Response_AccessToken : Response_Error
{
    /// <summary>
    /// 网页授权接口调用凭证
    /// </summary>
    public string access_token { get; set; }

    /// <summary>
    /// access_token接口调用凭证超时时间,单位(秒)
    /// </summary>
    public string expires_in { get; set; }

    /// <summary>
    /// 用户刷新access_token
    /// </summary>
    public string refresh_token { get; set; }

    /// <summary>
    /// 用户唯一标识,在未观众公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的openid
    /// </summary>
    public string openid { get; set; }

    /// <summary>
    /// 用户授权的作用域,使用逗号分隔
    /// </summary>
    public string scope { get; set; }
}

/// <summary>
/// 
/// </summary>
/// <typeparam name="T">视图模型</typeparam>
/// <param name="dic">参数</param>
/// <param name="url">地址</param>
/// <returns></returns>
public static dynamic HttpGet<T>(Dictionary<string, string> dic, string url)
{
    var param = "";
    foreach (var item in dic)
    {
        if (!string.IsNullOrEmpty(param))
            param += "&";
        param += item.Key + "=" + item.Value;
    }
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + (param == "" ? "" : "?") + param);
    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.UTF8);
    string retString = myStreamReader.ReadToEnd();

    myStreamReader.Close();
    myResponseStream.Close();

    var res = JsonConvert.DeserializeObject<T>(retString);
    return res;
}

* code只能使用一次

如果只需要获取用户的openId,则到此就可以了,下面是获取用户的具体信息(头像,昵称,省,市,区等)

4. 获取用户的具体信息

/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
public static Response_GetUserMsg GetUserMsg(string access_token, string openid)
{
    var url = "https://api.weixin.qq.com/sns/userinfo";

    Dictionary<string, string> dict = new Dictionary<string, string>();
    dict.Add("access_token", access_token);
    dict.Add("openid", openid);
    dict.Add("lang", "zh_CN");

    return WebService.HttpGet<Response_GetUserMsg>(dict, url);
}

/// <summary>
/// 微信返回信息提示
/// </summary>
public class Response_Error
{
    /// <summary>
    /// 错误代码
    /// </summary>
    public int errcode { get; set; }

    /// <summary>
    /// 错误信息
    /// </summary>
    public string errmsg { get; set; }
}

/// <summary>
/// 
/// </summary>
public class Response_GetUserMsg : Response_Error
{
    /// <summary>
    /// 用户的唯一标识
    /// </summary>
    public string openid { get; set; }

    /// <summary>
    /// 用户昵称
    /// </summary>
    public string nickname { get; set; }

    /// <summary>
    /// 用户性别,1为男,2为女
    /// </summary>
    public int sex { get; set; }

    /// <summary>
    /// 用户个人资料填写的省份
    /// </summary>
    public string language { get; set; }

    /// <summary>
    /// 用户个人资料填写的城市
    /// </summary>
    public string city { get; set; }

    /// <summary>
    /// 用户个人资料填写的省份
    /// </summary>
    public string province { get; set; }

    /// <summary>
    /// 国家,如中国为CN
    /// </summary>
    public string country { get; set; }

    /// <summary>
    /// 用户头像,用户没有头像时该项为空
    /// </summary>
    public string headimgurl { get; set; }

    /// <summary>
    /// 用户特权信息,json数组
    /// </summary>
    public object[] privilege { get; set; }

    /// <summary>
    /// unionid Id,公众号关联的微信开发者标识
    /// </summary>
    public string unionid { get; set; }
}

/// <summary>
/// 
/// </summary>
/// <typeparam name="T">视图模型</typeparam>
/// <param name="dic">参数</param>
/// <param name="url">地址</param>
/// <returns></returns>
public static dynamic HttpGet<T>(Dictionary<string, string> dic, string url)
{
    var param = "";
    foreach (var item in dic)
    {
        if (!string.IsNullOrEmpty(param))
            param += "&";
        param += item.Key + "=" + item.Value;
    }
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + (param == "" ? "" : "?") + param);
    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.UTF8);
    string retString = myStreamReader.ReadToEnd();

    myStreamReader.Close();
    myResponseStream.Close();

    var res = JsonConvert.DeserializeObject<T>(retString);
    return res;
}

猜你喜欢

转载自blog.csdn.net/qq_31267183/article/details/83819858