代码之家  ›  专栏  ›  技术社区  ›  Fefe

STRIPE Checkout会话Invoice:session.voice在响应对象中为null,而我在STRIPE.Checkout.sessions.create中启用了Invoice_creation

  •  0
  • Fefe  · 技术社区  · 1 年前

    即使我在请求对象中启用了invoice_creation,签出会话响应的发票id也是空的。它以前有效,我可以得到这个id,但现在我得到了一个空值。我需要这个发票id,以便客户下载PDF格式的发票。

    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]:回应@泰山评论:

    现在,我将检索到的请求放在Checkout会话完成后,加载成功页面后:

    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();
        }
        

    我得到了会话的相同空值响应。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 log

    retrievedSession是会话的id

    1 回复  |  直到 1 年前
        1
  •  0
  •   Tarzan    1 年前

    在签出会话完成之前,不会创建发票。您似乎正在尝试在创建时访问发票字段。这是意料之中的结果。

    编辑: 我认为你正面临某种种族状况。让我解释一下:

    通常情况下,发票的创建是异步进行的,在结账会话完全完成之前(发票已创建并分配给结账会话),您的客户将被重定向到成功页面。一个快速的解决方案是设置一个webhook端点来侦听 checkout.session.completed 。这是一个非常好的做法,原因有几个

    1. 如前所述,这是完成结账订单的最佳方式 here
    2. 通过这样做,您将能够 wait 直到 checkout.session.completed 已发送到您的webhook端点,然后将客户重定向到您的成功页面,此时应填充发票。

    在一个单独但也相关的注释中,具有 retrievedSession 作为全局变量是一个糟糕的想法,出于并发的原因,您根本不应该使用它。相反,您应该使用签出会话ID passed 转到您的成功页面。

        2
  •  0
  •   Fefe    1 年前

    要完成@Tarzan的回答,以便检索一些您想要的有用信息,如发票链接,您需要设置一个网络挂钩,当您转到“https://dashboard.stripe.com/test/webhooks“,他们向你解释了如何设置端点以及创建Webhook的方式。我不知道为什么,但我以前不需要Webhook,而且它很有效,但现在我认为这是获得一些默认响应流中没有显示的信息的唯一方法。如果你想了解更多关于我将他们的node-js解释转换为deno-oak的详细信息,请告诉我