Я хочу, чтобы Stripe проверял, существует ли клиент, и если да, связывал его с сеансом оформления заказа.
class OrdersController < ApplicationController
@session = Stripe::Checkout::Session.create(
payment_method_types: ['card'],
shipping_address_collection: {
allowed_countries: ['GB']
},
customer_email: current_user.email,
line_items: line_items_order,
success_url: new_order_message_url(@order),
cancel_url: order_url(@order)
)
if @user.stripe_id != nil
Stripe::Customer.retrieve(@user.stripe_id)
@session.customer = customer.id
@session.customer_email =customer.email
else
customer = Stripe::Customer.create({
email: current_user.email,
name: current_user.username,
metadata: {
},
})
@user.stripe_id = customer.id
@user.save
end
@order.checkout_session_id = @session.id
@order.save
end
Я проверил с помощью byebug и увидел, что Stripe::Customer.retrieve(@user.stripe_id) работает, Stripe API может найти нужного клиента, но по-прежнему создает нового клиента для каждой сессии оформления заказа. Я прочитал документацию об объектах сеансов и обнаружил, что об атрибуте клиента:
атрибут клиента: Идентификатор клиента для этого сеанса. Для сеансов Checkout в режиме оплаты или подписки Checkout создаст новый объект клиента на основе информации, предоставленной в процессе оплаты, если только существующий клиент не был указан при создании сеанса.
Что мне здесь не хватает?
Проблема в том, что вы звоните Stripe::Checkout::Session.create
, не пропуская клиента. Как упоминалось в документе для клиента, его следует передать при создании сеанса, если вы хотите использовать существующего клиента.
строка клиента РАСШИРЯЕМАЯ
Идентификатор клиента для этого сеанса. Для расчетных сессий в в режиме оплаты или подписки Checkout создаст нового клиента объекта на основе информации, предоставленной во время платежного потока, если только существующий клиент был предоставлен при создании сеанса.
Поэтому просто убедитесь, что у вас есть клиент в методе создания
@session = Stripe::Checkout::Session.create(
customer: customer.id
...
)