Как произвести разовую оплату (без пользовательского интерфейса) за повторное использование сохраненного клиента после первоначального оформления заказа?

Я внедряю платежи с помощью Stripe и столкнулся с проблемой, которую не знаю, как решить. Я хотел бы знать правильный или рекомендуемый способ.

Сценарий

  • Первый платеж с помощью пользовательского интерфейса: Пользователь переходит на мой интерфейс, я использую обычный процесс оформления заказа. Полоса показывает форму карточки, клиент платит, я сохраняю идентификатор клиента.

  • Дополнительные платежи (без пользовательского интерфейса): После этого первого платежа во внешнем интерфейсе у меня есть кнопки “дополнительная покупка” (например, заплатить 20 долларов за еще одну консультацию), но в этом случае я не хочу, чтобы пользователь снова вводил данные карты или просматривал форму Stripe. Просто нажмите и оплатите (один клик, не подписка, а повторная разовая оплата).

Моя проблема:

  1. Когда я создаю клиента в Stripe, я вижу, что значение payment_method равно null. Я пытаюсь создать новый PaymentIntent для начисления, но для этого нужен payment_method.

  2. ChatGPT говорит, что я должен получить идентификатор PaymentMethod, но я не знаю, как это сделать. Когда я пытаюсь указать способы оплаты клиента, он пуст .

  3. Если я попытаюсь повторно использовать идентификатор PaymentMethod из первого платежа, Stripe сообщит, что я не могу использовать его снова.

  4. Я не знаю, то ли я делаю что-то не так, то ли действительно невозможно снова списать деньги, не запрашивая данные карты.

  5. Как мне связать карту или способ оплаты с клиентом, чтобы позже я мог списать с него деньги без пользовательского интерфейса, просто из серверной части, без каких-либо данных о карте?

Соответствующий код

# Django DRF, backend
@api_view(['POST'])
def create_payment(request):
    session = StripeSingleton().checkout.Session.create(
        success_url=f'{settings.STRIPE_SUCCESS_URL}?session_id={{CHECKOUT_SESSION_ID}}',
        line_items=[{'price': 'price_XXXX', 'quantity': 1}],
        mode='payment',
    )
    return Response({'success_url': session['url']}, status=200)

# Validation
@api_view(['GET'])
def validate_payment(request):
    session_id = request.GET.get('session_id')
    session = StripeSingleton().checkout.Session.retrieve(session_id)
    # Here I save the customer_id and email

Тогда за дополнительную плату я попробую:

payment_intent = stripe.PaymentIntent.create(
    amount=2000,  # 20 pesos in cents
    currency='mxn',
    customer=customer_id,
    payment_method=payment_method_id, # I try to reuse this from the first charge
    off_session=True,
    confirm=True,
    description="Extra advice - one-off charge",
)

Но Stripe выдает ошибку: вы не можете использовать метод оплаты, который уже использовался. И если я попытаюсь перечислить способы оплаты клиента, он будет пустым или нулевым.

Когда вы создаете сеанс оформления заказа для первого платежа, вам необходимо настроить автоматическое сохранение данных карты в результирующем объекте клиента. Это делается с помощью параметра payment_intent_data[setup_future_usage] . Документально это описано здесь.

Если вы настроите это, к полученному клиенту автоматически будет привязан метод оплаты (pm_1234), который вы затем сможете использовать для будущих платежей. Вы можете найти идентификатор PaymentMethod, просмотрев, например, свойство payment_method в PaymentIntent, связанном с сеансом оформления заказа.

Вернуться на верх