如何在Node.js的Stripe Checkout Session中正确传递metadata参数?
问题根因
你当前代码里设置的metadata是属于Checkout Session对象的,并没有绑定到Stripe的Customer实体上,你打印的是Stripe返回的Customer对象,自然看不到你设置的metadata值。你自己代码里定义的customer变量只是本地存储请求参数的临时对象,和Stripe接口返回的Customer实体完全是两个独立的对象。
修复方案
根据你的实际需求选择对应方案即可:
方案1:需要将metadata存储到Stripe Customer对象中
你需要先创建/更新Stripe Customer实体,将metadata写入到Customer的配置里,再在创建Checkout Session时关联该Customer ID:
app.get('/create-checkout-session', async (req, res) => { let requestParams = { price: req.query.price, quantity: req.query.quantity, page: req.query.page, email: req.query.email, name: req.query.name } let successurl = 'http://localhost:1111/' + requestParams.page let failedurl = 'http://localhost:1111/' + requestParams.page // 第一步:先创建Stripe Customer,写入需要的metadata const stripeCustomer = await stripe.customers.create({ email: requestParams.email, name: requestParams.name, metadata: { 'description': requestParams.page } }) // 第二步:创建Checkout Session时关联上述Customer ID const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], customer: stripeCustomer.id, // 替换原来的customer_email参数 line_items: [ { price_data: { currency: 'cad', product_data: { name: requestParams.page, }, unit_amount: requestParams.price, }, quantity: requestParams.quantity, }, ], mode: 'payment', success_url: successurl, cancel_url: failedurl, }) res.redirect(303, session.url); });
修改后你再查询Stripe Customer实体,就能看到metadata里的对应字段。
方案2:仅需要给Checkout Session附加metadata
你当前的代码逻辑已经正确,只是查询位置错误:
- 你可以直接打印创建完成的
session.metadata查看设置的description值 - 如果你需要在支付完成后拿到该metadata,可以在
checkout.session.completed或者payment_intent.succeeded的webhook事件回调中,从事件对象里的Checkout Session字段提取metadata - 如果需要将Session的metadata同步到Customer,可以在webhook回调中调用
stripe.customers.update方法,将metadata写入对应Customer实体
注意事项
- Stripe所有对象的metadata值仅支持字符串类型,如果传入数字、布尔值等其他类型会被自动转换为字符串
- 单个metadata键的长度不超过40字符,值的长度不超过500字符
内容的提问来源于stack exchange,提问作者gianlps
相关产品推荐
相关产品推荐

