首页 > 解决方案 > 订阅设置试用期时如何防止在条带中创建重复订阅

问题描述

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

1)用户输入卡的详细信息

2)sca弹出出现

3)无论用户是否完成身份验证,都不会在条带中创建订阅,因为我设置了 trial_end_date=>now()+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=\Stripe\Subscription::create($data);
}
catch(Exception $e) {
    return response()->json(['success' => false,'message'=>$e->getMessage()]);
}

我错过了什么?如何防止重复订阅方案。请用我缺少的正确示例进行说明。提前致谢

标签: stripe-payments

解决方案


我认为问题出在您的付款流程中,没有明确检测重复订阅的条带 api。毕竟,您可以为每个客户 ID 分配超过 1 个订阅。您可以创建幂等键,但这与您所说的不一样,幂等键用于在同一时间范围内意外点击提交按钮两次。

解决方案是在订阅试用期结束之前将付款方式附加到您的条带客户 ID。例如,如果您使用的是条纹元素,您会调用

下面的节点/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再次调用。


推荐阅读