Stripe client_secret 在重定向 URL 中安全吗?

问题描述 投票:0回答:1

我最近在扫描Stripe文档时注意到这个警告:

您可以使用客户端密码来完成付款过程中指定的付款金额。不要记录它、将其嵌入 URL 或将其公开给客户以外的任何人。确保在任何包含客户端机密的页面上都有 TLS。

自从我第一次集成它以来,我运行的一个网络应用程序一直将客户端密码和支付意图 ID 一起附加到支付确认页面(即重定向 URL),据我所知没有任何修改,所以我'在我读到这个警告之前,我一直认为集成就是这样设计的。

重定向 URL 中的客户端密码安全吗?

php security stripe-payments payment-gateway payment-processing
1个回答
-1
投票

我决定自己回答这个问题,因为我确信我没有改变我最初为集成所遵循的文档中的这种行为,而且确实如此,尽管那些显然没有经验的人过分热心的反对票和评论有问题的 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.

© www.soinside.com 2019 - 2024. All rights reserved.