qiuwen-rnrs/callback.php

138 行
4.3 KiB
PHP

<?php
error_reporting(0);
ini_set('display_errors', 0);
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'loadRequires.php';
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'template.php';
use MediaWiki\OAuthClient\Client;
use MediaWiki\OAuthClient\ClientConfig;
use MediaWiki\OAuthClient\Consumer;
use MediaWiki\OAuthClient\Token;
if (!isset($_GET['oauth_verifier'])) {
$pageContent = <<<EOF
<p>本页面仅应该被求闻百科调用。</p>
<p><a href="/index.php">重新开始实名认证</a></p>
EOF;
pageTemplate('错误', $pageContent);
exit(1);
}
$conf = new ClientConfig($rnrsOAuthUrl);
$conf->setConsumer(new Consumer($rnrsConsumerKey, $rnrsConsumerSecret));
$conf->setUserAgent('Qiuwen/1.1 (MediaWikiOAuthClient/1.0; RNRS/1.0)');
$client = new Client($conf);
// 根据Session存储的RK,重新创建Token对象
session_start();
$requestToken = new Token($_SESSION['request_key'], $_SESSION['request_secret']);
// 获取AK
$accessToken = $client->complete($requestToken, $_GET['oauth_verifier']);
$_SESSION['access_key'] = $accessToken->key;
$_SESSION['access_secret'] = $accessToken->secret;
// 销毁RK
unset($_SESSION['request_key'], $_SESSION['request_secret']);
// 使用AK获取对应用户的信息。我们只需要ID、用户名等信息
$ident = $client->identify($accessToken);
$_SESSION['qwUserId'] = $ident->sub;
$_SESSION['qwUserName'] = $ident->username;
// 我们不再需要证明你是你了。
unset($ident, $client);
// 连接数据库
$dsn = "$rnrsDatabaseType:host=$rnrsDatabaseServer;dbname=$rnrsDatabaseName";
try {
$dbconn = new PDO($dsn, $rnrsDatabaseUser, $rnrsDatabasePass);
} catch (PDOException $e) {
echo "打开数据库错误:" . $e->getMessage();
}
$dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 创建实名信息数据表
try {
$sql = "CREATE TABLE IF NOT EXISTS `rnrs_users` (
`rnrsu_userid` INT(10) UNSIGNED NOT NULL,
`rnrsu_username` VARBINARY(255) UNIQUE NOT NULL,
`rnrsu_mobile_idd` int(4) NOT NULL,
`rnrsu_mobile` BINARY(20) NOT NULL,
`rnrsu_bot` TINYINT UNSIGNED NOT NULL,
`rnrsu_bot_parent` INT(10) UNSIGNED,
`rnrsu_confirm_time` BIGINT UNSIGNED NOT NULL,
`rnrsu_hash` TINYBLOB NOT NULL,
PRIMARY KEY (`rnrsu_userid`),
KEY `rnrsu_bot_parent`(`rnrsu_bot_parent`)
) ENGINE=INNODB DEFAULT CHARSET=binary;";
$dbconn->exec($sql);
} catch (PDOException $e) {
echo "创建数据表时错误:" . $e->getMessage();
}
// 创建实名日志数据表
try {
$sql = "CREATE TABLE IF NOT EXISTS `rnrs_log` (
`rnrsl_logid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`rnrsl_userid` INT(10) UNSIGNED NOT NULL,
`rnrsl_username` VARBINARY(255) NOT NULL,
`rnrsl_mobile_idd` int(4) NOT NULL,
`rnrsl_mobile` BINARY(20) NOT NULL,
`rnrsl_bot` TINYINT UNSIGNED NOT NULL,
`rnrsl_bot_parent` INT(10) UNSIGNED,
`rnrsl_confirm_time` BIGINT UNSIGNED NOT NULL,
`rnrsl_hash` TINYBLOB NOT NULL,
PRIMARY KEY (`rnrsl_logid`),
KEY `rnrsl_bot_parent`(`rnrsl_bot_parent`)
) ENGINE=INNODB DEFAULT CHARSET=binary;";
$dbconn->exec($sql);
} catch (PDOException $e) {
echo "创建数据表时错误:" . $e->getMessage();
}
// 试图获取用户既有实名信息
$qwUserId = $_SESSION['qwUserId'];
$qwUserName = $_SESSION['qwUserName'];
try {
$sql = "SELECT * FROM `rnrs_users` WHERE `rnrsu_userid` = $qwUserId;";
$result = $dbconn->query($sql);
$rows = $result->rowCount();
if ($rows == 0) {
$isNewRNR = 1;
} else {
$isNewRNR = 0;
$rowall = $result->fetchAll();
}
} catch (PDOException $e) {
echo "获取实名信息时错误:" . $e->getMessage();
}
if ($isNewRNR) {
$dbconn = null;
refreshPage('/reg.php');
} else {
foreach ($rowall as $row) {
$qwdbUserName = $row['rnrsu_username'];
$_SESSION['qwUserMobile'] = rtrim($row['rnrsu_mobile']);
$_SESSION['qwPhoneNumberIdd'] = rtrim($row['rnrsu_mobile_idd']) ?? '86';
$_SESSION['qwUserConfirmTime'] = rtrim($row['rnrsu_confirm_time']);
$_SESSION['qwUserHash'] = rtrim($row['rnrsu_hash']);
}
$_SESSION['qwUserInfoStatus'] = 0;
if ($qwUserName != $qwdbUserName) {
try {
$sql = "UPDATE `rnrs_users` SET `rnrsu_username`='$qwUserName' WHERE `rnrsu_userid`=$qwUserId";
$tempint = $dbconn->exec($sql);
} catch (PDOException $e) {
echo "同步用户名信息时错误:" . $e->getMessage();
}
$_SESSION['qwUserInfoStatus'] += 4;
}
$dbconn = null;
refreshPage('/verify.php');
}