有没有更安全的方法可以同时使用 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 的 purchase
和 authorize
方法应该采用您在上面传递的卡片对象或令牌值(字符串)
# 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的主要内容,如果未能解决你的问题,请参考以下文章