You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:25:15