Stripe - создание / извлечение клиента за один звонок - PullRequest
0 голосов
/ 03 июля 2018

Есть ли вызов API чередования, который мы можем использовать для создания пользователя, если он не существует, и извлечения нового пользователя?

говорят, что мы делаем это:

export const createCustomer = function (email: string) {
  return stripe.customers.create({email});
};

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

Я просто хочу избежать условия гонки , когда в один и тот же период времени может происходить более одного stripe.customers.create({email}) вызова. Например, мы проверяем, существует ли customer.id и не существует, два разных запроса к серверу могут попытаться создать нового клиента.

Вот условие гонки:

const email = 'foo@example.com';

Promise.all([
  stripe.customers.retrieve(email).then(function(user){
   if(!user){
     return stripe.customers.create(email);
   }
  },
 stripe.customers.retrieve(email).then(function(user){
   if(!user){
     return stripe.customers.create(email);
   }
 }
])

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

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

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

let email = "test@example.com";
let existingCustomers = await stripe.customers.list({email : email});
if(existingCustomers.data.length){
    // don't create customer
}else{
    let customer = await stripe.customers.create({
        email : email
    });
}
0 голосов
/ 04 июля 2018

Как отмечается в комментарии Карллекко, Идемпотентные Ключи здесь не будут работать, потому что они работают только 24 часа.

email не уникальное поле в Stripe; если вы хотите реализовать это в своем приложении, вам нужно будет обработать это в своем приложении, т. е. вам нужно будет сохранить [ email -> Customer ID ] s и выполнить поиск там, чтобы решить, следует ли вам создавать или нет.

Если в вашем приложении есть объект user, тогда эта логика в любом случае будет лучше расположена там, поскольку вы также захотите сделать это как часть этого - и в этом случае каждый user будет только есть один клиент Stripe, так что это будет решено в другом месте.

0 голосов
/ 03 июля 2018

Если в вашем случае использования вы не хотите создавать клиента с одним и тем же адресом электронной почты дважды.

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

Вы можете использовать электронную почту клиента в качестве идемпотентного ключа. Полоса обрабатывает это в конце. два запроса с одинаковым идемпотентным ключом не будут обработаны дважды.

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

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

Подробнее об этом можно прочитать здесь . Я надеюсь, что это поможет

...