Gravity Forms场景下获取Stripe\Checkout\Session的apiKey与payment_intent的方法
Gravity Forms Stripe回调中提取目标属性的可落地方案
公开属性 payment_intent 的获取方式
payment_intent 是 Stripe\Checkout\Session 对象对外暴露的一级公开属性,不需要解析深层嵌套结构,直接通过对象属性访问即可拿到值:
- 完整钩子接入示例代码:
add_action('gform_stripe_fulfillment', function($session, $feed, $entry, $form) { // 直接读取一级公开属性,即可拿到payment_intent的字符串ID $paymentIntentId = $session->payment_intent; // 后续自定义业务逻辑... }, 10, 4);
注意:如果当前Stripe支付配置未启用Checkout结账流程,该值可能为空,属于插件正常返回逻辑
嵌套存储的 apiKey 的获取方式
你通过var_dump观察到apiKey存放在Stripe\Util\RequestOptions结构中,这是Stripe SDK的内部受保护非公开属性,不能直接用链式属性访问读取(PHP会直接抛出权限错误)。这类内部结构的命名和存储位置会随SDK版本更新调整,硬写链式读取没有长期兼容性保障,推荐两种稳定性最高的获取方式:
- 优先从钩子传入的
$feed参数读取(插件原生提供的上下文,无版本兼容风险)
示例代码:
// 在回调函数内部,从Feed配置中直接取当前支付流程实际使用的apiKey $currentApiKey = rgars($feed, 'meta/api_key');
- 若业务逻辑必须从Session对象本身读取内部存储的apiKey,用反射方法合规访问非公开属性,不要硬拼对象嵌套链:
// 兼容Stripe SDK v70+全版本的通用读取逻辑 $reflectionClass = new ReflectionClass($session); $optsProp = $reflectionClass->getProperty('_opts'); $optsProp->setAccessible(true); $requestOptions = $optsProp->getValue($session); // 兼容不同SDK版本的属性命名差异 $apiKey = $requestOptions->api_key ?? ($requestOptions->apiKey ?? null);
提示:这种反射读取的方式仅作为兜底方案,只要能通过插件传入的参数获取到apiKey,就优先用插件提供的上下文,避免SDK版本更新导致逻辑失效
常见踩坑说明
- 禁止直接写类似
$session->_requestOptions->apiKey的链式访问代码,受保护的私有属性会被PHP权限拦截,直接抛出Cannot access protected property致命错误 - 读取到的
payment_intent是字符串格式的ID,不是完整的PaymentIntent对象,如需获取完整支付详情,可使用该ID结合对应apiKey调用Stripe SDK的PaymentIntent::retrieve()方法拉取完整数据 - 不要循环遍历Session对象的所有私有属性做正则匹配取值,这类写法没有任何版本兼容保障,插件小版本更新就可能触发功能失效
内容的提问来源于stack exchange,提问作者djoo
相关产品推荐
相关产品推荐

