qq、旺旺。msn第三方登陆,附代码

这几天帮公司搞快捷登陆,找了很多资料其中旺旺和msn的资料较少,先分享一下,方便以后朋友遇到此类似问题,蛋碎一地

首先分享的是qq登陆,这个官方给的资料很全面,而也有针对asp.net的api所以不用死太多脑细胞

html页面

<asp:LinkButton ID="LinkButtonQQ" runat="server" BorderStyle="None" CssClass="b_r"
                    OnClick="LinkButtonQQ_Click"><img src="/images/other_account_pic1.gif" alt="QQ" />QQ</asp:LinkButton>

这个不用解释,一个qq的图标按钮控件

需要从官网上下载asp.net的api

在web.config文件中加入如下代码

<configSections>
    <sectionGroup name="QQSectionGroup">
      <section name="QzoneSection" type="System.Configuration.NameValueSectionHandler,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>
  </configSections>
  <QQSectionGroup>
    <QzoneSection>
      <add key="AppKey" value=申请应用分配给的key/>
      <add key="AppSecret" value=申请应用分配给的AppSecret />
      <add key="CallBackURI" value=回调地址 />
      <add key="AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />
    </QzoneSection>
  </QQSectionGroup>

引用对应的命名空间

using QConnectSDK;
using QConnectSDK.Context;


            var context = new QzoneContext();
            string state = Guid.NewGuid().ToString().Replace("-", "");
//此处代码略过,目的是把state保存在session方便日后使用
            string scope = "get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr";
            var authenticationUrl = context.GetAuthorizationUrl(state, scope);
            Response.Redirect(authenticationUrl);


在接受页面代码如上,一般来说要是实现第三方登陆我们只需要把qq上唯一的id和自己网站上的某一用户名绑定或者重新定义用户名并绑定qq的唯一id

在接受页面上依然要引用命名空间

using QConnectSDK;

 QOpenClient qzone = null;
                        QConnectSDK.Models.User currentUser = null;
                        string verifier = Request.Params["code"];//页面回传的code
                        //查找数据库若有则直接登陆若无则绑定页面
                         string state =从前面保存的session中取出值并赋值
                        qzone = new QOpenClient(verifier, state);
                        currentUser = qzone.GetCurrentUser();
string userOpenId = qzone.OAuthToken.OpenId;//该openid为该qq号唯一对应id
 

 旺旺登陆  (本人使用Top方法)

在前台页面中跳入该地址

http://container.api.taobao.com/container?appkey=用户申请应用分配的key&encode=utf-8&redirect_uri=定义的回调地址

在接受页面中

先应用命名空间

using Top.Api;
using Top.Api.Response;
using Top.Api.Request;
using Top.Api.Util;

此处需要下载topsdk.dll引用在项目中

 string top_session = Request.Params["top_session"];
                    string url1 = "正式环境调用地址
                    string appkey = 分配到的key;
                    string appsecret =分配到的secret;
                    ITopClient client = new DefaultTopClient(url1, appkey, appsecret);
                    UserBuyerGetRequest req = new UserBuyerGetRequest();
                    req.Fields = "nick,sex";
                    UserBuyerGetResponse response = client.Execute(req, top_session);
                    string userWangWId = response.User.Nick.ToString();//此处获取的是旺旺的用户名

由于旺旺用户名是不能重复的,所以这个可以做为唯一识别用户方法,若需要其他功能则调用其他方法

 MSN登陆

在前台页面中跳入该地址

https://oauth.live.com/authorize?client_id=用户分配的id&scope=需要什么信息就填写什么内容&response_type=code&redirect_uri=回调地址

接受页面

