Как создать и клиента, и карточку в одном действии с Stripe?

Я пытаюсь инициализировать клиента в первый раз. У меня есть форма, где они подписываются и все такое, и они ее отправляют. На клиенте происходит следующее:

var cardValues = AutoForm.getFormValues('credit-card-form').insertDoc;
Stripe.createToken(cardValues, function (err, token) {
  if (!err && token) {
    Meteor.call('Stripe.initializeCustomer', token);
  }
});

На стороне сервера я пытаюсь сделать что-то вроде этого:

Meteor.methods({
  'Stripe.initializeCustomer': function (token) {
    var Stripe = StripeAPI(process.env.STRIPE_KEY);
    // some validation here that nobody cares about
    Stripe.customers.create({
      source: token
    }).then(function (customer) {
      return Stripe.customers.createCard(customer.id, {
        source: token
      })
    }).catch(function (error) {
      // need to do something here
    })
  }
});

Казалось бы, Stripe API это не нравится

Ошибка необработанного отказа: вы не можете использовать токен Stripe более одного раза

Есть ли канонический способ сделать несколько запросов на чередование на сервере для одного токена?


person corvid    schedule 19.05.2015    source источник
comment
Похоже, вы передаете весь словарь токенов, хотя я думаю, что таким образом вы должны передавать идентификатор токена только при создании клиента.   -  person hybrdthry911    schedule 20.05.2015


Ответы (1)


Похоже, вы столкнулись с этой проблемой, потому что вы случайно пытаетесь повторно использовать токен для создания новой карты для клиента, когда вы, не зная об этом, уже использовали этот токен для создания этой карты для этого пользователя. Создать клиента с сохраненной карточкой на самом деле намного проще, чем вы ожидаете: когда вы инициализируете объект клиента с помощью токена, Stripe API сохраняет эту карту вместе с новым клиентом. То есть вы можете сразу пойти дальше и выставить счет своему клиенту при создании, как в:

Stripe.customers.create({
  source: token.id
}).then(function (customer) {
    Stripe.charge.create({
       amount: 1000,
       currency: 'usd',
       customer: customer.id 
    });
});

Для получения дополнительной информации я рекомендую документы Stripe по адресу https://support.stripe.com/questions/can-i-save-a-card-and-charge-it-later и https://stripe.com/docs/api/node#create_customer.

Дайте мне знать, если это решит вашу проблему!

person agentcoops    schedule 20.05.2015
comment
Не знал, что он автоматически добавил карту пользователю, это было намного проще, чем я думал. Безопасно ли сохранять объект клиента в коллекции только на стороне сервера? - person corvid; 21.05.2015
comment
Да, совершенно безопасно хранить все, что возвращается из API, любым удобным для вас способом. На самом деле злоумышленник не может ничего сделать с клиентом Stripe или даже с идентификатором карты без доступа к закрытому API-ключу вашей учетной записи. - person agentcoops; 21.05.2015