如何实现条带幂等键

Hop*_*pez 3 javascript node.js stripe-payments

我有一系列客户,我想对其进行批量收费。有时由于网络的原因,有些费用没有通过,而有些则因此提出新的请求再次向所有客户收费。我读到我可以使用幂等性,但注意到每次发出请求时密钥都会重新生成。我如何实现生成密钥来识别每个用户而不将密钥存储在数据库中,因为它是一个临时密钥?

 for(customer in customers){
     stripe.charges.create({
        amount: 2000,
        currency: "usd",
        source: token,
        customer: stripe_customerId,
    }, {
       idempotency_key: uuid
    }, function(err, charge) {
        // asynchronously called
    });
}
Run Code Online (Sandbox Code Playgroud)

请对此有任何想法吗?

flo*_*mas 6

首先,您可能不想为这样的for异步代码执行循环;如果您有n客户要收费,您将n同时提出请求,这可能会导致一系列问题。

其次,您使用的 Charge 代码旨在从 Stripe 令牌创建一次性 Charge,而不是从 Customer 创建 Charge

假设您实际上已经保存了客户 ID,您可能需要考虑使用async 之类的东西。

我会使用 来处理它#queue,我会按如下方式拆分:

  1. 迭代客户,并为每个客户创建一个“任务”,其中包括customerID、amountcurrency、 新生成的idempotency_keyattempt_count,然后将该任务推送到队列中;

  2. 在队列“处理”功能中,我会尝试使用该任务及其数据创建一个 Charge,如果由于网络或其他可重试错误而失败,我会增加attempt_count并将其推回队列,以便可以重试。我可能还会有一个测试来限制重试次数,并跳过/记录任何失败的次数,即 5 次。