有没有更安全的方法可以同时使用 Stripe 和 ActiveMerchant? Ruby on Rails

Posted

技术标签:

【中文标题】有没有更安全的方法可以同时使用 Stripe 和 ActiveMerchant? Ruby on Rails【英文标题】:Is there a safer way to use Stripe and ActiveMerchant together? Ruby on Rails 【发布时间】:2019-06-17 08:19:47 【问题描述】:

我正在尝试在我的 rails 应用程序中使用 Stripe 进行付款。我记得在我的一次实习中,我们使用active merchant gem 通过网关来抽象流程。虽然,在实习期间,我们使用了 Authorize.net。我们没有使用条纹。对于这个特定的应用程序,我想同时使用 Stripe 和 ActiveMerchant。

查看 Active Merchant GitHub 页面上的文档,我发现我可以使用 Active Merchant gem 提供的 StripeGateway 连接到 Stripe。我就是这样做的:

ActiveMerchant::Billing::Base.mode = :test

# Create a new credit card object
credit_card = ActiveMerchant::Billing::CreditCard.new(
  :number     => '4242424242424242',
  :month      => '8',
  :year       => '2022',
  :first_name => 'Tobias',
  :last_name  => 'Luetke',
  :verification_value  => '123'
)

if credit_card.valid?
  gateway = ActiveMerchant::Billing::StripeGateway.new(
    login: Rails.application.credentials.development[:stripe_private_key]
  )

  # Authorize for $10 dollars (1000 cents)
  response = gateway.authorize(1000, credit_card)

  if response.success?
    # Capture the money
    gateway.capture(1000, response.authorization)
  else
    raise StandardError, response.message
  end
end

但是,这是一个问题。每当我运行它时,我都会收到一个奇怪的错误:

StandardError (Sending credit card numbers directly to the Stripe API is generally unsafe. We suggest you use test tokens that map to the test card you are using, see https://stripe.com/docs/testing.)

我知道这是一个安全问题,但我不知道如何使用 Active Merchant 修复它。我尝试使用 Stripe 的 ruby​​ on rails 文档,但形式非常简单。它只有信用卡号、到期数据、CVC 条目以及电子邮件。但我也需要一个帐单地址。这是我使用 Active Merchant 的原因。它使用起来非常简单,并且在仍然能够创建自定义表单的同时抽象出很多绒毛。但是,我在使用 Stripe 时不断收到此错误,我不知道如何修复它。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

使用 Stripe 网关,ActiveMerchant 的 purchaseauthorize 方法应该采用您在上面传递的卡片对象或令牌值(字符串)

#   purchase(money, card_hash_or_token,  ... )

https://github.com/activemerchant/active_merchant/blob/master/lib/active_merchant/billing/gateways/stripe.rb#L96

对于PCI compliance reasons,您可以使用Stripe 的Checkout 或Elements 库在客户端创建一个令牌,而不是传递原始卡详细信息,将源/令牌ID 传递给您的后端(它应该看起来像tok_xxxyyyzzz 或 src_xxxyyyyz),然后将该值传递给您的授权请求的第二个 card_hash_or_token 参数。

response = gateway.authorize(1000, params[:stripeToken])

【讨论】:

hmm,好吧,这种带走了灵活性。我不想存储信用卡信息,但我确实想存储帐单地址以便运送物品。但是,如果整个表单由 Checkout 或 Elements 等 javascript 库处理,我就无法做到这一点。这个 javascript 库有点混淆了对 rails 关注的需求,对吧?我需要将信息存储在我的后端,而不是 Stripe 上。 您仍然可以轻松存储账单/运输信息;在您的前端表单上包括地址等的 字段。是的,在使用 Stripe 创建令牌时将它们传递(创建令牌调用的第二个参数,stripe.com/docs/stripe-js/reference#stripe-create-token),但也将它们传递到您的后端表单提交并存储它们。不幸的是,PCI 的当前需求/状态意味着,如果您完全自己接触卡,那么合规性就会有真正的负担。【参考方案2】:

https://dashboard.stripe.com/account/integration/settings

直接处理卡信息 我们强烈反对将卡片信息直接传递给 Stripe 的 API,因为这意味着您的集成正在直接处理敏感的卡片信息。了解更多。 (https://stripe.com/docs/security#validating-pci-compliance)

我不建议您这样做,但这是让 ActiveMerchant 以您希望的方式工作并消除该错误的方式。它大大提高了您需要处理的 PCI 合规性。

【讨论】:

以上是关于有没有更安全的方法可以同时使用 Stripe 和 ActiveMerchant? Ruby on Rails的主要内容,如果未能解决你的问题,请参考以下文章

Stripe 可以同时向客户对象收费和转账吗?

Stripe - 支付订单错误:无法向没有活动卡的客户收费

Stripe 定期支付与 masterpass 集成

Laravel Stripe Cashier 删除客户

使用 Express & Stripe 保护交易

我可以在不使用 Stripe Card Element 的情况下使用 Stripe api