闽公网安备 35020302035485号

2.以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。



public class WeChatLogin : Controller
{
/// <summary>
/// 堆代码 duidaima.com
/// 获取微信网页授权access_token
/// </summary>
/// <param name="state">自定义参数</param>
/// <param name="code">通过用户授权后得到的code</param>
/// <returns></returns>
public async Task<Response> GetWeChatAccessToken(string state, string code)
{
string appId = "YourAppId";
string appSecret = "YourAppSecret";
string requestUrl = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={appSecret}&code={code}&grant_type=authorization_code";
using (var httpClient = new HttpClient())
{
var httpRequest = new HttpRequestMessage(HttpMethod.Get, requestUrl);
using (var response = await httpClient.SendAsync(httpRequest))
{
if (response.IsSuccessStatusCode)
{
var responseString = await response.Content.ReadAsStringAsync();
var responseData = JsonConvert.DeserializeObject<WeChatTokenResponse>(responseString);
return new Response
{
Code = 1,
Message = responseData.AccessToken
};
}
else
{
var errorResponseString = await response.Content.ReadAsStringAsync();
var errorData = JsonConvert.DeserializeObject<ErrorResponse>(errorResponseString);
return new Response
{
Code = 0,
Message = $"Failed to get access token: {errorData.ErrMsg}"
};
}
}
}
}
}
public class WeChatTokenResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
[JsonProperty("expires_in")]
public int ExpiresIn { get; set; }
[JsonProperty("refresh_token")]
public string RefreshToken { get; set; }
[JsonProperty("openid")]
public string OpenId { get; set; }
[JsonProperty("scope")]
public string Scope { get; set; }
[JsonProperty("is_snapshotuser")]
public int IsSnapshotUser { get; set; }
[JsonProperty("unionid")]
public string UnionId { get; set; }
}
public class ErrorResponse
{
[JsonProperty("errcode")]
public int ErrCode { get; set; }
[JsonProperty("errmsg")]
public string ErrMsg { get; set; }
}
第三步、获取用户信息(需scope为 snsapi_userinfo)

public class WeChatLogin : Controller
{
/// <summary>
/// 用户信息获取
/// </summary>
/// <param name="accessToken"> 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同</param>
/// <param name="openId">用户的唯一标识</param>
/// <returns></returns>
public async Task<Response> GetWeChatUserInfo(string accessToken, string openId)
{
string requestUrl = $"https://api.weixin.qq.com/sns/userinfo?access_token={accessToken}&openid={openId}&lang=zh_CN";
using (var httpClient = new HttpClient())
{
var request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
var response = await httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var responseString = await response.Content.ReadAsStringAsync();
var responseData = JsonConvert.DeserializeObject<WeChatUserInfoResponse>(responseString);
return new Response
{
Code = 1,
Message = $"Nickname: {responseData.Nickname}, Province: {responseData.Province}, City: {responseData.City}"
};
}
else
{
var errorResponseString = await response.Content.ReadAsStringAsync();
var errorData = JsonConvert.DeserializeObject<ErrorResponse>(errorResponseString);
return new Response
{
Code = 0,
Message = $"Failed to get user info: {errorData.ErrMsg}"
};
}
}
}
public class WeChatUserInfoResponse
{
[JsonProperty("openid")]
public string OpenId { get; set; }
[JsonProperty("nickname")]
public string Nickname { get; set; }
[JsonProperty("sex")]
public int Sex { get; set; }
[JsonProperty("province")]
public string Province { get; set; }
[JsonProperty("city")]
public string City { get; set; }
[JsonProperty("country")]
public string Country { get; set; }
[JsonProperty("headimgurl")]
public string HeadImgUrl { get; set; }
[JsonProperty("privilege")]
public List<string> Privilege { get; set; }
[JsonProperty("unionid")]
public string UnionId { get; set; }
}
public class ErrorResponse
{
[JsonProperty("errcode")]
public int ErrCode { get; set; }
[JsonProperty("errmsg")]
public string ErrMsg { get; set; }
}
}