调用Shopify\Utils::loadCurrentSession()时参数类型错误排查
我正尝试使用PHP对接Shopify Rest Admin API,采用Shopify官方的PHP API库,已成功完成初始化:
Shopify\Context::initialize( 'key', 'secret', 'scope_1, scope_2', 'https://example.com', new FileSessionStorage('/tmp/php_sessions'), '2022-10', );
但执行如下请求时出现错误:
$this->test_session = Utils::loadCurrentSession( $requestHeaders, $requestCookies, $isOnline ); Webhookv2::webhooks( $this->test_session, // Session [], // Url Ids [], // Params );
报错信息如下:
Fatal error: Uncaught TypeError: Argument 1 passed to Shopify\Utils::loadCurrentSession() must be of the type array, null given, called in /www/doc/www.example.com/www/script/index.php on line 45 and defined in /www/doc/www.example.com/www/script/vendor/shopify/shopify-api/src/Utils.php:158 Stack trace: #0 /www/doc/www.example.com/www/script/index.php(45): Shopify\Utils::loadCurrentSession(NULL, NULL, NULL) #1 {main} thrown in /www/doc/www.example.com/www/script/vendor/shopify-api/src/Utils.php on line 158
请问我遗漏了什么配置或步骤?
附:Shopify PHP库中Utils.php文件对应方法的代码:
/** * 基于传入的请求头和Cookie加载当前用户会话 * * @param array $rawHeaders HTTP请求的头信息 * @param array $cookies HTTP请求的Cookie信息 * @param bool $isOnline 是否加载在线会话(true)或离线会话(false) * * @return Session|null 找到的会话,找不到则返回null * @throws \Shopify\Exception\CookieNotFoundException * @throws \Shopify\Exception\MissingArgumentException */ public static function loadCurrentSession(array $rawHeaders, array $cookies, bool $isOnline): ?Session { $sessionId = OAuth::getCurrentSessionId($rawHeaders, $cookies, $isOnline); return Context::$SESSION_STORAGE->loadSession($sessionId); }
这个错误的核心是你传入loadCurrentSession的三个参数全为null,但方法要求前两个必须是数组类型,第三个必须是布尔类型。按以下步骤修正:
正确获取请求头与Cookie
在PHP环境中,请求头可通过getallheaders()函数获取(FastCGI环境可改用apache_request_headers(),或从$_SERVER数组中手动提取);Cookie直接从$_COOKIE全局变量获取:$requestHeaders = getallheaders(); $requestCookies = $_COOKIE;明确
$isOnline参数值$isOnline是布尔值:true表示加载用户授权的临时在线会话,false表示加载商店级的长期离线会话。根据业务场景设置,比如处理Webhook时通常用离线会话,设为false。确保会话已存在
调用loadCurrentSession前,必须完成OAuth授权流程,且会话已被存储到你配置的FileSessionStorage中。若未完成授权或会话已过期,该方法会返回null,后续调用Webhookv2::webhooks也会出错。增加参数校验
调用前可添加参数校验,避免传入非法值:if (!is_array($requestHeaders) || !is_array($requestCookies) || !is_bool($isOnline)) { throw new Exception("loadCurrentSession参数无效"); } $this->test_session = Utils::loadCurrentSession($requestHeaders, $requestCookies, $isOnline);Webhook场景特殊处理
若处理Shopify Webhook请求,Webhook本身不会携带会话Cookie,此时不能用loadCurrentSession,需手动加载离线会话:// 从Webhook请求头X-Shopify-Shop-Domain获取商店域名 $shopDomain = $_SERVER['HTTP_X_SHOPIFY_SHOP_DOMAIN']; $sessionId = OAuth::getOfflineSessionId($shopDomain); $this->test_session = Context::$SESSION_STORAGE->loadSession($sessionId);
内容的提问来源于stack exchange,提问作者ILG

