Javascript 条带发票项目不总是在一张发票中一起发送
发送带有一个发票项目的发票效果很好,但是当我尝试发送带有多个发票项目的发票时,事情会变得有点棘手 有时会正确发送多张发票,但通常发票中缺少一个发票项,但下一张发票中包含get。或者,有时我会收到一条错误消息:Javascript 条带发票项目不总是在一张发票中一起发送,javascript,node.js,stripe-payments,Javascript,Node.js,Stripe Payments,发送带有一个发票项目的发票效果很好,但是当我尝试发送带有多个发票项目的发票时,事情会变得有点棘手 有时会正确发送多张发票,但通常发票中缺少一个发票项,但下一张发票中包含get。或者,有时我会收到一条错误消息:错误:无需为客户开具发票,甚至还以为我刚刚运行了stripe.invoiceItems.create。还有其他人遇到过这个问题吗 要创建多个发票项目,我有如下逻辑: await req.body.items.map(item => { const unitAmount =
错误:无需为客户开具发票
,甚至还以为我刚刚运行了stripe.invoiceItems.create
。还有其他人遇到过这个问题吗
要创建多个发票项目,我有如下逻辑:
await req.body.items.map(item => {
const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
stripe.invoiceItems.create({
unit_amount: unitAmount,
currency: 'usd',
customer: stripe_cus_id,
description: item.description,
quantity: item.quantity
}, function(err, invoiceItem) {
if(err) {
console.error(err);
} else {
console.log(`CREATED: ${item.description}`);
}
});
});
然后我发送发票,如下所示:
const invoice = await stripe.invoices.create({
customer: stripe_cus_id,
billing: 'send_invoice',
days_until_due: 15
});
我认为预期的行为是,发票项目被添加到客户的未来发票中,而不是当前发票 我不确定这是否是您希望的行为,但排除这种可能性,我会首先尝试检索客户即将开具的发票。我用3个发票项目(1+2+3)进行了尝试,接下来的发票中的总金额为6
我发现将
wait
与Array.prototype.map
一起使用存在问题。
信中说:
问题是await
后面的值是Array.prototype.map
,这不是承诺。这导致wait
过早解析
我找到了解决这个问题的办法。用承诺包装我的地图。所有的都解决了这个问题,就像这样:
await Promise.all(
req.body.items.map(item => {
return new Promise(function( resolve, reject) {
const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
stripe.invoiceItems.create({
unit_amount: unitAmount,
currency: 'usd',
customer: stripe_cus_id,
description: item.description,
quantity: item.quantity
}, {
idempotency_key: uuidv4()
}, function(err, invoiceItem) {
if(err) {
console.error(err);
reject(err);
} else {
console.log(`CREATED: ${item.description}`);
resolve();
}
});
})
})
);
在尝试创建发票之前,是否确定已创建发票项?我想这是唯一的可能。如果您通过电子邮件发送到,他们的团队可以与您一起查看日志,以查看是否发生了某种时间问题。谢谢。我会发电子邮件给你。是的,我确信它是被创建的,因为我得到了一个带有invoice item对象的响应。在Stripe Dashboard的customer页面上,它还显示了待定的发票项目。有时它只是没有包含在发票中……是的,基本问题是stripe.invoiceItems.create是一个非同步调用,您的原始代码在调用invoice.create之前并没有等待它完成(即使wait使它看起来像是)。
await Promise.all(
req.body.items.map(item => {
return new Promise(function( resolve, reject) {
const unitAmount = (item.wholesale_price + (item.shipping_amount/item.quantity) + (item.s_h/item.quantity));
stripe.invoiceItems.create({
unit_amount: unitAmount,
currency: 'usd',
customer: stripe_cus_id,
description: item.description,
quantity: item.quantity
}, {
idempotency_key: uuidv4()
}, function(err, invoiceItem) {
if(err) {
console.error(err);
reject(err);
} else {
console.log(`CREATED: ${item.description}`);
resolve();
}
});
})
})
);