如何通过Stripe按指定条件收费并生成支付详情PDF
问题解答
一、自定义金额收费并传入产品相关参数
要实现自定义总金额收费,同时记录Product ID、Price ID和数量,推荐使用Stripe Checkout Session(无需前端处理敏感支付信息,更安全),具体步骤如下:
1. 后端核心逻辑
用户在前端选好数量点击「立即支付」后,前端将quantity传给后端,后端执行以下操作:
- 用自有算法计算折扣后的总金额(转换为Stripe要求的最小货币单位,比如25美元需转为2500美分)
- 创建Checkout Session,关键配置示例(Node.js):
const stripe = require('stripe')('你的API秘钥'); const session = await stripe.checkout.sessions.create({ mode: 'payment', payment_method_types: ['card'], line_items: [ // 原产品项:关联已有的固定Price ID和用户选择的数量,展示原价明细 { price: '你的10美元Price ID', quantity: 用户选择的数量, }, // 折扣项:用提前创建的「折扣产品」生成负数金额项,抵消原价实现自定义总金额 { price_data: { currency: 'usd', product: '你在Stripe后台创建的折扣产品ID', unit_amount: -折扣金额(美分), // 比如折扣5美元填-500 }, quantity: 1, }, ], // 存入需要留存的参数,后续可通过API或Dashboard查询 metadata: { product_id: '你的目标产品ID', original_price_id: '你的10美元Price ID', quantity: 用户选择的数量, }, success_url: '支付成功后的跳转URL', cancel_url: '支付取消后的跳转URL', }); - 将生成的
session.url返回给前端,前端跳转该URL完成支付。
2. 简化方案(无需展示折扣明细)
如果不需要在支付页面显示原价和折扣,仅需直接收取自定义总金额并记录参数:
const session = await stripe.checkout.sessions.create({ mode: 'payment', payment_method_types: ['card'], line_items: [ { price_data: { currency: 'usd', product: '你的目标产品ID', unit_amount: 自定义总金额(美分), // 比如2500 }, quantity: 1, }, ], metadata: { original_price_id: '你的10美元Price ID', actual_quantity: 用户选择的数量, }, success_url: '...', cancel_url: '...', });
二、生成支付详情PDF
Stripe支持生成标准支付详情PDF,需通过「发票(Invoice)」功能实现,具体流程:
1. 监听支付完成事件
配置Stripe Webhook监听checkout.session.completed事件,支付成功后触发后续逻辑。
2. 创建发票并生成PDF
在Webhook处理函数中,生成关联该支付的发票并获取PDF链接:
// Webhook中处理支付完成事件 const session = event.data.object; // 创建客户(若之前未关联) const customer = await stripe.customers.create({ email: session.customer_details.email, }); // 创建发票,还原产品、数量、折扣明细 const invoice = await stripe.invoices.create({ customer: customer.id, collection_method: 'send_invoice', days_until_due: 0, line_items: [ { price: '你的10美元Price ID', quantity: session.metadata.quantity, }, { price_data: { currency: 'usd', product: '折扣产品ID', unit_amount: -折扣金额(美分), }, quantity: 1, }, ], }); // 获取发票PDF链接 const invoiceDetail = await stripe.invoices.retrieve(invoice.id, { expand: ['invoice_pdf'], }); // invoiceDetail.invoice_pdf 即为PDF的可访问URL,可下载存储或直接提供给用户
3. 补充说明
- 生成的PDF包含发票编号、客户信息、产品明细、总金额等完整支付记录,符合财务合规要求。
- 手动场景可在Stripe Dashboard找到对应支付记录,关联发票后直接下载PDF;自动化场景建议用API实现。
内容的提问来源于stack exchange,提问作者user24602006
相关产品推荐
相关产品推荐

