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

Stripe payments 当订阅设置了试用期时,如何防止在条带中创建重复订阅,stripe-payments,Stripe Payments,我遇到了条纹的问题。让我解释一下我的工作 场景。我的要求是14天内不使用预付卡向用户收费 1) 用户输入卡的详细信息 2) 出现sca弹出窗口 3) 无论用户是否完成身份验证,都会在条带中创建订阅,因为我设置了试用期\结束日期=>now()+14天 4) 由于某种原因,用户付款失败,并再次尝试,创建了另一个订阅 我担心重复订阅,因为stripe将尝试在14天后支付这两个订阅,因为它为持卡人发送了一个stripe托管链接,用于这两个订阅 让我简要介绍一下我目前的情况 $data['custome

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

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

2) 出现sca弹出窗口

3) 无论用户是否完成身份验证,都会在条带中创建订阅,因为我设置了试用期\结束日期=>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()]);
}

我错过了什么?如何防止重复订阅场景。请使用我缺少的正确示例进行解释。提前感谢

我认为问题出在您的支付流中,没有显式检测重复订阅的条带api。毕竟,您可以为每个客户id分配一个以上的订阅。您可以创建幂等键,但这与您所说的不同,幂等键用于在同一时间段内意外点击提交按钮两次

解决方案是在您的订阅试用期结束之前,将付款方式附加到您的客户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

我有点迷路了。其中是正在创建的第二个订阅。你的第四步什么时候开始?在用户注册时,或在试用期后的第一次付款时,或其他时间?感谢您的回复。让我澄清一下。当用户尝试使用卡并通过单击“失败”(测试模式)验证失败时,请立即通过单击“完成确定”尝试使用新卡或现有卡,但这不会创建新的订阅。只有在您出于某种原因编写了代码才能这样做。是的,它确实创建了订阅。因为我已设置了试用结束参数,在3d弹出窗口时立即创建订阅