WebApi系列~QQ互联的引入(QConnectSDK)

简介:

感谢与改进

首先要感谢张善友老兄为大家封装的这个DLL,它将QQ官方的相关API都集成到了这个里面,这对于开发人员来说,是个福音,有人会说,为什么QQ官方没有提供.net版的SDK呢,在这里,我想说,可能是腾讯公司没有人会.net吧,哈哈!

玩笑话,在使用善友兄的QConnectSDK时,也遇到了一些问题,如session持久化问题,有人会说,session可以持久化所有对象,当然,这句话在某种情况下是正确的,但当你的session持久化方式改变后,如,使用sqlserver来存储信息时(可能是为了跨站点进行信息共享吧,呵呵)你的session就不允许使用无法序列化的对象或 MarshalByRef 对象.这是个很严重的问题,在我今天介绍的架构里,解决了它,主要思想是使用sessionID和cache来代替session来存储某些对象的.

插件DLL

Newtonsoft.Json.dll

QConnectSDK.dll

RestSharp.dll

DLL下载

注意,它们之前是相互依赖的,所以,要考虑到版本的兼容性

代码相关

C#代码

     /// <summary>
        /// QQ登陆页面
        /// </summary>
        [HttpGet]
        public ActionResult QQLogin(string returnUrl)
        {
            if (!string.IsNullOrWhiteSpace(returnUrl))
            {
                System.Web.HttpRuntime.Cache.Insert(Session.SessionID + "RETURNURL", returnUrl);
            }
            var context = new QzoneContext();
            string state = Guid.NewGuid().ToString().Replace("-", "");
            System.Web.HttpRuntime.Cache.Insert(Session.SessionID + "requeststate", state);//一个请求状态码,写入session,在redirectUri时进行比较
            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); return new RedirectResult(authenticationUrl); } /// <summary> /// 回调页面 /// </summary> public ActionResult QQConnect() { if (Request.Params["code"] != null) { QOpenClient qzone = null; string url = Url.Action("index", "home"); var verifier = Request.Params["code"]; var state = Request.Params["state"]; System.Web.HttpRuntime.Cache.Insert(Session.SessionID + "verifier", verifier); string requestState = System.Web.HttpRuntime.Cache.Get(Session.SessionID + "requeststate").ToString(); if (state == requestState) { qzone = new QOpenClient(verifier, state); var currentUser = qzone.GetCurrentUser(); if (System.Web.HttpRuntime.Cache.Get(Session.SessionID + "QzoneOauth") == null) { System.Web.HttpRuntime.Cache.Insert(Session.SessionID + "QzoneOauth", qzone); } if (!string.IsNullOrWhiteSpace((System.Web.HttpRuntime.Cache.Get(Session.SessionID + "RETURNURL") ?? string.Empty).ToString())) { url = System.Web.HttpRuntime.Cache.Get(Session.SessionID + "RETURNURL").ToString(); } ViewBag.friendlyName = currentUser.Nickname; ViewBag.img = currentUser.Figureurl; } } return View(); }

HTML & JS代码

<h2><a id="logins">qq</a></h2>
<h1>@Request.QueryString["friendlyName"]</h1>
<img  src="@Request.QueryString["img"]"/>

<script type="text/ecmascript">
    $(function () {
        $("#logins").live("click", function () {
            window.open('/Home/QQLogin', 'newwindow', 'height=400,width=400,top=400,left=400,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');
        });
    });
</script>

程序截图

改进的地方

这个程序事实上也是有问题的,因应当有多台WEB服务器作负载均衡时,它的session_ID也是不同的,这时,就会出现问题了,所以,最好还是使用session来做这事,我试着把复杂对象的存储去掉了,QQ登陆也是可以的,不知道善友用这个持久化干什么用的.

修改后的代码如下

/// <summary>
        /// QQ登陆页面
        /// </summary>
        [HttpGet]
        public ActionResult QQLogin(string returnUrl)
        {
            if (!string.IsNullOrWhiteSpace(returnUrl))
            {
                Session["RETURNURL"] = returnUrl;
            }
            var context = new QzoneContext();
            string state = Guid.NewGuid().ToString().Replace("-", "");
            Session["requeststate"] = state;//一个请求状态码,写入session,在redirectUri时进行比较
            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); return new RedirectResult(authenticationUrl); } /// <summary> /// 回调页面 /// </summary> public ActionResult QQConnect() { if (Request.Params["code"] != null) { QOpenClient qzone = null; string url = Url.Action("index", "home"); var verifier = Request.Params["code"]; var state = Request.Params["state"]; Session["verifier"] = verifier; string requestState = Session["requeststate"].ToString(); if (state == requestState) { qzone = new QOpenClient(verifier, state); var currentUser = qzone.GetCurrentUser(); // Session["QzoneOauth"] = qzone; //不支持session持久化sqlserver方法 if (!string.IsNullOrWhiteSpace((Session["RETURNURL"] ?? string.Empty).ToString())) { url = Session["RETURNURL"].ToString(); } ViewBag.friendlyName = currentUser.Nickname; ViewBag.img = currentUser.Figureurl; } } return View(); }

本文转自博客园张占岭(仓储大叔)的博客,原文链接:WebApi系列~QQ互联的引入(QConnectSDK),如需转载请自行联系原博主。

目录
相关文章
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
JavaScript IDE 前端开发
【Web3 探索】如何获取协议中某个地址拥有的所有投资组合
在本指南中,我们将为您介绍使用Chainbase的getAccountPortfolios API检索协议中特定地址拥有的所有投资组合的步骤。
108 0
【Web3 探索】如何获取协议中某个地址拥有的所有投资组合
Lsposed和EDXposed框架双开QQ和微信,双开QX微X模块解决方法
好多网友反映双开情况下微信微X模块及QXQN模块不起作用!最近我整理出两种办法希望能帮助到大家如果方法①不能解决那就用方法②解决!
4553 0
Lsposed和EDXposed框架双开QQ和微信,双开QX微X模块解决方法
|
Ubuntu IDE Java
Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo
在arm上做了Qt的应用程序,为了在局域网实现web页的访问方式来配置arm上Qt的程序,局域网轻量级http服务器是很好的实现方式之一,有机会做国产麒麟上Qt的http服务器,正好接触到了QtWebApp可以实现。   本篇实战解说QtWebApp的轻量级Demo。   本篇篇幅较长,为了保持基础的完整性将必要的东西都放在本篇。
|
JSON 前端开发 Java
web前-JAVA后端 数据API接口交互协议
目前热门的主流web前端和Java后端数据技术架构:设备端和后台服务端,两者之间主要有两类的数据流和一类的控制流进行数据的交互。
web前-JAVA后端 数据API接口交互协议
|
测试技术 API
【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿。而这之前,程序之间通信效率的王者也许可以算得上是gRPC了。那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着比拼一下minimal api服务和gRPC服务在通信上的效率。
461 0
【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
|
开发工具 数据安全/隐私保护 开发者
QQ 互联平台是干什么的?底层原理是什么?
QQ 互联平台是干什么的?底层原理是什么?
509 0
|
JSON 数据格式
web通过转发进行视频聊天和直播的简单实现
web通过转发进行视频聊天和直播的简单实现
311 0
|
小程序
WeChat小程序如何实现转发功能?
WeChat小程序如何实现转发功能?
182 0
WeChat小程序如何实现转发功能?
|
负载均衡 中间件 BI
AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载
一、AgileEAS.NET SOA 中间件简介      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。
1196 4