我最近在扫描Stripe文档时注意到这个警告:
您可以使用客户端密码来完成付款过程中指定的付款金额。不要记录它、将其嵌入 URL 或将其公开给客户以外的任何人。确保在任何包含客户端机密的页面上都有 TLS。
自从我第一次集成它以来,我运行的一个网络应用程序一直将客户端密码和支付意图 ID 一起附加到支付确认页面(即重定向 URL),据我所知没有任何修改,所以我'在我读到这个警告之前,我一直认为集成就是这样设计的。
重定向 URL 中的客户端密码安全吗?
我决定自己回答这个问题,因为我确信我没有改变我最初为集成所遵循的文档中的这种行为,而且确实如此,尽管那些显然没有经验的人过分热心的反对票和评论有问题的 Stripe 集成,这种方法当时是并且仍然是 Stripe 文档的主要集成部分推荐的官方方法:
确保 return_url 对应于您网站上提供付款状态的页面。当 Stripe 将客户重定向到 return_url 时,我们提供以下 URL 查询参数:
payment_intent: PaymentIntent 的唯一标识符
payment_intent_client_secret: PaymentIntent 对象的客户端秘密...
使用其中一个查询参数来检索 PaymentIntent。检查 PaymentIntent 的状态以决定向您的客户展示什么。您还可以在提供 return_url 时附加自己的查询参数,该参数在重定向过程中持续存在。
然后使用以下代码演示此方法:
// Initialize Stripe.js using your publishable key
const stripe = Stripe('pk_test_***');
// Retrieve the "payment_intent_client_secret" query parameter appended to
// your return_url by Stripe.js
const clientSecret = new URLSearchParams(window.location.search).get(
'payment_intent_client_secret'
);
// Retrieve the PaymentIntent
stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => {
const message = document.querySelector('#message')
// Inspect the PaymentIntent `status` to indicate the status of the payment
// to your customer.
//
// Some payment methods will [immediately succeed or fail][0] upon
// confirmation, while others will first enter a `processing` state.
//
// [0]: https://stripe.com/docs/payments/payment-methods#payment-notification
switch (paymentIntent.status) {
case 'succeeded':
message.innerText = 'Success! Payment received.';
break;
case 'processing':
message.innerText = "Payment processing. We'll update you when payment is received.";
break;
case 'requires_payment_method':
message.innerText = 'Payment failed. Please try another payment method.';
// Redirect your user back to your payment page to attempt collecting
// payment again
break;
default:
message.innerText = 'Something went wrong.';
break;
}
这证实了我的怀疑,顾名思义,
client_secret
旨在在客户端(即刚刚付款的用户)看到,并且关于将其嵌入 URL 的一般语言 不适用于返回 URL.