目录
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 (弹出授权页面,可通过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;
}