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),如需转载请自行联系原博主。

目录
相关文章
|
8月前
|
人工智能 监控 安全
开源AI守护后厨——餐饮厨房视频安全系统的技术解析
餐饮厨房视频安全系统是一套融合开源AI技术与视频监控的智能化解决方案,涵盖实时检测、行为监测、数据分析、公众透明化及反馈闭环五大模块。系统通过YOLOv8、ResNet等算法实现后厨卫生与操作规范的精准监控,识别率达97%,问题响应时间缩短至秒级。同时支持后厨直播与监管对接,提升消费者信任和管理效率。其灵活开源的特点,为食品行业安全管理提供了高效、透明的新路径,未来可扩展至食品加工等领域。
670 0
|
5月前
|
移动开发 小程序 开发工具
揭秘微信/支付宝6大支付方式:从扫码到刷脸,谁在偷偷赚你的手续费?优雅草卓伊凡
揭秘微信/支付宝6大支付方式:从扫码到刷脸,谁在偷偷赚你的手续费?优雅草卓伊凡
886 0
揭秘微信/支付宝6大支付方式:从扫码到刷脸,谁在偷偷赚你的手续费?优雅草卓伊凡
|
云安全 弹性计算 Linux
幻兽帕鲁Palworld服务器部署教程(阿里云服务器3分钟搭建幻兽帕鲁保姆级攻略)
想要部署属于自己的幻兽帕鲁服务器(Dedicated Server),您首先需要拥有一台服务器,服务器是幻兽帕鲁运行的基础。部署完成后,您和您的朋友便可以登入专属的游戏服进行体验。使用云服务器搭建幻兽帕鲁服务器,便可以让您与您的朋友在一个相对独立且私密的空间中进行游戏,确保获得更加畅快的游戏体验。 您可以选择阿里云服务器作为游戏服务器,并按照下面教程来部署幻兽帕鲁。
|
Java 测试技术 持续交付
Java一分钟之-Spring Cloud Contract:契约测试
【6月更文挑战第16天】Spring Cloud Contract是微服务契约测试框架,通过DSL定义接口行为,使用WireMock生成存根进行独立开发验证。常见问题包括契约编写不清晰、未集成到CI/CD和契约版本控制混乱。例如,定义一个`GET /greeting`返回JSON响应的契约,Spring Cloud Contract会自动生成测试代码,帮助确保服务间接口一致性,提升开发效率和系统稳定性。
411 7
|
10月前
|
存储 SQL 分布式计算
MaxCompute 近实时增全量处理一体化新架构和使用场景介绍
MaxCompute 近实时增全量处理一体化新架构和使用场景介绍
211 0
|
存储 消息中间件 缓存
中间件redis的使用
【9月更文挑战第28天】Redis 是一个开源的、基于内存的数据结构存储系统,可用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,使其在各种应用场景中表现出色。Redis 作为缓存中间件能显著提高数据访问速度,其缓存过期策略有助于管理数据生命周期。在 .NET 应用程序中使用 Redis 缓存,可通过安装 `StackExchange.Redis` 库并连接到 Redis 服务器来实现数据的读写操作。此外,Redis 作为消息中间件,基于生产者-消费者模型实现消息队列,确保消息的可靠性和顺序性。
463 4
|
Ubuntu 安全 Linux
【专栏】在Ubuntu 22.04 LTS中,管理用户和权限对系统安全至关重要
【4月更文挑战第28天】在Ubuntu 22.04 LTS中,管理用户和权限对系统安全至关重要。使用`adduser`和`deluser`命令可轻松添加和删除用户,而`sudo`命令则允许授权用户执行管理员任务。要授予用户sudo权限,可通过`usermod -aG sudo newuser`将用户加入`sudo`组,或使用`visudo`编辑`/etc/sudoers`文件。撤销权限时,只需移除用户从`sudo`组或编辑`sudoers`文件删除相应配置。了解这些技能能有效保护系统免受未授权访问,确保安全。
1486 2
|
安全 5G 网络安全
什么是 Wi-Fi 热点?
【8月更文挑战第24天】
3462 0
|
小程序 API
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
358 0

热门文章

最新文章