1. 程式人生 > >使用.net 操作 微信公眾平臺 —— 第三方登入 —— .net MVC

使用.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;
}