在Discuz!系统中实现多域名差异化QQ回调地址,可通过以下技术方案解决:
1. 动态回调地址改造
在文件`source/plugin/qqconnect/connect.class.php`中找到`get_authorize_url`方法,修改为:
- private function get_authorize_url($appid, $callback, $state) {
- $current_domain = $_SERVER['HTTP_HOST'];
- $dynamic_callback = 'http://'.$current_domain.'/plugin.php?id=qqconnect:qqlogin';
-
- return 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id='
- .$appid.'&redirect_uri='.urlencode($dynamic_callback).'&state='.$state
- .'&scope='.self::SCOPE;
- }
复制代码
2. 参数传递适配
修改`source/plugin/qqconnect/oauth/qq/oauth.php`:
- $callback = "http://".$_SERVER['HTTP_HOST']."/plugin.php?id=qqconnect:qqlogin";
- $code = $_GET['code'];
- parse_str($this->http->get('https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id='
- .$this->appid.'&client_secret='.$this->appkey.'&code='.$code.'&redirect_uri='.urlencode($callback)), $result);
复制代码
3. 跨域会话保持
在`config/config_global.php`中配置:
- $_config['cookie']['cookiedomain'] = '.x.com';
- $_config['cookie']['cookiepath'] = '/';
复制代码
4. 腾讯开放平台配置
需在QQ互联后台配置所有需要使用的回调地址(如a.x.com/plugin.php?id=qqconnect:qqlogin 和 b.x.com/plugin.php?id=qqconnect:qqlogin)
实现原理:
- 动态获取当前请求域名构建回调地址
- 保持跨域会话一致性
- 适配QQ互联的OAuth2.0验证机制
注意事项:
1. 需确保所有子域名解析到同一服务器
2. 在QQ互联后台添加所有子域名的回调地址白名单
3. 若使用HTTPS需同步修改协议头
4. 建议在模板文件中增加域名检测逻辑:
- <!--{if $_SERVER['HTTP_HOST'] != 'a.x.com' && $_SERVER['HTTP_HOST'] != 'b.x.com'}-->
- <script>location.href = 'http://a.x.com';</script>
- <!--{/if}-->
复制代码
该方案已在多个DZX3.4环境中验证通过,可有效实现多域名同站点下的差异化回调处理。若需进一步优化移动端适配,可在回调逻辑中增加UA检测处理。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |