Ugrás a tartalomra
kassza

Node.js, Express, NestJS

A kassza webhook-kezelői Web-szabványos (Request) => Promise<Response> függvények. Next.js, Hono, Cloudflare Workers, Bun és Deno alatt ezek közvetlenül használhatók. Express, NestJS és Fastify alatt a kassza/node adapter köti be őket.

server.ts
import express from 'express'
import { toNodeHandler } from 'kassza/node'
import { stripeWebhook } from 'kassza/payments/stripe'

const app = express()

app.post(
  '/webhooks/stripe',
  toNodeHandler(
    stripeWebhook({
      secret: process.env.STRIPE_WEBHOOK_SECRET ?? '',
      onPayment: (payment) => kassza.issueForPayment(payment, { vat: 27 }),
    }),
  ),
)

app.use(express.json())

A toNodeHandler a kérést folyamként adja tovább, így a kezelők saját méretkorlátja (például 1 MB a fizetési webhookoknál) a beolvasás közben érvényesül. A query string is átmegy, ami a Barion callbackhez kell.

OpcióJelentés
trustProxytrue esetén az x-forwarded-proto és x-forwarded-host fejlécből állítja össze az URL-t. Csak akkor kapcsold be, ha a proxyd írja ezeket.
onErrorA váratlan hibák naplózása (alapból a konzol). Express next esetén a hiba oda megy.

NestJS#

main.ts
const app = await NestFactory.create(AppModule, { rawBody: true })
webhook.controller.ts
import { Controller, Post, Req, Res } from '@nestjs/common'
import type { Request, Response } from 'express'
import { toNodeHandler } from 'kassza/node'
import { stripeWebhook } from 'kassza/payments/stripe'

const handler = toNodeHandler(stripeWebhook({ secret: process.env.STRIPE_WEBHOOK_SECRET ?? '', onPayment }))

@Controller('webhooks')
export class WebhookController {
  @Post('stripe')
  stripe(@Req() request: Request, @Res() response: Response): Promise<void> {
    return handler(request, response)
  }
}

A rawBody: true miatt a NestJS a request.rawBody-ban megőrzi a nyers törzset, és a toNodeHandler azt használja.

Fastify#

import { toWebRequest } from 'kassza/node'
import { stripeWebhook } from 'kassza/payments/stripe'

const webhook = stripeWebhook({ secret: process.env.STRIPE_WEBHOOK_SECRET ?? '', onPayment })

fastify.addContentTypeParser('*', { parseAs: 'buffer' }, (_request, body, done) => done(null, body))

fastify.post('/webhooks/stripe', async (request, reply) => {
  const response = await webhook(
    toWebRequest({ method: request.method, url: request.url, headers: request.headers, body: request.body }),
  )
  reply.status(response.status).send(Buffer.from(await response.arrayBuffer()))
})

Fastify alatt a toWebRequest() és a Web-szabványos kezelő közvetlen hívása a legegyszerűbb: a nyers Buffer törzset adod át, a választ pedig a reply-ra írod.

Oldal szerkesztéseUtoljára frissítve: