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

如何在Stripe Checkout中为用户多订阅项添加唯一标识?

问题描述

我正在构建的工具允许每个用户拥有多个订阅,这些订阅可为同一服务但配置不同。我为每个用户订阅创建单独的订阅项,以便在结账时将配置详情放入其描述中。问题是我需要能够识别每个单独的订阅,以便日后进行编辑或取消操作。

我尝试在订单项、产品和价格属性上使用metadata(API仅允许在product下添加),且API不允许在订单项中添加lookup_key。虽然API接收了metadata,但它从未显示在Stripe后台或支付确认的webhook中(订单项的metadata为空)。

附上我的PHP代码:

$lineItems;
foreach ($cartItems as $job){
    SubscriptionJobs::createJobForPayment($job,$userId,$cartId,$transactionId);
    $jobId = $job->item_id;

    $item = [
        'price_data' => [
            'currency'      =>'usd',
            'unit_amount'   => $unitAmount,
            'product_data'  => [
                'description'   => $description, 
                'name'          => $subName,
                'metadata'    => ['job_id'=>$jobId],
                
            ],
            'recurring' => [
                'interval' => Carts::getPaymentFrequency($cartId),
            ],
        ],
        'quantity' => '1',
    ];
    $lineItems[] = $item;
};

$checkoutData = [
    'line_items'          => [$lineItems],
    'client_reference_id' => $cartId,
    'subscription_data'   => ['metadata' => [
        'cart_id'       => $cartId,
        'user_id'       => $userId,
        'transaction_id'=>$transactionId]],
    'mode'                => 'subscription',
    'success_url'         => $DOMAIN . '/success',
    'cancel_url'          => $DOMAIN . '/cancel',
];
if($userData->stripe_id != ''){
    $checkoutData['customer'] = $userData->stripe_id;
}else{
    $checkoutData['customer_email'] = $userEmail;
}

$checkout_session = \Stripe\Checkout\Session::create($checkoutData);
dd($checkout_session);

return redirect($checkout_session->url);
解决方案

你之前把job_id放在了product_data的metadata里,这只会给动态创建的Product添加标识,而不会关联到对应的订阅项(Subscription Item)。要让每个订阅项携带可识别的元数据,需要直接在line_items的每个条目里添加metadata字段,这个字段会被同步到最终生成的Subscription Item中,在Stripe后台和webhook事件里都能看到。

修改代码中的$item数组,在price_data同级添加metadata:

$item = [
    'price_data' => [
        'currency'      =>'usd',
        'unit_amount'   => $unitAmount,
        'product_data'  => [
            'description'   => $description, 
            'name'          => $subName,
            // 这里的metadata是产品级的,可选保留
            'metadata'    => ['job_id'=>$jobId],
        ],
        'recurring' => [
            'interval' => Carts::getPaymentFrequency($cartId),
        ],
    ],
    'quantity' => '1',
    // 添加这行,给订阅项设置metadata
    'metadata' => ['job_id' => $jobId]
];

同时注意你代码中line_items的写法有误,$lineItems已经是数组,不需要再用[$lineItems]包裹,应该直接写'line_items' => $lineItems,,否则会导致嵌套错误,这可能也是部分数据异常的原因之一。

修改后,当订阅创建完成,你可以在以下位置找到这个job_id:

  • Stripe后台的订阅详情页,查看对应的订阅项(Item),其元数据会显示job_id
  • 在checkout.session.completed或customer.subscription.created的webhook事件中,subscription.items.data数组里的每个对象都会包含metadata.job_id字段

内容的提问来源于stack exchange,提问作者KevlarCoated

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:58:17