一.登陆微博公众平台,创建网站应用
地址:点击打开链接
1.获取appid和appkey
2.设置测试账号,审核通过之后其他用户方可使用
二、参考微博OAuth2.0,分三步获取用户信息
详细:点击打开链接
- 第一步 根据appid 获取 Authorization Code
详细:
点击打开链接,请求方式:get/post
- 第二步 根据Authorization Code 获取Access Token 和 uid
详细:
点击打开链接,请求方式post
- 第三步 根据uid 调用微博API 获取用户信息
详细:
点击打开链接,请求方式get
注:
1.其他可用接口列表:点击打开链接
2.在调用的时候需要注意请求方法
scope是OAuth2.0新版授权页提供的一个功能,通过scope,平台将开放更多的微博核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新OAuth2.0授权页中有权利选择赋予应用的功能。
三、WebForm代码示例
1.回调地址处理
/// <summary>
/// SinaLogin 的摘要说明
/// </summary>
public class SinaLogin : IHttpHandler,IRequiresSessionState
{
RequestHelper _Request = new RequestHelper();
LogHelper.LogHelper _log = new LogHelper.LogHelper();
//测试使用
private string appid = "1956553634";
private string appkey = "d9d486d84a559e3e3e9df40aa5352a9a";
public void ProcessRequest(HttpContext context)
{
HttpResponse resp = context.Response;
HttpRequest req = context.Request;
HttpServerUtility server = context.Server;
HttpSessionState session = context.Session;
string thisUrl = req.Url.AbsoluteUri;
string code = _Request.GetStringQuery("code");
//第一次访问
if (code == "")
{
#region 第一步 根据appid 获取 Authorization Code
StringBuilder builder = new StringBuilder(500);
builder.Append("https://api.weibo.com/oauth2/authorize?");
builder.AppendFormat("response_type={0}", "code");
builder.AppendFormat("&client_id={0}", appid);
builder.AppendFormat("&redirect_uri={0}", server.UrlDecode(thisUrl));
builder.AppendFormat("&state={0}", "weilanliuxue");//用于自身验证
builder.AppendFormat("&scope={0}", "all");
resp.Redirect(builder.ToString(), false);
return;
#endregion
}
string state = _Request.GetStringQuery("state");
//第二次访问
if (code != "" && state == "weilanliuxue")
{
#region 第二步 根据Authorization Code 获取Access Token 和 uid
StringBuilder builder = new StringBuilder(500);
builder.Append("https://api.weibo.com/oauth2/access_token?");
builder.AppendFormat("grant_type={0}", "authorization_code");
builder.AppendFormat("&client_id={0}", appid);
builder.AppendFormat("&client_secret={0}", appkey);
builder.AppendFormat("&code={0}", code);
builder.AppendFormat("&redirect_uri={0}", server.UrlDecode(thisUrl));
//1.获取并解析 access_token 例如:
string access_token = "";
string uid = "";
try
{
string result = NetHelper.Post(builder.ToString()); //此处微博拒绝get请求
result = RegexHelper.Replace(result, "{|}|\"", "");
string[] temp = result.Split(',');
access_token = temp[0].Split(':')[1];
uid = temp[3].Split(':')[1];
}
catch (Exception ex)
{
_log.WriteLine("解析 access_token 是出错:" + ex.Message);
throw new Exception("解析 access_token 是出错:" + ex.Message);
}
#endregion
_log.WriteLine("uid:"+uid);
_log.WriteLine("access_token:" + access_token);
#region 第三步 根据uid 调用微博API 获取用户信息
//第四步 获取用户信息
builder.Clear();
builder.Append("https://api.weibo.com/2/users/show.json?");
builder.AppendFormat("access_token={0}", access_token);
builder.AppendFormat("&uid={0}", uid);
builder.AppendFormat("&source={0}", appkey);
#endregion
try
{
string userinfo = NetHelper.Get(builder.ToString()); //微博次数拒绝 post请求
_log.WriteLine("webo-userinfo:" + userinfo);
SinaInfo info = userinfo.JsonDeserialezer<SinaInfo>();
if (info == null)
{
throw new Exception("内部错误:反序列化获取SinaInfo对象时失败!");
}
//获取数据成功,进行其他逻辑处理
_log.WriteLine(userinfo);
//保存session
session["access_token"] = access_token;
session["uid"] = uid;
session["sinainfo"] = info;
//返回数据或跳转
resp.Redirect("~/view/SinaInfoShow.aspx", false);
}
catch (Exception ex)
{
string msg = "获取用户信息失败,--------出错原因:" + ex.Message;
_log.WriteLine(msg);
}
}
}
public bool IsReusable
{
get
{
return true;
}
}
}
2.获取的用户信息对象(部分信息)
//微博用户信息对象
public class SinaInfo
{
//用户 uid [Int(64)]
public double id { get; set; }
//用户uid 的字符串
public string idstr { get; set; }
//用户昵称
public string screen_name { get; set; }
//友好显示名称
public string name { get; set; }
//用户的性别:m:男、f:女、n:未知
public string gender { get; set; }
//用户所在省ID
public int province { get; set; }
//用户所在城市ID
public int city { get; set; }
//用户所在地
public string location { get; set; }
//用户个人描述
public string description { get; set; }
//用户博客地址
public string url { get; set; }
//用户头像 中(50*50)
public string profile_image_url { get; set; }
//用户头像 大 (180*180)
public string avatar_large { get; set; }
//用户头像 (原图)
public string avatar_hd { get; set; }
//用户的微博统一地址
public string profile_url { get; set; }
//用户的个性化域名
public string domain { get; set; }
//用户的微号
public string weihao { get; set; }
//用户的粉丝数
public int followers_count { get; set; }
//用户的关注数
public int friends_count { get; set; }
//用户逇微博数
public int statuses_count { get; set; }
//用户的收藏数
public int favourites_count { get; set; }
//用户的注册时间
public string created_at { get; set; }
//用户的备注信息
public string remark { get; set; }
//是否在线 0:不在线、1:在线
public int online_status { get; set; }
}