@frigear-nu/ stripe (英语)
用于 friger 生态系统的核心花纹管. 拥有 SDK, 用户 <- > 条纹客户链接和单一 已校验, 等同于其它模块( 订阅、 支付、...) 所订阅的 。 没有产品 逻辑本身.
设置
export default defineNuxtConfig({
modules: ['@nuxthub/core', '@frigear-nu/users', '@frigear-nu/stripe'],
hub: { db: { dialect: 'sqlite', driver: 'libsql' }, kv: true }, // kv is required (webhook idempotency)
stripe: { settings: { webhookPath: '/api/stripe/webhook' } }, // optional, this is the default
})
unstorage 必须由主机应用程序(NuxtHub KV需要它)解决.
环境变量:
| 变量 | 目的 |
|---|---|
NUXT_STRIPE_SECRET_KEY | 条纹密钥( O)runtimeConfig.stripe.secretKey(中文(简体) ) |
NUXT_STRIPE_WEBHOOK_SECRET | Webhook 签名秘密( Namewhsec_...(中文(简体) ) |
NUXT_STRIPE_API_VERSION | 可选的覆盖, 默认为被锁定 2026-09-30.endive |
NUXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | 可公布的密钥( E)runtimeConfig.public.stripe.publishableKey(中文(简体) ) |
数据库
扩展 users 带有无效的表格 stripe_customer_id 栏。 在主机应用中生成并实现迁移.
服务器 utils( 自动导入于硝基)
useStripe()- Frede SDK,使用取取的HTTP客户端(Cloudflare Workers相容).ensureStripeCustomer(userId)- 返回用户的 Streape 客户端 ID: 存储 id, 或者通过电子邮件进行 Streape 搜索, 或者一个新的客户端( 持久性) .getStripeCustomerUser(customerId)- 条纹客户身份的本地用户行,或null。 。 。 .
网页
POST /api/stripe/webhook 读取生体,验证签名(constructEventAsync + 亚晶体,并
发送到处理者。 被处理的事件ID被存储在NuxtHub KV中长达7天,因此重复被忽略. 如果有的话
处理器抛出,其他仍然运行,响应是500(Stripe retrits),事件没有被标记处理 -
处理者必须是一能的. 硝基钩 stripe:event 每一次事件都会被发射.
订阅事件
从一个模块( 构建时间, 捆绑到服务器中 - 没有运行时间扫描) :
import { registerStripeEventHandler } from '@frigear-nu/stripe/utils'
registerStripeEventHandler(nuxt, {
events: ['customer.subscription.updated', 'checkout.session.completed'], // or '*'
handler: resolver.resolve('./runtime/server/stripe/subscription-events'),
order: 100, // optional, lower runs first
})
// runtime/server/stripe/subscription-events.ts
import { defineStripeEventHandler } from '@frigear-nu/stripe/utils'
export default defineStripeEventHandler<'customer.subscription.updated' | 'checkout.session.completed'>(
async (event, { stripe, userId, event: h3Event }) => {
// `event` is narrowed by `event.type`; `userId` is null for unknown customers
},
)
从主机应用程序的 Nitro 插件 :
export default defineNitroPlugin(() => {
onStripeEvent('invoice.payment_failed', (event, ctx) => { /* ... */ })
})