开放平台那些事

      开放平台的东西,目前很多人在搞,也不多说,本人之前做过,这里就新浪开放平台做个基本的总结,让那些刚弄的能快速点进入开发,如有不正确的还请诸位指出,免得误导人。

      目前基本上要求使用的是author2.0进行开发,开发指南在这里 http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5,api文档 http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2,错误码信息 http://open.weibo.com/wiki/Help/error

      本人之前做的是一个网站接入,这里说的是网站接入,其他的情况或许有所不同,具体的还得开发者自己看文档。

      开放平台具体开发有以下几步。

      1、申请appkey、填写回调地址等信息(由于有段时间没弄了,具体的还得自己看文档)

      2、引导用户至授权页面

        /// <summary>
        /// 引导用户至授权页面,请求参数见 http://open.weibo.com/wiki/Oauth2/authorize
        /// </summary>
        public const string AUTHORIZE_URL = "https://api.weibo.com/oauth2/authorize";
        public void RedirectToSinaLogin ( HttpContext context )
        {
            string requestUrl = String.Format(AUTHORIZE_URL + "?client_id={0}&redirect_uri={1}&response_type=code", AppKey, RedirectUri);
            context.Response.Redirect(requestUrl);
        }

      3、用户授权后,会进入回调页面,同时返回一个code值

      4、有了这个code值,以及第一步中获得的AppKey、AppSecret和回调地址,我们就可以用这些获取access_token和uid了

        /// <summary>
        /// 授权后获取access_token,请求参数见 http://open.weibo.com/wiki/OAuth2/access_token
        /// </summary>
        public const string ACCESSTOKEN_URL = "https://api.weibo.com/oauth2/access_token";
        public void GetAccessToken ( )
        {
            string requestUrl = String.Format(ACCESSTOKEN_URL + "?client_id={0}&client_secret={1}&grant_type=authorization_code&redirect_uri={2}&code={3}", AppKey, AppSecret, RedirectUri, Code);
            string response = RequestUrl(requestUrl,"POST");
            var dic = response.GetValues( );
            this.AccessToken = (string)dic["access_token"];
            this.Uid = (string)dic["uid"];
            this.ExpiresIn = dic["expires_in"].ToString();
        }

         注意上文中的两个函数,一个是发送http请求,一个是扩展函数,用来解析json(需要说明的是,有时候返回的不一定是json,需要开发者自己去想办法提取信息)

        public string RequestUrl ( string url, string postMehtod )
        {
            string result = String.Empty;
            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Method = postMehtod;
                request.ContentType = "application/x-www-form-urlencoded";
                HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse( );
                StreamReader responseReader = new StreamReader(webResponse.GetResponseStream( ));
                result = responseReader.ReadToEnd( );
                responseReader.Close( );
                webResponse.Close( );
            }
            catch
            {
                throw;
            }
            return result;
        }
    internal static class Extension
    {
        /// <summary>
        /// 解析JSON格式字符串(无嵌套的类型,如{"Name":"Sam","Age":20})
        /// </summary>
        /// <returns></returns>
        public static Dictionary<string, object> GetValues ( this String jsonString )
        {
            try
            {
                JavaScriptSerializer ser = new JavaScriptSerializer( );
                return (Dictionary<string, object>)ser.DeserializeObject(jsonString);
            }
            catch
            {
                throw;
            }
            return null;
        }
}

        5、注意第四步中获取的ExpiresIn是access_token的有效时间,我们获取到access_token和ExpiresIn时,需要将access_token和ExpiresIn(或是利用这个值计算出access_token的过期日期)保存起来(一般存数据库,不过访问慢点),这样只要access_token存在(如果保存在cookie中的话就容易丢失)而且没过期,就不用每次都引导用户授权了(当然登录是必须的,有的开发者注意别把这两者混为一团),至于具体怎么处理这两个值就需开发者自己衡量了

       6、现在我们可以使用access_token和uid来访问用户的信息或是做些其他操作,详细的需要开发者查看新浪api文档(注意本人开发时此文档还在不断变化中,所以返回的一些数据可能会发生变化),下面贴一个本人获取的用户信息的一个函数,注意此函数旨在说明用法,读者不必细究,需要自己去封装

        /// <summary>
        /// 获取用户的基本信息,参数uid为可选参数,不选时就获取到当前登录用户
        /// </summary>
        /// <param name="uid">用户的UID(可选参数,为0或不选函数将返回当前登录用户)</param>
        /// <returns></returns>
        public SinaUser GetUser( Int64 uid = 0 )
        {
            if (uid == 0)
                _sinaUser.Id = Convert.ToInt64(_oauthSina.Uid);
            else
                _sinaUser.Id = uid;
            if (_sinaUser.Id == 0)
                return _sinaUser;
            string request = String.Format(SHOW_URL + "?access_token={0}&uid={1}", AccessToken, _sinaUser.Id);
            string response = _oauthSina.RequestUrl(request, "GET");
            var dic = response.GetValues();
            _sinaUser.ScreenName = (string)dic["screen_name"];
            _sinaUser.Name = (string)dic["name"];
            _sinaUser.Province = (string)dic["province"];
            _sinaUser.City = (string)dic["city"];
            _sinaUser.Location = (string)dic["location"];
            _sinaUser.Description = (string)dic["description"];
            _sinaUser.Url = (string)dic["url"];
            _sinaUser.ProfileImageUrl = (string)dic["profile_image_url"];
            _sinaUser.ProfileUrl = (string)dic["profile_url"];
            _sinaUser.Domain = (string)dic["domain"];
            _sinaUser.Gender = (string)dic["gender"];
            _sinaUser.FollowersCount = (int)dic["followers_count"];
            _sinaUser.FriendsCount = (int)dic["friends_count"];
            _sinaUser.FavouritesCount = (int)dic["favourites_count"];
            _sinaUser.CreatedDate = (string)dic["created_at"];
            _sinaUser.Following = (bool)dic["following"];
            _sinaUser.Verified = (bool)dic["verified"];
            _sinaUser.OnlineStatus = (int)dic["online_status"];
            _sinaUser.StatusesCount = (int)dic["statuses_count"];
            return _sinaUser;
        }

      OK,至此,你可以利用这些尝试去开发了。能够登录、获取用户信息,部署好了就可以让新浪审核了。腾讯的开放平台一大堆,读者要弄的话,自己慢慢去看了,不过大体步骤跟这差不多(多了个openid)。
      小提示下,开发者个人信息别随便填,有很多改不了(本人当初开发时,由于种种原因填了自己的邮箱,后来要离职,不过我还是给改回来了,当时新浪那个只在前台做验证,现在不知道改了没,所以修改下css就可以修改邮箱了)。

posted @ 2012-11-26 17:14  峰顶飞龙  阅读(688)  评论(0编辑  收藏  举报