使用.net 操作 微信公眾平臺 —— 第三方登入 —— .net MVC
阿新 • • 發佈:2018-11-09
目錄
3. 使用.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 |
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;
}