[转][C#]QQ开放平台(QQ登录)_流程和源码示例

网上看到QQ登录的源码,不错,收藏分享给大家下。

本文内容

QQ开放平台(QQ登录)开发介绍

QQ开放平台是针对QQ网站以外的网站开发的信息共享接口,各网站通过实现QQ代码实现,可以与QQ网站的交换数据。本文说的是腾讯的OpenID开发,相关OpenID的相关文章,是有相关技术标准的,大家可以看百科会更详细。简单来说,就是说,在用户登录网站时,只使用绑定QQ的QQ帐号进行登录即可,无需每次去输入各网站的密码...

准备工作

访问:http://opensns.qq.com/,点击(图1)上的QQ登录链接,然后点击(图2)中“申请加入”链接,输入你的QQ帐号进行QQ登录验证,点击(图3)中的“添加网站/应用”链接。输入网站相关信息和网站验证后,会显示(图4)显示的管理中心界面。上面显示着AppID和AppKey,下面的程序中将会用到,保密数据,请误泄露哈!

 

qq开放平台

图1

图2

图3

图4

QQ开放平台中QQ登录程序运行流程

1、客户端浏览器转向QQ验证页面,用户输入用户名密码后,QQ网站回调回开发者网站,并传回Authorization Code。

2、开发者网站发送获取到的Authorization Code后,将Authorization Code和AppID、AppKey使用Http协议发送给腾讯,腾讯验证后返回登录结果。

3、如果验证成功,返回用户的OpenID,OpenID是登录用户登录后的在开发者网站中唯一标识,升度为32位,字符范围为0-9A-F。

示例程序源码

?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using System.Text;
using System.Web.Script.Serialization;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
  
public partial class _Default : System.Web.UI.Page
{
         private static Random RndSeed = new Random();
  
         public string GenerateRndNonce()
         {
             return (RndSeed.Next(1, 0x5f5e0ff).ToString( "00000000" ) + RndSeed.Next(1, 0x5f5e0ff).ToString( "00000000" ) +
?
                     RndSeed.Next(1, 0x5f5e0ff).ToString( "00000000" ) + RndSeed.Next(1, 0x5f5e0ff).ToString( "00000000" ));
         }
  
     public string file_get_contents( string url,Encoding encode)
     {
         HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(url);
         WebResponse response= request.GetResponse();
         using (MemoryStream ms= new MemoryStream())
         {
             using (Stream stream =response.GetResponseStream())
             {
                 int readc;
                 byte [] buffer= new byte [1024];
                 while ((readc=stream.Read(buffer,0,buffer.Length))>0)
                 {
                     ms.Write(buffer,0,readc);
                 }
             }
             return encode.GetString(ms.ToArray());
         }
     }
      
     NameValueCollection ParseJson( string json_code)
     {
         NameValueCollection mc= new NameValueCollection();
         Regex regex = new Regex( @"(\s*\""?([^""]*)\""?\s*\:\s*\""?([^""]*)\""?\,?)" );
         json_code=json_code.Trim();
         if (json_code.StartsWith( "{" ))
         {
            json_code=json_code.Substring(1,json_code.Length-2);
         }
         foreach (Match m in regex.Matches(json_code))
         {
             mc.Add(m.Groups[2].Value, m.Groups[3].Value);
             //Response.Write(m.Groups[2].Value + "=" + m.Groups[3].Value + "<br/>");
         }
         return mc;
     }
     NameValueCollection ParseUrlParameters( string str_params)
     {
         NameValueCollection nc = new NameValueCollection();
         foreach ( string p in str_params.Split( '&' ))
         {
             string [] p_s = p.Split( '=' );
             nc.Add(p_s[0], p_s[1]);
         }
         return nc;
     }
     protected void Page_Load( object sender, EventArgs e)
     {
         //应用的APPID
         string app_id = "粘贴你的APPID" ;
         //应用的APPKEY
         string app_secret = "粘贴你的APPKey" ;
         //成功授权后的回调地址
         string my_url = "http://www.yourSite.cn/Default.aspx" ;
  
         //Step1:获取Authorization Code
         //session_start();
         string code = Request.QueryString[ "code" ];
         if ( string .IsNullOrEmpty(code))
         {
             //state参数用于防止CSRF攻击,成功授权后回调时会原样带回
             Session[ "state" ] = GenerateRndNonce(); //md5(uniqid(rand(), TRUE)); 
             //拼接URL     
             string dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
                + app_id + "&redirect_uri=" + Server.UrlEncode(my_url) + "&state="
                + Session[ "state" ];
             Response.Write( "<script> location.href='" + dialog_url + "'</script>" );
             Response.End();
         }
  
         //Step2:通过Authorization Code获取Access Token
         if (Request[ "state" ].ToString().Equals(Session[ "state" ].ToString()))
         {
             //拼接URL   
             string token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
             + "client_id=" + app_id + "&redirect_uri=" + Server.UrlEncode(my_url)
             + "&client_secret=" + app_secret + "&code=" + code;
             string response = file_get_contents(token_url, Encoding.UTF8);
             NameValueCollection msg;
             if (response.IndexOf( "callback" ) != -1)
             {
                 int lpos = response.IndexOf( "(" );
                 int rpos = response.IndexOf( ")" );
                 response = response.Substring(lpos + 1, rpos - lpos - 1);
                 msg = ParseJson(response);
  
                 if (! string .IsNullOrEmpty(msg[ "error" ]))
                 {
                     Response.Write( "<h3>error:</h3>" + msg[ "error" ].ToString());
                     Response.Write( "<h3>msg  :</h3>" + msg[ "error_description" ]);
                     Response.End(); return ;
                 }
             }
             //Response.Write(response);
             //Step3:使用Access Token来获取用户的OpenID
             NameValueCollection ps = ParseUrlParameters(response);
             //*parse_str($response, $params);
             string graph_url = "https://graph.qq.com/oauth2.0/me?access_token=" + ps[ "access_token" ];
             string str = file_get_contents(graph_url, Encoding.Default);
             if (str.IndexOf( "callback" ) != -1)
             {
                 int lpos = str.IndexOf( "(" );
                 int rpos = str.IndexOf( ")" );
                 str = str.Substring(lpos + 1, rpos - lpos - 1);
             }
             NameValueCollection user = ParseJson(str);
             if (! string .IsNullOrEmpty(user[ "error" ]))
             {
                 Response.Write( "<h3>error:</h3>" + user[ "error" ]);
                 Response.Write( "<h3>msg  :</h3>" + user[ "error_description" ]);
                 Response.End();
             }
             Response.Write( "Hello " + user[ "openid" ]);
         }
         else
         {
             Response.Write( "The state does not match. You may be a victim of CSRF.request=" + Request[ "state" ] + ",session=" + Session[ "state" ]);
         }
  
         Response.End();
     }
}

本地测试方法

     1、用记事本打开:C:\Windows\System32\drivers\etc\hosts文件

     2、新增行“127.0.0.1       域 名”,比如:127.0.0.1    www.jishu.me即可(当前这个域名必须是QQ开放平台“添加网站/应用”时输入的域名,否则会报错)。

     3、重新启动IE浏览器后,输入域名即可访问本地站点,注意IIS中绑定的IP要与Host文件中指定的IP一致。

版所所有阿旭博客,如要转载,请注明来源:http://www.cnblogs.com/a-xu/archive/2012/04/07/qq_login.html

分类: ASP.NET技术

转载于:https://www.cnblogs.com/chhuic/archive/2012/04/09/2438738.html

注意: 不需要很多的类库 全部下来只有三个文件 。一个类库和两个前台页面,你将类库放到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、付费专栏及课程。

余额充值