phpcms V9 內建 QQ 登錄基於 OAuth 1.0,騰訊已停止審核 1.0 應用,導致新站無法接入。本文提供將會員模塊升級為 OAuth 2.0 的完整步驟,經測試無 Bug。
phpcms/modules/member/index.php在類中添加 public_qq_login2() 方法(建議緊跟原 public_qq_login 之後):
// QQ登錄 OAuth 2.0
public function public_qq_login2() {
$appid = pc_base::load_config('system', 'qq_appid');
$appkey = pc_base::load_config('system', 'qq_appkey');
$callback = pc_base::load_config('system', 'qq_callback');
pc_base::load_app_class('qqOAuth2', '', 0);
$oauth = new qqOAuth2($appid, $appkey, $callback);
$this->_session_start();
if (!isset($_GET['code'])) {
$oauth->redirect_to_login(); // 跳轉騰訊授權頁
} else {
$code = $_GET['code'];
$_SESSION['openid'] = $oauth->get_openid($code);
if (!empty($_SESSION['openid'])) {
// 檢查是否已綁定
$r = $this->db->get_one(['connectid' => $_SESSION['openid'], 'from' => 'qq']);
if (!empty($r)) {
// 已綁定 → 直接登錄
$this->_init_phpsso();
$synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);
// 設置 Cookie、Session 等登錄態...
showmessage(L('login_success') . $synloginstr, $forward);
} else {
// 未綁定 → 跳轉完善資料頁
$user = $oauth->get_user_info();
$_SESSION['connectid'] = $_SESSION['openid'];
$_SESSION['from'] = 'qq';
if (CHARSET != 'utf-8') {
$connect_username = iconv('utf-8', CHARSET, $user['nickname']);
}
include template('member', 'connect');
}
}
}
}
將 qqOAuth2.class.php 放入 phpcms/modules/member/classes/ 目錄。類庫需實現:
• redirect_to_login():構造授權 URL 並跳轉
• get_openid($code):用 code 換取 access_token 再獲取 openid
• get_user_info():用 access_token + openid 獲取暱稱、頭像等
後台 → 會員設置 → QQ 登錄 → 回調地址填寫:
https://您的域名/index.php?m=member&c=index&a=public_qq_login2
同頁面填入騰訊開放平台申請的 App ID、App Key,提交後點擊「更新緩存」。
connectid 字段長度phpcms 默認 v9_member.connectid 為 char(15),OAuth 2.0 的 openid 長度為 32 位,必須擴展:
ALTER TABLE `v9_member` MODIFY `connectid` CHAR(255) NOT NULL DEFAULT '';
此修改同時兼容淘寶、微信、百度等其他第三方登錄的唯一標識存儲。
public_qq_login2。v9_member 表 connectid 正確存儲 32 位 openid。iconv 轉碼(代碼中已包含)。session.cookie_domain 設置。完成上述改造,phpcms V9 即可無縫使用 QQ OAuth 2.0 登錄,並為未來接入微信、微博等打下基礎。