当前位置: 首页 > 工具软件 > ShopNC > 使用案例 >

ShopNC中使用QQ互联遇到的坑

法浩壤
2023-12-01

在ShopNC中启动QQ互联,遇到不少坑,小记一下:

1. 在QQ互联中填写回调地址

按照shop/api.php中的代码:

elseif ($_GET['act'] == 'toqq'){
   define('SHOP_SITE_URL',$site_url);
   if ($_GET['op'] == 'g'){
      include 'api/qq/oauth/qq_callback.php';
   }else{
      include 'api/qq/oauth/qq_login.php';
   }
}

回调地址应该是/api.php?act=toqq&op=g,但是这样的带hash的地址QQ不允许使用。

因此只好在新建一个shop/api_qq.php,在最后

include 'api/qq/oauth/qq_callback.php';

2. 在跳转到QQ登陆页面后,回调时出错

QQ返回的出错信息是

error:
100007
msg :
param access token is wrong or lost 

经过反复查找原因后发现,原来是session引起的。

因为shopnc采用单一入口方式,默认在index.php下会调用core\framework\core\base.php中的Base::run()

后者调用self::init(),后者再调用self::start_session(),在start_session的最后:

//默认以文件形式存储session信息
session_save_path(BASE_DATA_PATH.'/session');
session_start();
将session的保存地址修改为了data/session。

而QQ的回调地址未经过这个单一入口,也就没有修改session的保存地址,经查看phpinfo可知在:

session.save_path /var/lib/php/session
这样就导致了QQ互联回调后无法读取session中的token(防csrf),从而出错。


解决方案:

1. 修改start_session,不让其修改session_path。

2. 使用memcache、Redis等代替文件来保存session。

 类似资料: