STRIPE结帐会话发票:响应对象中的session.invoice为空,而我在stripe.checkout.sessions.create中启用了invoice_creation

问题描述 投票:0回答:1
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: lineItems, mode: 'payment', success_url: 'http://localhost:80/OBV/success', cancel_url: 'http://localhost:80/OBV/cancel', invoice_creation: { enabled: true, }, }); const retrievedSession = session.id; console.log('retrieved session : ' + retrievedSession); const sessionInvoice = session.invoice; console.log('session Invoice : ' + sessionInvoice);

这是我在控制台中得到的响应:

enter image description here那么我如何从这个结帐会话中获取此发票 ID?

[编辑1]:回应@Tarzan 评论:

现在我在结帐会话完成后、加载成功页面后放置检索到的请求:

const successPage = async(ctx:any)=>{ try{ const session = await stripe.checkout.sessions.retrieve( retrievedSession ); console.log('session id : ' + session.id); const sessionInvoice = session.invoice; console.log('session Invoice : '+ sessionInvoice); const invoice = await stripe.invoices.retrieve( sessionInvoice ); const invoicePdf = invoice.invoice_pdf; console.log('invoice pdf url : '+ invoicePdf); /* ctx.cookies.set('invoice_pdf', invoicePdf);*/ ctx.render('./OBV/checkout/success.ejs',{Voyant: true, invoiceUrl: 'Empty'}); console.log('success page reached !'); }catch(err) { ctx.response.status = 200; ctx.response.body = { success: false, msg: err.toString() } }finally{ await client.end(); }
我得到了 session.invoice 相同的空值响应,并且此消息显示在我的屏幕上:

enter image description here[编辑2]

const successPage = async(ctx:any)=>{ try{ const session = await stripe.checkout.sessions.retrieve(retrievedSession,{expand: ["invoice"]}); console.log('session invoice : ' + session.invoice); ctx.render('./OBV/checkout/success.ejs',{Voyant: true, invoiceUrl: 'Empty'}); console.log('success page reached !'); }catch(err) { ctx.response.status = 200; ctx.response.body = { success: false, msg: err.toString() } }finally{ await client.end(); } };
日志:

console logretrievedSession 是会话的 id

结帐会话完成之前不会创建发票。您似乎正在尝试在创建时访问发票字段。这是预期的结果。
node.js stripe-payments checkout deno invoice
1个回答
0
投票
编辑: 我认为你面临着某种竞争条件。让我解释一下:

通常,发票创建是异步发生的,在结帐会话完全完成之前(发票已创建并分配给结帐会话),您的客户将被重定向到成功页面。一个快速修复方法是设置一个监听

checkout.session.completed

的 Webhook 端点。这是一个非常好的做法,有几个原因

这是履行结账订单的最佳方式,如

此处
  1. 所述 这样做您将能够等待
  2. 直到
  3. checkout.session.completed 已发送到您的 Webhook 端点,然后再将客户重定向到您的成功页面,此时应填充发票。
    在一个单独但也相关的说明中,将 
  4. retrievedSession
作为全局变量是一个糟糕的主意,出于并发原因,您根本不应该使用它。相反,您应该使用结账会话 ID

passed

 到您的成功页面。

© www.soinside.com 2019 - 2024. All rights reserved.