Stripe Payments добавляет источник платежа / карту / метод с использованием NodeJS / Vue

#javascript #node.js #stripe-payments

#javascript #node.js #stripe-платежи

Вопрос:

Я создаю простое приложение SaaS с повторяющимися платежами, используя NodeJS с Express для API и Vue для пользовательского интерфейса. У меня есть код, написанный для добавления клиента и привязки подписки и плана, а также нескольких других процедур. Мы разрешаем пользователям регистрироваться без ввода способа оплаты, поэтому теперь мне нужно добавить способ для пользователя добавить способ оплаты. Я просмотрел так много документации, что у меня голова идет кругом, и поддержка Stripe (или ее отсутствие) не помогла.

Я перепробовал все, начиная с createSource, createToken и createPaymentMethod в пользовательском интерфейсе, а затем отправил это в API, где я пробовал использовать все, начиная с stripeapi.customers.createSource и заканчивая stripe.PaymentMethod.create, и ничего не работает. Все возвращает ошибку о том, что либо что-то отсутствует в объекте, либо объект неверен. Я попытался взглянуть на API платежных намерений, однако это кажется излишним, чтобы просто добавить карту клиенту.

Вот мой последний код.

Пользовательский интерфейс: создать элемент

 this.stripe = await loadStripe('pk_test_');
let stripeElem = this.stripe.elements();

this.card = stripeElem.create('card', { hideIcon: true, hidePostalCode: false, style: { base: { color: '#363636', fontSize: '22px', fontSmoothing: 'antialiased' }}});
this.card.mount(this.$refs.card);
  

Пользовательский интерфейс: отправить в API

 await this.stripe.createSource(this.card, { type: 'card' } ).then((source) => {
  this.$http.post(`/api/route`, source).then((response) => {
    if (response.status === 200) {

    } else {

    }
  }).catch(() => {

  });
  

API

 await stripeapi.customers.createSource(customer_id, { source: card });
  

Этот код создает этот объект:

 { source:
   { id: 'src_1HLFsEDfvqoM1TxYXmFvlcK9',
     object: 'source',
     amount: null,
     card:
      { exp_month: 1,
        exp_year: 2022,
        last4: '4242',
        country: 'US',
        brand: 'Visa',
        address_zip_check: 'unchecked',
        cvc_check: 'unchecked',
        funding: 'credit',
        three_d_secure: 'optional',
        name: null,
        address_line1_check: null,
        tokenization_method: null,
        dynamic_last4: null },
     client_secret: 'src_client_secret_VILuqM6ZikLzp9nMq4gizfN8',
     created: 1598653002,
     currency: null,
     flow: 'none',
     livemode: false,
     metadata: {},
     owner:
      { address: [Object],
        email: null,
        name: null,
        phone: null,
        verified_address: null,
        verified_email: null,
        verified_name: null,
        verified_phone: null },
     statement_descriptor: null,
     status: 'chargeable',
     type: 'card',
     usage: 'reusable' } }
  

Этот код и объект приводят к этой ошибке:

 (node:352976) UnhandledPromiseRejectionWarning: Error: The source hash must include an 'object' key indicating what type of source to create.
    at Function.generate (/data/api/node_modules/stripe/lib/Error.js:39:16)
    at IncomingMessage.res.once (/data/api/docroot/node_modules/stripe/lib/StripeResource.js:190:33)
    at Object.onceWrapper (events.js:286:20)
    at IncomingMessage.emit (events.js:203:15)
    at IncomingMessage.EventEmitter.emit (domain.js:448:20)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  

Все, что я хочу сделать, это взять элемент, создать источник / метод оплаты (как бы он ни назывался), а затем связать его с клиентом. Любая помощь приветствуется. Я просмотрел так много примеров, но у меня ничего не сработало. Кажется, что все выдает ошибку об объекте или что-то еще.

Ответ №1:

После нескольких часов разработки я наконец понял это! Ссылка на API сильно отсутствует, но в этой статье объясняется, что делать:https://stripe.com/docs/payments/save-card-without-authentication

По сути, вы создаете и монтируете элемент. Затем вы используете createPaymentMethod в пользовательском интерфейсе и передаете ему элемент card. Оттуда вы отправляете paymentMethod.id строку в свой API, а затем используете strip.paymentMethods.attach для прикрепления ее к клиенту, передавая paymentMethod.id идентификатор клиента Stripe.

Интерфейс HTML

 <div ref="card" class="credit-card"></div>
  

Создать и смонтировать интерфейс

 this.stripe = await loadStripe('pk_test_YOURKEY');
let stripeElem = this.stripe.elements();

this.card = stripeElem.create('card', { hideIcon: true, hidePostalCode: false, style: { base: { color: '#363636', fontSize: '22px', fontSmoothing: 'antialiased' }}});
this.card.mount(this.$refs.card);
  

Интерфейс создает способ оплаты и отправляет на серверную часть

 await this.stripe.createPaymentMethod({ type: 'card', card: this.card }).then((method) => {
  this.$http.post(`/users/billing/cards`, { id: method.paymentMethod.id }).then((response) => {

  }).catch(() => {

  });
}).catch(() => {

});
  

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

Ответ №2:

Сообщение об ошибке NodeJS гласит:

Хэш источника должен включать ключ ‘object’, указывающий, какой тип источника создавать.

Его также можно найти здесь, но я не уверен, если это не поддельное сообщение об ошибке. Если это действительно должно применяться, это было бы object: 'card' вместо object: 'source' ; но я так не думаю.


С Stripe иногда есть более одного способа что-то сделать:

source Определенно должен быть сгенерированный на стороне клиента токен карты,
но на стороне вашего клиента нет кода, который бы маркировал карту.

Для справки, они должны быть объединены:

Комментарии:

1.Спасибо за ваш ответ. Я действительно пытался создать токен, но я все еще получаю ошибки.pb.elasty.co/?8b212a0a979984de#DH lGyEI91G AVFzmd /… pb.elasty.co/… Кроме того, я видел, что URL показывает ошибку, но мне не нужно было изменять object напрямую. Я использую элементы Stripe по назначению, а затем я попытался создать токен и создать источник, а затем передать оба из них в API, но они оба потерпели неудачу.

2. API-интерфейсы просто не работают вместе. В этом коде я пытаюсь использовать поток setupIntent, но когда я передаю результат из createPaymentMethod, я сталкиваюсь с ошибкой. pb.elasty.co/?4424be9c4ba1343d#C7Ur2ClpHMHDjUlWvDm5cltSz/cnJWC1 /…

3. Не все из них всегда можно объединить. SetupIntent может использоваться для подтверждения кредитных карт, например. автоматические платежи (думаю, для этого требовалась цена, если я правильно помню). Манипулирование любым из возвращаемых объектов в любом случае не требуется… наиболее запутанным в этом является то, что некоторые части API нельзя использовать без аудита соответствия PCI. Компаниям с небольшим оборотом приходится использовать Elements JS; откуда можно получить токен, который затем можно снова добавить на стороне сервера.