ASP.NET 网站如何集成QQ登录功能

参考了《asp.net 集成QQ2.0 登陆代码示例》和《登陆整合实现-QQ互联认证(ASP.NET版本)》。

using System;
using System.Net;
using System.Text;
using System.IO;
using System.Collections.Specialized;
using System.Data;
using System.Configuration;
using Newtonsoft.Json.Linq;
using Scratchline.Database;
using System.Web.Security;

namespace Scratchline.CN
{
    public partial class login_qq : System.Web.UI.Page
    {
        private static Random RndSeed = new Random();

        public string GenerateRndNonce()
        {
            return (RndSeed.Next(1, 0xf423f).ToString("000000") + RndSeed.Next(1, 0xf423f).ToString("000000"));
        }

        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 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)
        {
            // 成功授权后的回调地址
            string redirect_uri = ConfigurationManager.AppSettings["redirect_uri"];
            // 分配给应用的appid
            string client_id = ConfigurationManager.AppSettings["client_id"];
            // 分配给网站的appkey
            string client_secret = ConfigurationManager.AppSettings["client_secret"];
            // 用户的OpenID
            string strOpenId = Request.QueryString["openid"] ?? string.Empty;

            if (strOpenId.Length <= 0)
            {
                //Step1:获取Authorization Code
                string code = Request.QueryString["code"];
                if (string.IsNullOrEmpty(code))
                {
                    //state参数用于防止CSRF攻击,成功授权后回调时会原样带回
                    Session["state"] = GenerateRndNonce();//md5(uniqid(rand(), TRUE));
                    string authorize_uri = string.Format("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&state={2}", client_id, Server.UrlEncode(redirect_uri), Session["state"]);
                    Response.Redirect(authorize_uri);
                }
                //Step2:通过Authorization Code获取Access Token
                if (Request["state"].ToString().Equals(Session["state"].ToString()))
                {
                    // 解析access_token返回包
                    string token_uri = string.Format("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}", client_id, client_secret, code, redirect_uri);
                    string accesstoken = file_get_contents(token_uri, Encoding.UTF8);
                    NameValueCollection ps = ParseUrlParameters(accesstoken);
                    string access_token = ps["access_token"];
                    string expires_in = ps["expires_in"];
                    string refresh_token = ps["refresh_token"];

                    // 解析OpenID返回包
                    string me_uri = string.Format("https://graph.qq.com/oauth2.0/me?access_token={0}", access_token);
                    string callback = file_get_contents(me_uri, Encoding.UTF8);
                    if (callback.Contains("callback"))
                    {
                        int lpos = callback.IndexOf("(");
                        int rpos = callback.IndexOf(")");
                        callback = callback.Substring(lpos + 1, rpos - lpos - 1);
                    }
                    JObject jobject = JObject.Parse(callback);
                    string openid = jobject["openid"].ToString();

                    //Step4:通过access_token,appid,openid获得用户信息
                    string get_user_info_uri = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", access_token, client_id, openid);
                    string user_info = file_get_contents(get_user_info_uri, Encoding.UTF8);
                    jobject = JObject.Parse(user_info);
                    Session["nickname"] = jobject["nickname"].ToString();
                    Session["figureurl_qq_2"] = jobject["figureurl_qq_2"].ToString();

                    string SQL = string.Format("SELECT * FROM _Users WHERE openid=‘{0}‘", openid);
                    DataTable dt = SQLServer.Select(SQL);
                    if (dt.Rows.Count <= 0)
                    {
                        SQL = string.Format("INSERT INTO _Users([nickname],[openid]) VALUES(‘{0}‘,‘{1}‘)", Session["nickname"], openid);
                        SQLServer.Execute(SQL);
                    }
                    // 授权并跳转
                    FormsAuthentication.SetAuthCookie(openid, false);
                    Response.Redirect("index.aspx");
                }
            }
        }
    }
}

时间: 2024-10-07 01:59:34

ASP.NET 网站如何集成QQ登录功能的相关文章

网站集成QQ登录功能(转)

最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助. 一.前期准备 首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图.最后我们会有一个APP ID和APP KEY

网站集成QQ登录功能

最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助. 一.前期准备 首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图.最后我们会有一个APP ID和APP KEY

java如何在网站中接入qq登录功能

其实接入qq登录还是很简单的,但是你既然要做qq登录肯定你得网站要能够在外网访问的到, 因为qq在对你得网站授权之间会进行人工检查,检查你得图标摆放位置合不合理,网站是否违法等内容. 当你的网站能够在外网访问的时候 我们在qq开发者网站中申请网站的授权 用你的qq登录这个网站 http://connect.qq.com/ 在管理中心创建你的应用 创建应用的时候需要你填写一些网站的基本信息 如访问网址.登录成功后回调地址(也就是你处理登录请求的action) 腾讯会在request中封装qq验证后

网站集成微博登录功能

前几天写了一篇关于网站集成QQ登录的文章受到不少网友的好评,期间有不少网友私信能不能写一篇关于网站集成新浪微博登录功能的文章,于是这些天抽空写了这篇文章,希望能帮到有需要的朋友. 一.前期准备 网站要想集成新浪微博登录功能,你需要先去新浪微博的开放平台注册一个开发者账号,新浪微博开放平台地址:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 注册完了以后,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图.最后我们会有一个App Key和

网站使用QQ登录功能

一般网站要先做个用户注册的功能页面,但我的网站名气不大,不需要要求用户注册,所以直接使用腾讯QQ登录的API接口. 如何使用JS_SDK让网站拥有QQ登录的功能,官网的这篇文章写得还算完整:http://connect.qq.com/intro/login/jssdk-demo  但是,里面有些地方并没有填写“实例”,只是说那个地方需要填写什么东西,但有时这样说是不够的,我就是试了挺多遍才知道填写的格式. 所以我重新整理下过程. 一:准备工作 域名注册,空间购买,网站接入申请这些我就不说了.使用

如何在ios中集成微信登录功能

在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所有框架到应用程序中

React Native 接入微博、微信、QQ 登录功能

在 App 开发中我们经常需要在用户登录模块接入 SNS 登录组件,这样会大大提高用户的注册体验.特别当一个不是刚性需求 App 推广的时候,这样会很大的降低用户体验的成本,没有人愿意忍受输入邮箱.手机号码去注册一个账号的流程.本文主要分享了在 React Native 中接入微博.微信.QQ 登录的流程,以及此前登录组件中修复的一个已知 bug 的修复. 使用中有任何问题欢迎留言交流.讨论.http://blog.1ygowu.com ReactNative技术交流 QQ群127482131

基于django的视频点播网站开发-step3-注册登录功能

用户注册登录是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果.在本讲中,我们会用到user中的用户授权方面的一些函数,还会对django中的user进行扩展,以及django中的form验证. 效果展示 注册页面 登录页面 创建users应用 django的设计哲学是,一个应用只提供一种功能,比如users应用只提供用户相关功能,comment应用只提供评论相关功能,这能提高代码的重复利用率. 在django中,只

接入qq登录功能出现的问题

在调用qq授权的接口时,出现以上错误. 原因是: 打包的应用签名和第一次上传包的签名不一致造成的 解决方法: 第一种方法:用上次打包apk的keystore重新打包apk,使签名一致. 第二种方法:联系客服更换后台服务器上保存的签名.