PHP进阶-实现网站的QQ授权登录
授权登录是站点开发常见的应用场景,通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先,我们需要申请QQ互联开发者账号获得APPID和密钥;接着,我们下载QQ官方SDK:PHP SDK v2.2 并完成安装部署;待API测试无误后,部署到正式环境并测试;最终实现QQ一键登录的效果。
一、QQ互联申请账号密钥
我们需要先申请 APPID 和 APPSECRET。
前往 QQ互联官网(connect.qq.com),注册用户,申请网站应用,填写网站的一些基本信息,完善资料的那一步非常重要。
域名:一定不能错。
回调地址:一定包含上面填写的完整域名,不能是子域名的关系,但回调地址的内容可以先随便写,后面我们需要根据实际配置修改。
网站备案号:根据实际填写。
提供者:我写的个人姓名。
网站图标:要和实际网站保持一致。
我们填写完成后点击申请,大概三个工作日会有结果,通过之后我们这个网站应用的APPID和APPSECRET就可以拿来使用了。
二、下载含Oauth接口的SDK
下载QQ官方SDK:PHP SDK v2.2 ,里面有我们需要的Oauth2接口。
三、调试SDK内API接口
我们把压缩包解压放置到我们的服务器项目根目录下(WordPress文件夹下),先测试一下里面的example文件夹的Oauth接口。
首先我们需要配置APPID和APPSECRET,服务器访问localhost或者外网浏览器访问域名下的install文件夹里的index.php页面,我访问的是:域名/QQAPI/install/index.php,这里的QQAPI是我在API上面套的一层文件夹。
填写APPID、APPKEY(我一般叫APPSECRET)、文字提示的回调域名,勾选get_user_info,点击配置。
我们的配置信息就通过这个页面写入了,存储我们配置文件的是API\comm\inc.php文件。如果后面要修改配置信息,我们可以删除install下的标识文件重新访问这个页面,也可以直接修改inc.php文件。
我们先测试一下example的接口,浏览器访问 域名/QQAPI/example,界面如下:
我们先点击[用QQ账号登录],会让我们用手机QQ扫码确认,确认成功会跳转到一个很长字符串的页面,出现这个页面就说明我们的登录接口调用成功了。
如果出现可能未开启curl支持的错误,那么我们在确保自己PHP开启了curl功能下,我们需要去修改一处配置:
编辑API\class\URL.class.php文件,找到get_contents()函数,将if (ini_get(“allow_url_fopen”) == “1”)这个判断去掉,注释掉If和Else的分支。
保存后,我们重新尝试刚刚的登录功能,应该是能登录进去了。
然后我们再试试[获取用户信息],可以获取到我们的头像和昵称。
用户信息获取成功。
四、将API部署到正式环境
1、把 example\oauth 文件夹下的 callback.php 重命名为 connect.php,并放到根目录(回调文件)
2、修改 connect.php 文件的 require_once(“../../API/qqConnectAPI.php”);
修改为 require_once(“QQAPI/API/qqConnectAPI.php”);
3、把example\oauth文件夹下的index.php移动到API目录下(调用登录的文件);
4、修改index.php文件的require_once(“../../API/qqConnectAPI.php”);修改为require_once(“qqConnectAPI.php”);
5、除connect.php文件和API文件夹,删除其他文件和文件夹;
6、修改 API\comm\inc.php 的回调地址,把之前填写的QQ互联回调地址和这里的回调地址都改成一致的: 域名/connect.php 。
如果这里域名和QQ互联上书写不一致,哪怕是www的子域名关系,也会报错,常见报错有:“redirect uri is illegal(100010)的验证错误”、“The state does not match. You may be a victim of CSRF.”,都是说明是回调地址有问题。
五、测试QQ授权登录功能
我们浏览器访问 域名/QQAPI/API/index.php ,出现授权登录界面。
打开connect.php文件,我们可以看到,刚刚的长字符串是 qq_callback() 和 get_openid() 的返回值。
我们修改connect.php文件,让其输出更多内容。
<?php
require_once("QQAPI/API/qqConnectAPI.php");
$qc = new QC();
$acs = $qc->qq_callback();
$oid = $qc->get_openid();
$arr = $qc->get_user_info();
echo $acs;
echo "<br />";
echo $oid;
echo "<br />";
$qc = new QC($acs,$oid);
$sex = $arr["gender"]; //性别
$name = $arr["nickname"]; //姓名
echo $sex;
echo "<br />";
echo $name;
echo "<br />";
$arr = $qc->get_user_info();echo '<meta charset="UTF-8">';
echo "<p>";
echo "Gender:".$arr["gender"];
echo "</p>";
echo "<p>";
echo "NickName:".$arr["nickname"];
echo "</p>";
echo "<p>";
echo "<img src=\"".$arr['figureurl']."\">";
echo "<p>";
echo "<p>";
echo "<img src=\"".$arr['figureurl_1']."\">";
echo "<p>";
echo "<p>";
echo "<img src=\"".$arr['figureurl_2']."\">";
echo "<p>";
echo "vip:".$arr["vip"];
echo "</p>";
echo "level:".$arr["level"];
echo "</p>";
echo "is_yellow_year_vip:".$arr["is_yellow_year_vip"];
echo "</p>";// 开始判断是否获取到openid
if(strlen($oid)>=1){echo "执行到这里就是登陆成功了,可以写自己的代码了";
}
输出头像、昵称、性别等用户信息。
至此我们成功完成了Ouath2.0的认证,并取得了关键的用户信息。
六、存储数据和界面展示
我们获得了用户的昵称和头像等信息,把它们存储到数据库,并通过前台显示,此处自由发挥。
相关文章:

