Stripe订阅发票API获取手续费始终为0问题求助
问题分析与解决方案
你当前的问题核心是找错了手续费的关联对象:你通过Payment Intent查询的是支付交易的手续费(比如信用卡处理费),但后台看到的「Billing - Usage Fee」是Stripe针对Billing服务收取的平台服务费,这类费用和支付交易的Charge无关,所以从Payment Intent里查不到。
为什么当前代码返回0?
你调用paymentIntents.retrieve获取的是用户支付订单对应的支付意图,其中latest_charge.balance_transaction.fee对应的是支付环节产生的手续费(比如信用卡刷卡费)。而「Billing - Usage Fee」是Stripe单独向你(商家)收取的Billing服务费用,不会包含在支付交易的手续费里,所以这个字段返回0是正常的。
正确获取单条订阅发票的Stripe手续费的方法
要获取对应订阅发票的「Billing - Usage Fee」,需要从**发票(Invoice)或余额交易(Balance Transaction)**入手:
方法1:通过发票关联余额交易
每个订阅发票生成后,对应的Stripe手续费会关联到发票的balance_transaction字段,你可以直接检索发票并展开该字段:
// 1. 先获取目标订阅的所有发票(或直接用已知的发票ID) const invoices = await stripe.invoices.list({ subscription: 'sub_你的订阅ID', expand: ['data.balance_transaction'] }); // 2. 遍历发票,提取手续费 invoices.data.forEach(invoice => { if (invoice.balance_transaction) { const stripeFee = invoice.balance_transaction.fee; const feeDescription = invoice.balance_transaction.description; console.log(`发票${invoice.id}的Stripe手续费:${stripeFee},描述:${feeDescription}`); } });
方法2:直接筛选余额交易
如果你知道手续费的时间或描述,可以直接查询余额交易列表,通过source字段关联到对应的发票:
const balanceTransactions = await stripe.balanceTransactions.list({ type: 'fee', // 筛选手续费类型的交易 description: 'Billing - Usage Fee', // 匹配你后台看到的描述 created: { gte: 1725763200, // 2024-09-08的起始时间戳 lte: 1725849599 // 2024-09-08的结束时间戳 } }); // 遍历交易,关联到发票 balanceTransactions.data.forEach(transaction => { // transaction.source 对应的是发票ID console.log(`手续费${transaction.fee},关联发票:${transaction.source}`); });
补充说明
- Stripe的手续费分为两类:支付交易手续费(和用户支付的Charge绑定)、平台服务手续费(比如Billing、Connect的服务费,单独生成余额交易),两者是分开核算的。
- 如果你需要同时获取支付手续费和Billing服务费,需要分别从Charge的余额交易和发票/单独的余额交易中提取。
内容的提问来源于stack exchange,提问作者Alt_J
相关产品推荐
相关产品推荐

