【发布时间】:2019-08-05 12:59:12
【问题描述】:
我正在使用Stripe Checkout Beta 构建一个Rails 应用程序。为此,我在服务器上创建了一个Stripe::Checkout::Session,在前端使用redirectToCheckout,然后等待带有checkout_beta.session_succeeded 类型的webhook 告诉我付款已完成。这工作正常,但是:
对于每次付款,Stripe 都会创建一个新客户——这不是我想要的。如果现有客户第二次付款,Stripe 不应创建新客户,新付款应与现有客户关联。
如何在重定向到 Checkout 之前设置客户 ID?
这是我的 Ruby 控制器代码:
# app/controllers/payments_controller.rb
def new
@session = Stripe::Checkout::Session.create(
success_url: "https://shop.example.test/success",
cancel_url: "https://shop.example.test/cancelled",
payment_method_types: ["card"],
line_items: cart_items.map do |cart_item|
{
name: cart_item.name,
quantity: 1,
amount: cart_item.name.price.cents,
currency: 'eur'
}
end,
customer_email: current_user.email
)
end
HTML 代码(使用 Slim):
# app/views/payments/new.html.slim
= content_tag :div, nil, data: { \
controller: 'stripe',
stripe_public_key: ENV['STRIPE_PUBLIC_KEY'],
stripe_session_id: @session.id }
JavaScript 代码(使用 Stimulus.js):
// app/javascripts/controllers/stripe_controller.js
import { Controller } from 'stimulus'
export default class extends Controller {
connect() {
this.stripe = window.Stripe(this.data.get('public-key'), {
betas: ['checkout_beta_4']
})
this.stripe.redirectToCheckout({
paymentIntentId: this.data.get('session-id')
}).then((result) => {
console.log(result)
})
}
}
Ruby webhook 代码(使用 gem stripe_event):
# config/initializer/stripe.rb
Stripe.api_key = Rails.configuration.x.stripe.private_key
Stripe.api_version = '2019-02-19; checkout_sessions_beta=v4'
StripeEvent.signing_secret = Rails.configuration.x.stripe.webhook_secret
class RecordSessions
def call(event)
session = event.data.object
Payment.create!(
stripe_charge_token: session.payment_intent
)
end
end
StripeEvent.configure do |events|
events.subscribe 'checkout_beta.session_succeeded', RecordSessions.new
end
【问题讨论】:
-
目前这是不可能的,按照设计,会话总是会创建一个新客户,但随着测试版的进展和 Stripe 添加新功能,这可能会非常很快发生变化。
标签: ruby-on-rails stripe-payments