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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 19:06:03