【问题标题】:Stripe Checkout Beta: Avoid creating new customer for every paymentStripe Checkout Beta:避免为每次付款创建新客户
【发布时间】: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


【解决方案1】:

Stripe::Checkout::Session.create 的 API 允许添加引用 Stripe 客户 ID 的 customer 键。这样,付款就会添加到您现有的客户中。

您可以为 Checkout 指定一个现有的客户对象,以便在何时使用 进行一次性付款或订阅。如果你这样做,任何条纹 Checkout 创建的对象与该客户相关联。

session = Stripe::Checkout::Session.create(
  customer: 'cus_123',
  payment_method_types: ['card'],
  line_items: [{
    name: 'T-shirt',
    description: 'Comfortable cotton t-shirt',
    images: ['https://example.com/t-shirt.png'],
    amount: 500,
    currency: 'eur',
    quantity: 1,
  }],
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
)

见:https://stripe.com/docs/payments/checkout/server#using-existing-customers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2019-12-31
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多