Stripe Checkout Beta: избегайте создания новых клиентов для каждого платежа - PullRequest
1 голос
/ 14 марта 2019

Я создаю приложение Rails, используя Stripe Checkout Beta . Для этого я создаю Stripe::Checkout::Session на сервере, использую redirectToCheckout на внешнем интерфейсе, а затем жду, пока придет веб-крюк с типом checkout_beta.session_succeeded, сообщающий, что платеж выполнен. Это отлично работает, но:

Для каждого платежа Stripe создает нового клиента - это не то, что я хочу. Если существующий клиент платит второй раз, Stripe не должна создавать нового клиента, новый платеж должен быть связан с существующим клиентом.

Как я могу установить идентификатор клиента перед тем, как перенаправить на Checkout?

Вот мой 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 (с использованием гема 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

...