PHP进阶-实现网站的QQ授权登录
授权登录是站点开发常见的应用场景,通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先,我们需要申请QQ互联开发者账号获得APPID和密钥;接着,我们下载QQ官方SDK:PHP SDK v…...

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军
近日,2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办,活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与,为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中࿰…...
python moviepy 图文批量合成带字幕口播视频
最近在研究将图片和文本批量合成为带字幕口播视频 主要是基于python的moviepy库 from generator import audio, pics, subs, videodef main():texts_input examplepics_input example# 图片分辨率预处理pics.adjust(pics_input)# 文字转语音audio.text_to_audio(texts_inpu…...
【代码片段】Linux C++打印当前函数调用堆栈
在开发大型项目时,尤其是多线程情况下,一般无法使用断点调试,这时候将当前函数的调用堆栈打印出来是非常有必要和有效的问题排查手段。 这里记录一段Linux环境下,打印函数堆栈的代码。 void get_native_callstack(std::string &a…...

Linux程序、进程以及计划任务(第一部分)
目录 一、程序和进程 1、什么是程序? 2、什么是进程? 3、线程是什么? 4、如何查看是多线程还是单线程 5、进程结束的两种情况: 6、进程的状态 二、查看进程信息的相关命令 1、ps:查看静态的进程统计信息 2、…...

Oracle database 12cRAC异地恢复至单机
环境 rac 环境 byoradbrac Oracle12.1.0.2 系统版本:Red Hat Enterprise Linux Server release 6.5 软件版本:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1:172.17.38.44 byoradb2:172.17.38.4…...
【docker】linux部署docker
简介 首先我需要声明的是,我的系统是centos7,下载工具使用的是yum;在linux上部署docker,之前一直看的是这篇文章Linux之Docker部署,基本上功能方面也都可以使用,部署起来也是比较的简单。首先我先讲述这篇…...

【K8S 云原生】Pod资源限制、Pod容器健康检查(探针)
目录 一、docker的重启方式和K8S重启方式 1、Pod的重启方式: 2、docker的重启策略: 二、yaml文件快速生成: 三、pod的状态: 四、Pod的资源限制 1、限制的方式和种类 2、CPU的限制的格式: 五、K8S拉取镜像的策…...
Python从入门到网络爬虫(模块详解)
模块 我们知道,函数和类都是可以重复调用的代码块。在程序中使用位于不同文件的代码块的方法是:导入 (import) 该对象所在的模块 (mudule)。当程序变得越来越大时,将程序的不同部分根据不同分类方法保存在不同文件中通常会更加方便。 导入模…...

[大厂实践] 无停机迁移大规模关键流量(下)
在系统升级、迁移的过程中,如何验证系统逻辑、性能正确无误,是一个很大的挑战。这一系列介绍了Netflix通过重放流量测试解决这一挑战的实践。原文: Migrating Critical Traffic At Scale with No Downtime — Part 2 想象一下,你被心爱的Netf…...

VMware Workstation虚拟机CentOS 7.9 配置固定ip的步骤
VMware Workstation虚拟机CentOS7.9配置固定ip的步骤 编辑虚拟机 打开VMware Workstation。 选择要配置的虚拟机,但不要启动它。 点击“编辑虚拟机设置”(Edit virtual machine settings)。 选择“网络适配器”(Network Adapter&…...

构建自己的私人GPT
创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 一、本地部署…...
EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示
EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示 一 mainwindow.c 文件函数:1.1 自定义PDO配置1.2 主站初始化二 motrorcontrol.c 文件三 allvalue.h 文件该文档修改记录:总结一 mainwindow.c 文件函数: 1.1 自定义PDO配置 int IO_setup(uint16 slave) {int...

线程安全、共享变量的可见性
Java中的线程安全问题 谈到线程安全问题,我们先说说什么是共享资源。所谓共享资源,就是说该资源被多个线程所持有或者说多个线程都可以去访问该资源。 线程安全问题是指当多个线程同时读写一个共享资源并且没有任何同步措施时,导致出现脏数…...

电动汽车BMS PCB制板的技术分析与可制造性设计
随着电动汽车行业的迅猛发展,各大厂商纷纷投入巨资进行技术研发和创新。电动汽车的核心之一在于其电池管理系统(Battery Management System, BMS),而BMS的心脏则是其印刷电路板(PCB)。通过这篇文章探讨电动…...
Android 车联网——多屏多用户(十五)
前面几篇文章介绍了多用户和多屏相关的 Manager 和 Service。上一篇文章最后虽然车内乘员都根据配置有自己的对应屏幕,但默认情况下,所有车内乘员依然使用的是当前主用户(司机用户),这一篇我们继续放下看一下用户的创建与分配。 一、用户创建分配 1、创建用户 对于创建用…...
uwsgitop 使用
背景:Django项目 uwsgi,uwsgi.ini 在工程下。 使用: 下载安装uwsgitop [roothost ~]# tar -zxvf uwsgitop-0.11.tar.gz [rootuwsgitop-0.11 ~]# cd uwsgitop-0.11/ [rootuwsgitop-0.11 ~]# python setup.py install [rootuwsgitop-0.11 …...

深信服技术认证“SCSA-S”划重点:文件包含漏洞
为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…...

Color Control
设计一个优秀的用户界面是一项艰巨的任务。特别是如果你想改变UI的颜色,调整所有元素可能需要花费大量时间。Color Control可以帮助你!在检查器中以可视化的方式将你的项目颜色定义为资源。Color Control为你提供了组件,当你编辑它们时,它们会自动更新你的UI元素。 颜色控制…...
端口开放问题
端口开放问题 所遇问题 在宿主主机上可以ping通虚拟机ip192.168.27.129,但无法在宿主主机上访问http://192.168.27.129:8080navavcat 16连接mysql时,2002 - Can’t connect to server on ‘192.168.27.129’(100601) 原因 以上两个问题&a…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...