string clientId = 分配的clientId;
                        string redirect_uri = 设定的回调地址;
                        string clientSecret = 分配的Secret;
                        string code = Request.Params["code"];
                        string oauthUrl = "https://oauth.live.com/token";
                        string postData = string.Format("client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&grant_type=authorization_code",
                                HttpUtility.UrlEncode(clientId),
                                HttpUtility.UrlEncode(redirect_uri),
                                HttpUtility.UrlEncode(clientSecret),
                                HttpUtility.UrlEncode(code));
                        try
                        {
                            string tokenJson = RequestLiveToken(oauthUrl, postData);
                            RestJson tokenjson = new RestJson();
                            JavaScriptSerializer jsserialize = new JavaScriptSerializer();
                            tokenjson = jsserialize.Deserialize<RestJson>(tokenJson);//通过返回过来的string转成json数组并取出其中的access_token信息用于后面获取用户资料使用
                            string restUrl = "https://apis.live.net/v5.0/me?access_token=" + tokenjson.access_token;
                            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(restUrl);
                            request.Method = "GET";
                            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                            string restJson = new StreamReader(response.GetResponseStream()).ReadToEnd();
                            MsnUserInfo userInfojson = new MsnUserInfo();
                            userInfojson = jsserialize.Deserialize<MsnUserInfo>(restJson);
                            string userMsnId = userInfojson.id;//此处获取的是msn对应的唯一id                           
                        }
                        catch (Exception ex)
                        {
                            显示错误信息或者跳回首页地址
                        }

因为msn需要两次授权所以需要使用try,catch来以免发生异常

其中需要调用到的post方法并返回参数

 private static string RequestLiveToken(string uri, string postData)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.KeepAlive = false;
            request.ProtocolVersion = HttpVersion.Version10;
            request.Method = "POST";
            byte[] postBytes = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = postBytes.Length;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string test = new StreamReader(response.GetResponseStream()).ReadToEnd();
            return test;
        }

为了方便转换成json数组,我这里定义了两个对象方便调用

    [Serializable, StoreName("RestJson")]
    public class RestJson
    {

        public string access_token { set; get; }

        public string expires_in { set; get; }

        public string refresh_token { set; get; }

        public string scope { set; get; }
        public string token_type { set; get; }


    }
    [Serializable, StoreName("MsnUserInfo")]
    public class MsnUserInfo
    {
        [StoreNoSave]
        public string id { set; get; }

        public string name { set; get; }

        public string first_name { set; get; }

        public string last_name { set; get; }
        public string link { set; get; } 

    }

为何要定义这些变量,是根据传回的json数组来决定

msn登陆我选择用REST方式而不是用本生提供的JS来获取用户信息

可参考使用

 

 

 

注意: 不需要很多的类库 全部下来只有三个文件 。一个类库和两个前台页面,你将类库放到AppCode下面。然后将账号绑定那一块注释掉就行了,或者将账号绑定部分换成你自己系统的。就可以了。程序报错可能是因为我在绑定账号那里用到了别的类,你注释掉就行了 ------------------------------------------------------------ 经过两天的努力 已经成功将QQ登录集成到了 城记网 上。感谢腾讯提供的帮助文档,和关键时刻给的技术支持。我的网站是asp.net写的,有需要的网友可以联系我。 呵呵。(尽管是垃圾站,只要你愿意,又有什么关系呢?) QQ Oauth 只提供PHP的接入demo ,针对 ASP.net 的只有一个网友开发的SDK包,下载地址还老打不开,后来我从CSDN上下载了一个,看了以后感觉太复杂了,我个人感觉做这么个小事情不需要搞个SDK出来,不如自己按帮助文档去写,这样自己写的方法灵活性就高一些,于是就按文档学习开发。其实文档写得很清晰,耐心一看就明白了。 不讲太多的郁闷的过程了,直接说解决办法。 办这个事情主要要知道下面几个事情。 两个重点(如下): 第一个重点:请求Token的步骤, 1:请求未授权的临时token。请求成功以后会转到QQ登录页面。 2:请求已授权的临时token登陆成功以后获得。 3:请求已授权的Access token。 第二个重点:签名的算法。 签名的值计算有一个指定的规则,请参考腾讯开放社区帮助文档,这是最 好的资料。 注意点: 没有申请APPID和APPKEY的先去申请。 传递的每一参数都要URLENcode,注意是每一个,包括动态生成的签名。    参数之间是有顺序的,是升序排列的,无论有多少个,都要排序。    各个步骤之间是有关联的,下一步的提交往往需要上一步的返回参数。 我采取的文档结构: 总共三个文件 ,非常简单。 一个放在APPcode下面的类。用来发送请求和接待参数。 两个前台页面,主要是对类的调用。 下面把类的代码完全贴出,你知要一看见类,就知道怎么写前台页面了,很简单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值