如何在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
相关产品推荐
相关产品推荐

