【问题标题】:Why would Stripe paymentRequest.canMakePayment() fail on Localhost?为什么 Stripe paymentRequest.canMakePayment() 在 Localhost 上会失败?
【发布时间】:2018-03-20 17:43:00
【问题描述】:

我让它在我的生产服务器上工作,但在本地主机上canMakePayment() 返回null

我已经通过缩小的 Stripe 代码跟踪了这一点,但是函数 ko 碰壁了,它只是将一个名为 CAN_MAKE_PAYMENT 的操作发送到某个消息队列,此时执行变得异步,我无法进一步跟踪,直到该请求已通过e.available === false 解决,没有更多信息。

我已经验证了 AP​​I 确实在 localhost 上的 Chrome 中可用(window.PaymentRequest 可用)。我也在本地 https 上运行(虽然没有绿色检查)。

如何追踪导致 Stripe 报告 PaymentRequest 不可用的原因?如果我没有绿色 SSL 检查,Chrome 会拒绝 PaymentRequest 调用吗?如果是这样,我将如何测试这个? Chrome 文档只是说如果 PaymentRequest 可用,那么您可以调用 API。

如果我知道消息队列的处理位置,我可以进一步调试。

【问题讨论】:

  • +1。好问题,@Luke。你想出解决办法了吗? (您在下面的回答并不具体。)我也缺乏绿色 SSL 验证,并且在使用 stackoverflow.com/questions/48969083/… 时遇到了问题如果您让 Stripe 的 canMakePayment() 在本地工作,我会喜欢您的想法!谢谢!
  • 我已经为我的问题增加了一大笔奖金:stackoverflow.com/q/48969083/470749

标签: stripe-payments payment-request-api


【解决方案1】:

Stripe 的支持团队向我确认需要绿色 SSL 验证。

“支付请求按钮的先决条件之一是 付款请求所在的页面必须作为 使用有效证书确保安全。这是双方的要求 生产和开发。”

这是一个实验。在 Chrome 中浏览到 URL 以绿色显示“安全 https:”的站点,例如 https://stackoverflow.com。打开开发者控制台,粘贴这些命令 (from here) 并按 Enter:

const supportedPaymentMethods = [
  {
    supportedMethods: 'basic-card',
  }
];
const paymentDetails = {
  total: {
    label: 'Total',
    amount:{
      currency: 'USD',
      value: 0
    }
  }
};
const options = {};
const request = new PaymentRequest(
  supportedPaymentMethods,
  paymentDetails,
  options
);
request.show();

然后您会看到一个付款请求模式弹出。

但是,如果您浏览到您自己的本地站点,地址栏以 红色 显示“不安全”(并且“https”被划掉),并且如果您尝试运行相同的代码在控制台中,不会弹出付款请求模式(即使您已为域添加了安全例外)。

因此,Chrome(可能还有其他浏览器)显然会阻止 Stripe(以及 Stripe 等其他工具)在连接不完全安全时访问该浏览器功能。

来自 Stripe 的更新:

虽然 Chrome iOS 确实包含 PaymentRequest 实现,但它不允许从 iframe 使用 PaymentRequest,这会阻止 Stripe 的支付请求按钮元素工作。我们正在与 Chrome 团队合作,以在未来的版本中解决此问题。

为了让 Apple Pay 在 iOS 模拟器或测试设备上运行,域必须可公开访问并通过 Stripe 仪表板 (https://dashboard.stripe.com/account/apple_pay) 或 API 进行注册。 https://stripe.com/docs/stripe-js/elements/payment-request-button#verifying-your-domain-with-apple-pay 我们建议使用 ngrok (ngrok.com) 之类的工具来创建一个面向公众的域,该域具有有效的 HTTPS 证书,可以通过隧道连接到您的本地环境。

【讨论】:

  • 确认相同。如果您有一个绿色检查或您在本地主机上,Chrome 将启用付款。然而,Stripe 在“https”的 URL 中添加了一个额外的字符串检查,这违背了 Google 允许 localhost 的决定。唯一的解决方法是修改 Stripe lib 中的那一行(丑陋)或在 localhost 上进行绿色检查。我已请求 Stripe 解决此问题并信任 Google 的安全协议实施。
  • 我现在正面临一个非常有趣的案例。在 iOS(Chrome 或 Safari)上,访问我的本地站点(由于我已将证书安装到我的手机上,该站点对 https 有一个绿色锁),上面的这个 request.show() 代码有效,但 Stripe 的 paymentRequest.canMakePayment() 确实 不是!它返回null。我希望我能用stackoverflow.com/questions/48969083/…apple.stackexchange.com/a/321537/53510 解决所有问题
  • Stripe 的 PaymentRequest 按钮实现依赖于在 iframe 中工作的 PaymentRequest。但是,由于 Chrome iOS 中的错误,PaymentRequest 在按钮的 iframe 中不可用,因此无法在该浏览器中使用。
  • @hpar,哇。这很有帮助,因为当我在stripe.com/docs/stripe-js/elements/… 上阅读“Chrome Mobile”时,我完全没有注意到它不包含 iOS。谢谢。这很糟糕。
  • 顺便说一句,为了让 Ngrok 正常工作,我需要以管理员身份使用 Windows PowerShell:PS C:\code> .\ngrok http -host-header=rewrite mysite.test:80(而不是使用端口 44300 的 xip.io 域)。
【解决方案2】:

绕过 Stripe,我能够验证 Chrome 报告“基本卡”付款方式不受支持。

这需要根据 Google 的文档设置 PaymentRequest 并尝试使用 request.show() 命令。

我猜这与没有绿色 SSL 验证有关,我会尝试修复它。

【讨论】:

  • 如果 Stripe 能够传回实际错误而不是“不可用”,那将很有用。
【解决方案3】:

您应该在 Visual Studio 中启用 SSL 以使用 paymentRequest。

Enable SSL in Visual Studio

【讨论】:

  • 这个问题和visual studio代码有什么关系?一次都没被提及...
猜你喜欢
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2016-04-11
  • 2021-10-10
  • 2013-01-19
相关资源
最近更新 更多