Удерживающая карта Stripe Intent API и затем зарядка не работает - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь реализовать довольно простой процесс для моего продукта:

  1. Клиент добавляет карту на свой счет

  2. Клиент делаетзапрос -> Создать удержание на его карточке по цене запроса

  3. По запросу доставлено -> Выполнить начальное удержание, сделанное на карточке

После прочтения множества документов по новому Intent API от Stripe это казалось довольно простым.

A. Создайте клиента Stripe

stripe.customers.create({ email: user.email, description: Customer за $ {user.email} });

B. Прикрепите карту (способ оплаты) к клиенту, создайте setup intent с этой картой, чтобы разрешить будущие расходы

stripe.setupIntents.create({ 'customer': customer_id, 'payment_method': paymentMethodId });

C. По запросу клиента создайте paymentIntent с capture_method, установленным в manual

const paymentIntent = await stripe.paymentIntents.create({
    'amount': price * 100, //convert shekels to agorot
    'currency': 'ILS',
    'customer': customer_id,
    'payment_method': payment_method,
    'payment_method_types': ['card'],
    'capture_method': 'manual'
});

D. По запросу доставлено просто capture оригинал paymentIntent, созданный на шаге C.

const captureHoldIntent = await stripe.paymentIntents.capture(paymentIntentId);

Проблема, которую я получаю на самом деле, возникает между шагами C и D:

Не удалось сохранить транзакцию для user_id. Ошибка KAJSD92. Ошибка: не удалось зафиксировать этот PaymentIntent, поскольку он имеет статус require_confirmation. Может быть захвачен только PaymentIntent с одним из следующих статусов: require_capture.

Хотя я понимаю это сообщение об ошибке, я путаюсь с тем, почему paymentIntent, созданный на шаге C, не изменяется настатус requires_capture и вместо него всегда require_confirmation, даже если он уже подтвержден?

1 Ответ

1 голос
/ 16 октября 2019

Недостающий кусок звонил paymentIntents.confirm, чтобы «подтвердить», что служба действительно хочет удержать карту. После этого статус намерений был изменен на requires_capture, что позволило мне вызвать метод capture.

  1. Создать
const paymentIntent = await stripe.paymentIntents.create({
            'amount': price * 100, //convert shekels to agorot
            'currency': 'ILS',
            'customer': customer_id,
            'payment_method': payment_method,
            'payment_method_types': ['card'],
            'capture_method': 'manual'
        });
Подтвердите

const confirmPaymentIntent = await stripe.paymentIntents.confirm(intentId);

Захват

const captureHoldIntent = await stripe.paymentIntents.capture(intentId);

...