最新出现这个 connect_error_code_20003 问题,很多网站都有这个问题,连 admin5 的论坛也有这个问题。主要原因是 QQ 登录 OAuth1.0 的服务变得极不稳定了。
OAuth2.0 的服务,安全性,便捷性都要比 1.0 强。这个也是早晚的事情。但是由于 discuz 官方提供的方案不是对所有的网站都有效,很多站长就碰到了各种问题。
薇晓朵官网近期也出现了这个问题,已经尝试过很多方法,一直没成功。经过排查调试,对这个错误通过一些解决方法,供大家在解决中参考。
重要的事情放在前面:
1 、开启 OAuth2.0 登录方式,见猴子的置顶帖。执行那个升级就可以了。
2 、 PHP 开启 curl 方法和 openssl 。在 phpinfo 中可以查看到如下。

接下来就是特殊的事,也是问题的集中的地方:
如果你的论坛是 X3.2(X3.1 应该也差不多,没分析),那么本身是支持 OAuth2.0 的登录的。
在确保此功能正常的情况下,下载本帖所附的附件,更新到 QQ 互联插件目录 (source/plugin/qqconnect),然后访问 URL 。
如您不了解如何开启此功能,请联系您的服务商解决。
http://yourwebsite/plugin.php?id=qqconnect:oauth_switch 切换到 oAuth2 模式
切换完毕后删除 oauth_switch.inc.php 文件

qqconnect_oauth_switch.zip

如果你是 X3 或者以下。 (本身插件不支持 OAuth2.0)
第一步、下载 X3.2 的源码,把里面的 plugin 里的 qqconnect 文件夹,去替换你网站上的,并且去后台系统插件里升级,升级后,数据库里 2 个表会多 2 个字段,具体如果升级后找不到字段问题,论坛上有解决方法的,搜一下就可以解决,不难。
第二步、在确保此功能正常的情况下,下载本帖所附的附件,更新到 QQ 互联插件目录 (source/plugin/qqconnect),然后访问 URL 。
如您不了解如何开启此功能,请联系您的服务商解决。
http://yourwebsite/plugin.php?id=qqconnect:oauth_switch 切换到 oAuth2 模式
切换完毕后删除 oauth_switch.inc.php 文件

qqconnect_oauth_switch.zip

第三步、把 X3.2 的源码里的 plugin/manyou 这个插件放到你的网站的对应 plugin 里的位置。
这个 manyou 是云服务的一些方法在里面。 X3 是在 api/manyou 里,所以我估计替换 manyou/Server 这个文件夹也是可行的。

第四步,做一些兼容的代码改动
主要是针对多出来的 conuintoken 这个字段做兼容。

  1. member_connect_logging.php
  2. 25 行加入以下代码:
  3. $conuintoken = $this->connect_guest['conuintoken'];
  4. 33 行:
  5. //if ($conuin && $conopenid) {
  6. 修改为
  7. if ($conopenid) {
  8. member_connect_register.php
  9. 63 行,增加
  10. $conuintoken = $this->connect_guest['conuintoken'];
  11. 69 左右
  12.         //if (!$conuin || !$conuinsecret || !$conopenid) {
  13.         //        showmessage('qqconnect:connect_get_request_token_failed');
  14. //        }
  15. 改为
  16.         if(!$_G['setting']['connect']['oauth2']) {
  17.                 if (!$conuin || !$conuinsecret || !$conopenid) {
  18.                         showmessage('qqconnect:connect_get_request_token_failed');
  19.                 }
  20.         } else {
  21.                 if (!$conuintoken || !$conopenid) {
  22.                         showmessage('qqconnect:connect_get_request_token_failed');
  23.                 }
  24.         }
  25. 90 行左右增加
  26. 'conuintoken' => $conuintoken,

  1. class_cloud.php
  2. 43 行
  3. $file = DISCUZ_ROOT . 『/api/manyou/' . implode('/', $items) . '.php';
  4. 改为
  5. $file = DISCUZ_ROOT . '/source/plugin/manyou/' . implode('/', $items) . '.php';
  6. 关键一步
  7. DX3.2 中的 function_filesock 替换 source/function 中的 function_filesock.php

最后,对小白用户,提供一个检测脚本,解压缩后把里面的 qqtest.php 放到 bbs 根目录,然后 url 中打开就可以。
如果没有出现 YOU should install and open Curl_PHP 的提示,那么你的环境是正确的。 CURL 和 ssl 都是可以用的。

qqtest.php.zip

附:判断 OAuth2.0 是否启用的方法。点击 qq 登录后跳到的地址是下面这个,就是 1.0 的

  1. http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_consumer_key=xxxxxx&oauth_token=xxxxxx

跳到下面这个地址,就是 2.0 的

  1. http://openapi.qzone.qq.com/oauth/show?which=Login&display=pc&response_type=code&client_id=xxxx&redirect_uri=http%3A%2F%2Fwww.weixiaoduo.com%2Fconnect.php%3Fmod%3Dlogin%26op%3Dcallback%26referer%3Dforum.php%253Fmod%253Dviewthread%2526tid%253D3195653%2526extra%253Dpage%25253D1%2526page%253D1&state=xxxxx&scope=get_user_info%2Cadd_share%2Cadd_t%2Cadd_pic_t%2Cget_repost_list