Stripe,用户无法下载他们的发票
Posted
技术标签:
【中文标题】Stripe,用户无法下载他们的发票【英文标题】:Stripe, users can not download their invoice 【发布时间】:2018-10-26 06:16:28 【问题描述】:我正在使用 Stripe 支付网关,到目前为止一切正常,除了我的用户可以在我的网站上下载他们的发票的选项。可以在条带仪表板内下载发票,但这不是我需要的。在我的用户付款后,他们应该能够将他们的发票下载到我的系统中。
目前我正在使用条纹 webhook。用户付款,数据保存在我的数据库中。这就是我的代码的样子:
\Stripe\Stripe::setApiKey("$stripe_secret_key_test");
// Retrieve the request's body and parse it as JSON:
$input = @file_get_contents('php://input');
$event_json = json_decode($input);
// Update database with new billing entry
if ($event_json->type == 'invoice.payment_succeeded')
$invoice_id = $event_json->data->object->id;
$customer = $event_json->data->object->customer;
$date = $event_json->data->object->date;
$price = $event_json->data->object->amount_paid;
$user = $event_json->data->object->lines->data[0]->metadata->userid;
$stripe_sub_id = $event_json->data->object->lines->data[0]->id;
$plan_id = $event_json->data->object->lines->data[0]->plan->id;
$stamp_created = $event_json->data->object->lines->data[0]->plan->created;
$comments = $event_json->data->object->lines->data[0]->plan->nickname;
$period_start = $event_json->data->object->lines->data[0]->period->start;
$period_end = $event_json->data->object->lines->data[0]->period->end;
$content=array("invoice"=>$invoice_id,
"user"=>$user,
"stripe_cust_id"=>$customer,
"stripe_sub_id"=>$stripe_sub_id,
"idea_id"=>0,
"billing_date"=>$date,
"plan"=>$plan_id,
"price"=>$price,
"stamp_created"=>$stamp_created,
"period_start"=>$period_start,
"period_end"=>$period_end,
"status"=>'paid',
"printed"=>0);
insertGWInfo('billing',$content);
$content=array("user"=>$user,
"trans_time"=>date("Y-m-d H:i:s"),
"ip"=>$_SERVER['REMOTE_ADDR'],
"trans_type"=>1,
"cash_amount"=>$price,
"comments"=>"Subscription for ".$comments."",
"idea_id"=>0);
insertGWInfo('user_accounting',$content);
现在我创建了一个表,我从数据库中获取这些条目并将它们显示给我的客户。我现在想要一个带有“下载发票”的按钮,我的客户可以在其中下载每月显示的订阅发票。
知道我该怎么做吗?我有 invoice_id,但在哪里可以获取下载发票的 URL?我无法在条纹文档中找到任何内容。任何帮助将不胜感激。
编辑: 下面是 invoice.payment_suceeded 的 JSON 结果:
"
"created": 1326853478,
"livemode": false,
"id": "evt_00000000000000",
"type": "invoice.payment_succeeded",
"object": "event",
"request": null,
"pending_webhooks": 1,
"api_version": "2018-02-28",
"data":
"object":
"id": "in_00000000000000",
"object": "invoice",
"amount_due": 1000,
"amount_paid": 1000,
"amount_remaining": 0,
"application_fee": null,
"attempt_count": 1,
"attempted": true,
"billing": "charge_automatically",
"charge": "_00000000000000",
"closed": true,
"currency": "eur",
"customer": "cus_00000000000000",
"date": 1526455801,
"description": null,
"discount": null,
"due_date": null,
"ending_balance": 0,
"forgiven": false,
"lines":
"data": [
"id": "sub_Cs4DUPJKcAJ7cg",
"object": "line_item",
"amount": 1000,
"currency": "eur",
"description": "1 standard-inv × Standard Investor (at €10.00 / month)",
"discountable": true,
"livemode": false,
"metadata":
,
"period":
"end": 1531726201,
"start": 1529134201
,
"plan":
"id": "3",
"object": "plan",
"aggregate_usage": null,
"amount": 1000,
"billing_scheme": "per_unit",
"created": 1526375755,
"currency": "eur",
"interval": "month",
"interval_count": 1,
"livemode": false,
"metadata":
,
"nickname": "Standard Plan for Investors",
"product": "prod_CrihTVfgRHgImD",
"tiers": null,
"tiers_mode": null,
"transform_usage": null,
"trial_period_days": null,
"usage_type": "licensed"
,
"proration": false,
"quantity": 1,
"subscription": null,
"subscription_item": "si_Cs4DrvYN2FlCbS",
"type": "subscription"
],
"has_more": false,
"object": "list",
"url": "/v1/invoices/in_1CSK5FDsOByhb3e8m8Z1BooY/lines"
,
"livemode": false,
"metadata":
,
"next_payment_attempt": null,
"number": "774C629-0001",
"paid": true,
"period_end": 1526455801,
"period_start": 1526455801,
"receipt_number": null,
"starting_balance": 0,
"statement_descriptor": null,
"subscription": "sub_00000000000000",
"subtotal": 1000,
"tax": null,
"tax_percent": null,
"total": 1000,
"webhooks_delivered_at": 1526455810
"
【问题讨论】:
如果您有发票 ID,那么您可以使用\Stripe\Invoice::retrieve("in_InvoideId");
检索它
谢谢你这也是我的想法但是我如何获得正确的下载链接(url)?你知道我的意思吗?
还必须有一个url来下载带有密钥url
的发票
我将 json 的结果添加到我的第一篇文章中,以便您查看我得到的信息。我不确定如何获得正确的下载网址。有什么想法吗?
如果没有任何下载选项,那么您可以将检索发票的内容写入文件并下载该文件。
【参考方案1】:
Stripe 目前不支持通过 API 下载 PDF 格式的发票,它只能在仪表板中使用。
目前,最好的解决方案是构建您自己的发票收据/pdf。您可以通过API 检索Invoice 对象,该对象告诉您发票的用途:期间、金额、付款时间、发票中的内容等。然后您可以为您的客户生成自己的收据你的结局。
【讨论】:
谢谢,这是我需要知道的。希望 Stripe 将在不久的将来提供此功能。【参考方案2】:Stripe 现在支持这个。可通过 API 列出发票并访问发票的 invoice_pdf
属性来获得 PDF 链接。
您可以通过以下方式获取一系列带有 PDF 链接的发票:
const invoicesResponse = await stripe.invoices.list( customer: customerStripeId );
const invoices = invoicesResponse.map(invoice => (
invoiceId: invoice['id'],
pdf: invoice['invoice_pdf'],
));
return invoices;
这里是 API 文档: https://stripe.com/docs/api/invoices/object#invoice_object-invoice_pdf 感谢@avelis 的建议。
【讨论】:
显示发票 PDF 响应属性的 API 文档的链接。 stripe.com/docs/api/invoices/object#invoice_object-invoice_pdf 收据可以这样吗?不同之处在于收据是已付发票。【参考方案3】:这是可能的 :) 就像 Python API 的魅力一样。
import stripe
import requests
stripe_keys = 'secret_key': 'XXXxxxx','publishable_key': 'XXXxxxx'
stripe.api_key = stripe_keys['secret_key']
stripe_subscription_id = 'XXXXXXX'
invoices = stripe.Invoice.list(subscription=stripe_subscription_id)
for inv in invoices:
pdf = inv.invoice_pdf
invoice_file = requests.get(pdf)
open('C://User//XXXXX//Desktop//invoice.pdf', 'wb').write(invoice_file.content)
【讨论】:
【参考方案4】:现在有一个更简单的方法。以下是我使用 Stripe 的默认方法下载发票 pdf 所遵循的步骤。
找到我要为其下载 pdf 格式发票的客户
常量 findCustomerByEmail = 异步(电子邮件) => 尝试 const 客户 = 等待 stripe.customers.list( 电子邮件, 限制:1, ); if (customer.data.length !== 0) 返回customer.data[0].id; 抓住 (e) 返回(e); ;现在我有了客户,然后我找到用户的所有发票:
export.getInvoices = async (req, res, next) => const cusStripeId = 等待 findCustomerByEmail(req.user.email); const invoices = await stripe.invoices.list( 限制:3000, 客户:cusStripeId, ); res.status(httpStatus.OK).json(发票); ;现在我有了这个用户的发票清单。我可以遍历所有的发票。
invoices.data[0].invoice_pdf
invoices 对象是一个数组,data[0].invoice_pdf 有一个下载 pdf 的链接。作为替代方案,我们也可以将发票视为 html 页面,无需下载,如下所示。
invoices.data[0].hosted_invoice_url
【讨论】:
以上是关于Stripe,用户无法下载他们的发票的主要内容,如果未能解决你的问题,请参考以下文章