我有一系列客户,我想要以条带形式批量收费。有时由于网络原因,有些费用不会通过,而有些则因此再次向新客户收取费用。我读到我可以使用幂等性但注意到每次我发出请求时密钥都会重新生成。如何生成密钥以识别每个用户而不将密钥存储在数据库中,因为它是一个临时密钥?
for(customer in customers){
stripe.charges.create({
amount: 2000,
currency: "usd",
source: token,
customer: stripe_customerId,
}, {
idempotency_key: uuid
}, function(err, charge) {
// asynchronously called
});
}
对此有任何想法吗?
答案 0 :(得分:2)
首先,您可能不希望对此类异步代码执行for
循环;如果您有n
个客户收费,您会同时发出n
个请求,这可能会导致一系列问题。
其次,您使用的是用于从条带标记创建一次性费用的费用代码,而不是create a Charge from a Customer。
假设您确实已经保存了客户ID,那么您可能希望考虑使用类似async的内容。
我会使用#queue
来处理它,我会按如下方式拆分:
对客户进行迭代,并为每个客户创建一个“任务”,其中包含customer
ID,amount
,currency
,新生成的{{ 1}}和idempotency_key
,然后将该任务推送到队列中;
在队列'处理'功能中,我会尝试使用该任务及其数据创建一个Charge,如果由于网络或其他可重试错误而失败,我会增加attempt_count
并推送它返回队列,以便可以重试。我可能还有一个测试来限制重试次数,并跳过/记录任何失败的,即5次。