Создайте омниканальный опыт покупок с помощью Stripe Terminal на Node.js

Недавно мой коллега Чарльз Уоткинс написал серию вводных статей из 4 частей о Stripe Terminal, нашем платежном решении для физических лиц. Из статей Чарльза вы узнаете, как настроить и зарегистрировать устройство Terminal и создать приложение для приема или отмены платежей. Давайте сделаем еще один шаг вперед и рассмотрим дополнительную функцию: сохранение данных карты через устройство Terminal для будущего повторного использования в Интернете.
Эта функция может улучшить общий опыт ваших клиентов, упростив процесс оформления заказа.

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

Создание или извлечение клиента

В Stripe, для того чтобы метод оплаты мог быть использован более одного раза, он должен быть привязан к объекту клиента, поэтому первым шагом в этом процессе является создание или извлечение клиента.

Создание нового клиента

Создать клиента можно с помощью следующего кода:

// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = require('stripe')('your-API-key');
const customer = await stripe.customers.create();
Войти в полноэкранный режим Выйти из полноэкранного режима

Это создаст стандартный объект customer; однако, если вы хотите назначить определенные свойства, вы можете сделать это, передав их в метод create.

// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = require('stripe')('your-API-key');
const customer = await stripe.customers.create({
     name: "Hedy Lamarr",
     email: "hedy@lamarr.com",
     description:
       "Patented radio frequency hopping, the basis for Wi-Fi, GPS and Bluetooth",
});
Войти в полноэкранный режим Выход из полноэкранного режима

Получение клиента

Если ваш клиент уже существует, вы можете получить его с помощью метода retrieve и передать ему идентификатор клиента, начинающийся с cus_:

// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = require('stripe')('your-API-key');
const customer = await stripe.customers.retrieve("cus_xxx");
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы не знаете ID клиента, вы можете найти его, например, с помощью метода search:

const customers = await stripe.customers.search({
    query: 'name:'Hedy Lamarr'', 'email:'hedy@lamarr.com''
});
Войти в полноэкранный режим Выйти из полноэкранного режима

В результате будет возвращен объект, содержащий массив клиентов, соответствующих запросу. Далее вы можете просмотреть этот массив, найти своего клиента и его ID.
Получив объект клиента, вы можете перейти к сохранению данных его карты.

Прикрепление данных карты к клиенту

Сначала необходимо создать SetupIntent, который будет собирать и записывать согласие клиента на сохранение данных его карты. Это позволит авторизовать метод оплаты в банке клиента, поэтому в будущем аутентификация не потребуется.

const intent = await stripe.setupIntents.create({
   payment_method_types: ["card_present"],
   customer: customer.id,
});
Вход в полноэкранный режим Выход из полноэкранного режима

Затем необходимо вызвать метод processSetupIntent на считывателе, чтобы получить метод оплаты и прикрепить его к клиенту. Вам нужно передать ему ID считывателя, а также объект, содержащий ID намерения установки и свойство customer_consent_collected, установленное в булево значение.
При тестировании вы можете установить значение true, однако при внедрении решения на уровне производства обязательно адаптируйте процесс оформления заказа, чтобы получить согласие клиента. Например, если у вас есть пользовательский UI, вы можете обновить его для сбора согласия и отправки значения true или false обратно на ваш сервер перед продолжением.

const reader = await stripe.terminal.readers.processSetupIntent(
     "tmr_xxx",
     {
       setup_intent: intent.id,
       customer_consent_collected: true,
     }
);
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы не знаете ID своего терминала, вы можете узнать его с помощью следующего кода:

const readers = await stripe.terminal.readers.list();
Вход в полноэкранный режим Выйти из полноэкранного режима

Это вернет объект, содержащий массив зарегистрированных вами терминалов.

{
 object: 'list',
 data: [
   {
     id: 'tmr_xxx',
     object: 'terminal.reader',
     action: null,
     device_sw_version: '2.6.2.0',
     device_type: 'bbpos_wisepos_e',
     ip_address: '192.000.0.00',
     label: 'my-terminal',
     livemode: false,
     location: 'tml_xxx',
     metadata: {},
     serial_number: 'WSCxxx',
     status: 'online'
   }
 ],
 has_more: false,
 url: '/v1/terminal/readers'
}
Ввести полноэкранный режим Выйти из полноэкранного режима

Каждый терминал связан с местоположением. Через приборную панель Stripe вы можете добавить метаданные к местоположению, чтобы упростить фильтрацию списка устройств. Например, вы можете добавить объект метаданных с парой ключ-значение {"прием": 1} и отфильтровать список объектов терминала, чтобы вернуть только тот, который содержит {"прием": 1} в своих метаданных. Отсюда вы сможете найти идентификатор устройства, начинающийся с «tmr_».

Когда вызывается метод processSetupIntent, дисплей терминала обновляется, ожидая, пока клиент вставит, коснется или проведет картой.

Наконец, если вы хотите проверить, что метод оплаты был успешно привязан к клиенту, вы можете вызвать listPaymentMethods.

const paymentMethods = await stripe.customers.listPaymentMethods(
     customer.id,
     { type: "card" }
);
Вход в полноэкранный режим Выйти из полноэкранного режима

Это вернет объект, содержащий массив методов оплаты, прикрепленных к данному клиенту.
Вуаля! Данные карты вашего клиента теперь сохранены для повторного использования в Интернете без взимания с него платы!

Сохранение карты после оплаты

При сборе платежей с помощью Terminal вам необходимо создать PaymentIntent, используя paymentIntents.create. По умолчанию он не сохраняет данные карты. Вы можете изменить поведение по умолчанию, передав дополнительные свойства paymentMethod и setup_future_usage.

const paymentIntent = await stripe.paymentIntents.create({
 payment_method_types: ['card'],
 amount: 1099,
 currency: 'usd',
 customer: customer.id,
 payment_method: paymentMethods[0].id,
 setup_future_usage: 'off_session',
});
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь вы должны быть в состоянии обновить свой поток оформления заказа, чтобы сохранить данные карты без списания средств или после оплаты, чтобы ваши клиенты могли легко использовать их повторно в Интернете.

Сообщите нам, если вы внедряете это, и следите за обновлениями разработчиков Stripe на следующих платформах:

📣 Следите за @StripeDev и нашей командой в Twitter
📺 Подпишитесь на наш канал Youtube
💬 Присоединяйтесь к официальному серверу Discord
📧 Подпишитесь на Dev Digest

Об авторе

Чарли Джерард — представитель разработчиков в Stripe, креативный технолог и эксперт Google Developer Expert. Она любит исследовать и экспериментировать с технологиями. Когда она не занимается кодингом, ей нравится проводить время на свежем воздухе, пробовать новые сорта пива и читать.

Оцените статью
devanswers.ru
Добавить комментарий