彩虹聚合登录是彩虹旗下的社会化账号聚合登录系统,让网站的最终用户可以一站式选择使用多种社会化帐号登录站点的聚合登录程序
一、插件概述
CLogin 是一个第三方登录集成系统,所有插件位于 `includes/plugins/` 目录下。插件采用统一的开发规范,易于扩展和维护。
二、插件结构
每个插件都是一个独立的 PHP 类文件,类名与文件名一致(小写),位于 `plugins` 命名空间下。
基本文件结构
includes/plugins/
└── [你的插件名].php # 你的自定义插件
/assets/icon
└── [你的登录插件使用的平台的图标].png # 你的自定义插件LOGO
三、插件开发规范
1. 命名空间
所有插件必须使用 `namespace plugins;` 命名空间。
2. 类定义
类名与文件名完全一致(小写),例如插件文件名为 `example.php`,则类名为 `example`。
3. 必需的静态属性 `$info`
每个插件必须定义静态公共属性 `$info`,用于描述插件基本信息:
| 字段 | 类型 | 说明 |
| name | string | 插件内部名称(与类名一致) |
| showname | string | 插件显示名称 |
| link | string | 第三方平台官网链接 |
| sort | int | 排序值(数字越小越靠前) |
| abroad | bool | 是否为国外平台(影响请求方式) |
| input | array | 配置项数组 |
4. 私有属性
通常定义以下私有属性:
private $client_id; // 应用 ID
private $client_secret; // 应用密钥
private $callback; // 回调地址5. 必需的公共方法
构造函数 `__construct($config)`
public function __construct($config)
{
global $siteurl;
$this->client_id = $config['client_id'];
$this->client_secret = $config['client_secret'];
$this->callback = $siteurl . 'return.php';
}参数:`$config`:配置数组,包含 `client_id` 和 `client_secret`
help() 方法
返回帮助信息 HTML,用于在后台显示申请地址和配置说明。
public function help()
{
global $siteurl;
return '● <a href="申请地址" target="_blank" rel="noreferrer">申请地址</a>,应用回调地址填写:' . $siteurl . 'return.php';
}login($state) 方法
生成并返回授权登录 URL。
参数:`$state`:状态参数,用于防止 CSRF 攻击
返回:完整的授权 URL
public function login($state)
{
$param = [
"response_type" => "code",
"client_id" => $this->client_id,
"redirect_uri" => $this->callback,
"scope" => 'user_info', // 根据平台要求设置权限范围
"state" => $state
];
return self::GET_AUTH_CODE_URL . '?' . http_build_query($param);
}callback($code, $type = 0, $mode = 0) 方法
回调处理函数,使用授权码获取用户信息。
参数:
`$code`:授权码
`$type`:类型参数(备用)
`$mode`:模式参数(备用)
返回:用户信息数组,最好包含以下字段(你要是闲的没事干也可以什么都不包含:
| 字段 | 类型 | 是否必须 | 说明 |
| access\_token | string | 是 | 访问令牌 |
| social\_uid | string/int | 是 | 用户唯一标识(账户平台的) |
| faceimg | string | 否 | 用户头像 URL |
| nickname | string | 是 | 用户昵称 |
| mobile | string | 否 | 手机号 |
| string | 否 | 邮箱 |
注:子比主题若无法获取头像URL,则使用社会化登录注册账号时不会在用户中心显示头像。
public function callback($code, $type = 0, $mode = 0)
{
$access_token = $this->get_access_token($code);
$userinfo = $this->get_userinfo($access_token);
$result = [
'access_token' => $access_token,
'social_uid' => $userinfo['id'],
'faceimg' => $userinfo['avatar_url'],
'nickname' => $userinfo['name'],
'location' => $userinfo['location'],
];
return $result;
}6. 私有辅助方法(建议实现)
get\_access\_token($code)
使用授权码换取访问令牌。
参数:`$code`:授权码
返回:access\_token 字符串
private function get_access_token($code)
{
$param = [
"grant_type" => "authorization_code",
"code" => $code,
"client_id" => $this->client_id,
"client_secret" => $this->client_secret,
"redirect_uri" => $this->callback
];
$url = self::GET_ACCESS_TOKEN_URL;
$response = get_curl_api(self::$info['abroad'], $url, http_build_query($param));
$arr = json_decode($response, true);
if (isset($arr['access_token'])) {
return $arr['access_token'];
} elseif (isset($arr['error'])) {
throw new Exception('获取access_token失败 [' . $arr['error'] . ']' . $arr['error_description']);
} else {
throw new Exception('获取access_token失败,原因未知');
}
}get\_userinfo($access\_token)
使用访问令牌获取用户信息。
参数:`$access_token`:访问令牌
返回:用户信息数组
private function get_userinfo($access_token)
{
$param = [
"access_token" => $access_token
];
$url = self::GET_USER_INFO_URL . '?' . http_build_query($param);
$response = get_curl_api(self::$info['abroad'], $url);
$arr = json_decode($response, true);
if (isset($arr['id'])) {
return $arr;
} elseif (isset($arr['message'])) {
throw new Exception('获取用户信息失败 ' . $arr['message']);
} else {
throw new Exception('获取用户信息失败,原因未知');
}
}四、HTTP 请求工具函数
系统提供 `get_curl_api()` 函数用于发起 HTTP 请求:
get_curl_api($abroad, $url, $postdata = 0, $timeout = 0, $header = 0)参数说明:
`$abroad`:是否为国外平台(使用 `self::$info[‘abroad’]`)
`$url`:请求 URL
`$postdata`:POST 数据(0 表示 GET 请求)
`$timeout`:超时时间(秒)
`$header`:请求头数组
五、注意事项
1. 回调地址统一为 `$siteurl . ‘return.php’`
$this->callback = $siteurl . 'return.php';2. 错误处理:使用 `throw new Exception()` 抛出异常
throw new Exception('获取access_token失败,原因未知');3. JSON 解析:使用 `json_decode($response, true)` 解析响应
return json_decode($response, true);4. HTTP 请求:优先使用 `get_curl_api()` 函数
$response = get_curl_api(self::$info['abroad'], $url, http_build_query($param));5. 排序值:避免与现有插件冲突
6. 文件命名:建议全部小写,并且与类名一致





请登录后查看评论内容