调用Stripe退款API返回receipt_number为null,如何给用户发退款凭证?
Stripe的receipt_number字段不会在退款创建完成后立刻返回,只有当退款对应的邮件回执已经生成/发送后,该字段才会被填充有效值,默认创建退款时该字段为null属于正常现象。
以下是三种可行的解决方案:
方案1:开启Stripe自动发送退款邮件配置
操作路径:进入Stripe后台,依次打开「设置」-「付款设置」-「客户通信」板块,开启「退款成功时向客户发送邮件」选项。开启后创建退款时Stripe会自动生成回执邮件并发送给用户,你可以在退款创建后通过stripe.refunds.retrieve(退款ID)接口主动查询最新退款信息,或者监听refund.updatedwebhook事件,待回执生成后即可获取到非空的receipt_number字段。
示例代码:// 创建退款 const refund = await stripe.refunds.create({ charge: payment.strip.chargeId, amount: refundAmount * 100, }); // 监听refund.updated事件或者延迟后查询 const updatedRefund = await stripe.refunds.retrieve(refund.id); const receiptNumber = updatedRefund.receipt_number;方案2:手动触发退款回执生成
如果你不需要Stripe自动发送所有退款邮件,仅需要针对当前退款获取回执编号,可以手动调用回执发送接口,触发回执生成后再查询即可获取receipt_number:
示例代码:// 手动触发退款回执发送 await stripe.refunds.sendReceipt(refund.id); // 查询最新退款信息获取回执编号 const updatedRefund = await stripe.refunds.retrieve(refund.id);方案3:直接使用退款唯一ID作为凭证编号
退款返回结果中的id字段(示例中为re_3K0N3qGRxQkYXSuu2S7aM0jl)是Stripe全局唯一的退款标识,可直接作为退款凭证编号展示给用户,该ID在Stripe后台可直接检索到对应退款记录,完全满足用户核对交易的需求,不需要额外获取receipt_number。
*注意:所有涉及receipt_number获取的操作都需要注意异步延迟,不要在退款创建的同步返回中直接读取该字段,优先使用refund.updated webhook事件触发后续凭证发送逻辑,稳定性高于主动轮询。
内容的提问来源于stack exchange,提问作者Rafiq

