[英]STRIPE - Creating Subscription with trial, implementing one-time authentication fails for 3D secure cards after trial ends
大家好,标题几乎说明了一切,试用期结束时我遇到了 3d 安全卡的问题。
重现步骤:节点(服务器):
const customer = await this.getInstance().customers.create({ email: userData.email, name: userData.fullname, });
const subscription = await this.getInstance().subscriptions.create({ customer, items: [ { price: priceId, }, ], off_session: true, promotion_code, payment_behavior: 'default_incomplete', expand: ['latest_invoice.payment_intent', 'pending_setup_intent'], metadata, trial_from_plan: true, });
const invoice = subscription.latest_invoice as Stripe.Invoice; const intentType = subscription.pending_setup_intent ? 'setup' : 'payment'; const intent = intentType === 'payment' ? (invoice.payment_intent as Stripe.PaymentIntent) : (subscription.pending_setup_intent as Stripe.SetupIntent); const formattedSubscription = pick(subscription,['cancel_at_period_end','cancel_at','canceled_at']); return { intentType, ...pick(intent, ['id', 'client_secret', 'status']), ...formattedSubscription, };
从 CLINET 方面:
const response = await this.$pricesService.buyPlan(this.selectedPlan.id, { fullname: this.nameOnTheCard, email: this.email, hash: this.couponApplied?.hash, }); if (response.error) { throw new Error(response.error); }
const { intentSecret, intentID, intentType, ...restOfBuyResponse } = response;
if (intentType === 'payment') { stripeResponse = await StripeInstance.confirmCardPayment(intentSecret, { payment_method: { card: this.$refs.cardElement.$refs.element._element }, }); } else { stripeResponse = await StripeInstance.confirmCardSetup(intentSecret, { payment_method: { card: this.$refs.cardElement.$refs.element._element }, }); }
一切正常,直到下一点。
为了尽可能快地测试跟踪模式,我制作了 API 以从订阅中删除试用版
const subscription = await this.getInstance().subscriptions.update(subscriptionId, { trial_end: 'now', });
之后,发票过期,订阅失败(切换到挂起)。 我注意到 default_payment_method 不存在,所以我什至从前端返回了设置意图付款方式,并附加到客户,甚至发票设置。 但无论我修改了什么,新的发票和付款意向都从未使用过这些信息。
这是由于某些规定导致的预期行为还是我遗漏了什么?
默认情况下,创建和更新订阅都被视为会话请求,因此卡需要身份验证。
如果这纯粹是为了测试目的,您可以包含off_session=true
。
const subscription = await this.getInstance().subscriptions.update(subscriptionId, {
trial_end: 'now',
off_session : true
});
如果您让订阅试用结束并自然进行(无需调用 API 来更新订阅),您会看到不会请求 3DS(使用以 3155 结尾的卡)。
您可以通过创建一个将trial_end
设置为最近的可能时间的订阅来尝试这一点。 如果您不想等待 1 小时自动完成,您可以调用 API 来完成并支付发票。
const subscription = await stripe.subscriptions.create({
customer: 'cus_FfkjLYmWcepurw',
items: [
{price: 'price_1JXgRCJQtHgRImA7fDIHY4B2'},
],
trial_end : 1634536700
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.