使用Stripe PHP SDK通过Customer ID获取订阅ID遇属性错误求助
问题分析与解决方案
错误原因
你遇到的「Trying to get property 'data' of non-object」报错,核心问题有两个:
- 调用
\Stripe\Customer::retrieve()时,传入的$customer->id是未初始化的变量值——此时$customer还未通过API获取到有效数据,这个参数无效,导致返回的客户对象中subscriptions属性不存在或为null,访问->data自然触发报错。 - 即使客户ID有效,也可能该客户没有任何订阅,
subscriptions为空集合,同样会引发类似问题。
修正后的代码方案
方案一:通过展开客户资源获取订阅
先将收集到的有效客户ID存入变量,再调用API,同时增加安全判断避免报错:
// 替换为你实际收集到的Customer ID $customer_id = 'cus_xxxxxx'; // 获取客户并展开订阅列表 $customer = \Stripe\Customer::retrieve( $customer_id, ['expand' => ['subscriptions']] ); // 安全获取第一个订阅ID if (isset($customer->subscriptions) && is_object($customer->subscriptions) && !empty($customer->subscriptions->data)) { $first_sub_id = $customer->subscriptions->data[0]->id; var_dump($first_sub_id); } else { echo "该客户无有效订阅或无法获取订阅数据"; }
方案二:直接查询客户的订阅列表
这种方式更直接,无需展开客户资源,直接通过订阅API筛选指定客户的订阅:
$customer_id = 'cus_xxxxxx'; // 查询该客户的所有订阅 $subscriptions = \Stripe\Subscription::all(['customer' => $customer_id]); if (!empty($subscriptions->data)) { $first_sub_id = $subscriptions->data[0]->id; var_dump($first_sub_id); } else { echo "该客户没有订阅记录"; }
注意事项
- 确保
$customer_id是格式正确的Stripe客户ID(通常以cus_开头)。 - 建议添加Stripe API的异常捕获(比如
try-catch),处理网络错误、权限不足等其他潜在问题。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

