Stripe Payment Element无法加载已保存支付详情问题求助
问题:Stripe Payment Element无法加载已保存的卡片详情
已在Stripe端将Visa支付方式设置为allow_redisplay="always",但尝试将已保存的支付详情加载至Payment Element时始终失败。Payment Element可正常渲染,但未填充已保存的卡片信息,相关代码如下:
后端C#代码
// controller action code SetupIntentService setupIntentService = new(); var setupIntent = await setupIntentService.CreateAsync(new() { Customer = customerId, Usage = "off_session", PaymentMethodTypes = ["card"], PaymentMethod = "pm_paymentMethodId" }); var service = new EphemeralKeyService(); var ephemeralKey = await service.CreateAsync(new EphemeralKeyCreateOptions { Customer = customerId, }); return Json(new { ApiKey = publishableKey, EphemeralKey = ephemeralKey.Secret, setupIntent.ClientSecret, CustomerId = customerId, }, JsonRequestBehavior.AllowGet, false, true);
前端JavaScript代码
loadStripe(data.apiKey) .then(stripe => { if (!stripe) return; const elements = stripe.elements({ clientSecret: data.clientSecret, customerOptions: { customer: data.customerId, ephemeralKey: data.ephemeralKey } }); const paymentElement = elements.create('payment', { layout: "auto" }); paymentElement?.mount('#payment-element'); });
可能遗漏的配置及修复方案
1. Ephemeral Key未指定API版本
创建临时密钥(Ephemeral Key)时必须指定与当前Stripe SDK匹配的API版本,否则会导致权限不足无法读取客户支付方法信息。修改后端代码:
var ephemeralKey = await service.CreateAsync(new EphemeralKeyCreateOptions { Customer = customerId, }, new RequestOptions { ApiVersion = "2024-06-20" }); // 替换为你的SDK对应的API版本
2. Payment Element未配置默认支付方式
需要明确告知Payment Element加载客户的已保存支付方式,可通过设置defaultPaymentMethod参数实现:
const paymentElement = elements.create('payment', { layout: "auto", defaultPaymentMethod: "auto" // 自动加载客户的默认支付方式,或直接指定支付方法ID如"pm_paymentMethodId" });
3. SetupIntent参数错误
创建SetupIntent时指定了PaymentMethod参数会绑定到特定支付方法,限制了Payment Element加载客户所有已保存支付方式的能力。移除该参数,让SetupIntent关联客户即可:
var setupIntent = await setupIntentService.CreateAsync(new() { Customer = customerId, Usage = "off_session", PaymentMethodTypes = ["card"], // 移除PaymentMethod = "pm_paymentMethodId" });
4. 验证支付方法状态
确认目标支付方法pm_paymentMethodId已正确关联到该客户,状态为active,且allow_redisplay确实设置为always(可在Stripe后台查看支付方法详情)。
内容的提问来源于stack exchange,提问作者Gagan
相关产品推荐
相关产品推荐

