当订阅设置了试用期时,如何防止在条带中创建重复订阅



我遇到条纹的问题。让我解释一下我的工作场景。我的要求是14天内不向用户收取预付卡费用

1( 用户输入卡详细信息

2( sca弹出窗口出现

3( 无论用户是否完成身份验证,都会在条带中创建订阅,因为我将trial_end_date设置为>现在((+14天

4( 用户支付由于某种原因失败并再次尝试,另一个订阅创建了

我担心重复的订阅,因为stripe会在14天后尝试为这两个订阅付费,因为它会为两个订阅的持卡人发送stripe托管的链接

让我简要介绍一下我目前拥有的

$data['customer']='customerId';
$data['items']=[];
$data['items'][0]['plan']='stripe_plan_id'   
$data['default_payment_method']='pm_xxxx'
$data['trial_end']= strtotime('+14 days');
$data['prorate']=true;
$data['tax_percent']=env('VAT_PERCENTAGE'); 
$data['expand']= ['latest_invoice.payment_intent', 'pending_setup_intent'];
try {
$subscription=StripeSubscription::create($data);
}
catch(Exception $e) {
return response()->json(['success' => false,'message'=>$e->getMessage()]);
}

我缺少什么?如何防止重复的订阅场景。请用我错过的正确例子来说明。提前感谢

我认为问题出在您的支付流中,没有明确检测重复订阅的stripe api。毕竟,你可以为每个客户id分配超过1个订阅。你可以创建幂等密钥,但这与你所说的不同,幂等密钥是指在同一时间段内意外点击提交按钮两次。

解决方案是在订阅试用结束前,在条纹客户id上附加一种付款方式。例如,如果你正在使用条纹元素,你会称之为

Node/JS示例如下:

const result = await stripe.createPaymentMethod({
type: 'card',
card: card
})

然后将结果传递给后端

const result =  await stripe.paymentMethods.attach(paymentMethodId, {customerId})

您不需要创建新的订阅,因为已经为该用户创建了一个订阅。信用卡分配给客户ID,而不是订阅。Stripe会做剩下的。

您还需要使用以下默认付款方式更新客户:

const customer_update = await stripe.customers.update(stripeCustomerId,{invoice_settings: {default_payment_method:paymentMethodId}});

现在,当您访问仪表板时,您将看到一张分配给客户的默认卡。一旦订阅超过跟踪期,将向默认卡收取费用。

因此,在这种情况下,不会创建重复的订阅,因为您不会再次调用stripe.subscriptions.create

最新更新