条纹-一次通话即可创建/检索客户

时间:2018-07-02 22:49:42

标签: stripe-payments stripe.js

是否存在一个条带化API调用,我们可以使用该API来创建用户(如果不存在)并检索新用户?

说我们这样做:

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

即使使用该电子邮件的用户已经存在,它也将始终创建一个新的客户ID。 是否有一种方法仅在用户电子邮件不存在于条带中时创建用户?

我只是想避免出现竞赛条件,在同一时间范围内可能会发生多个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);
   }
 }
])

显然,与同一个服务器请求相比,竞争条件更有可能在两个不同的进程或两个不同的服务器请求中发生,但是您明白了。

4 个答案:

答案 0 :(得分:2)

否,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
    });
}

答案 1 :(得分:1)

正如karllekko的评论所提到的那样,幂等键在这里无法使用,因为它们只能持续24小时。

forall a.在Stripe中不是唯一字段;如果要在应用程序中实现此功能,则需要在应用程序中进行处理-即,您需要存储email,并在那里进行查找,以确定是否应该创建。< / p>

假设您的应用程序中有一个[ email -> Customer ID ]对象,那么无论如何,最好还是在该逻辑中放置该对象,因为您还希望这样做(在这种情况下,每个{{1 }}只有一个Stripe客户,因此可以在其他地方解决。

答案 2 :(得分:0)

如果您的用例就像您不想用相同的电子邮件创建客户两次。

您可以使用条带幂等请求的概念。我用它来避免同一订单重复收费。

您可以将客户电子邮件用作幂等键。条纹在它们的末端处理。具有相同幂等密钥的两个请求将不会被处理两次。

此外,如果您希望将其限制为一个时间范围,请使用客户电子邮件和该时间范围创建一个幂等密钥。它将起作用。

  

API支持幂等性,可以安全地重试请求而无需   意外执行两次相同的操作。例如,如果   由于网络连接错误,创建收费请求失败,   您可以使用相同的幂等密钥重试请求以确保   只会产生一次费用。

您可以阅读有关此here的更多信息。希望对您有帮助

答案 3 :(得分:0)

实际上,可以通过针对存储的db验证stripe的客户数据检索结果来解决。

然后调用另一个API进行创建。

不过,为简单起见,我同意@ user7898461并保证restoreOrCreate客户api:)