Skip to main content
Adaptor @dodopayments/fastify menyediakan tiga handler rute untuk aplikasi Fastify Anda: Checkout mengembalikan URL checkout, CustomerPortal mengarahkan customer ke Customer Portal, dan Webhooks memverifikasi request webhook serta memanggil event handler Anda.

Checkout Handler

Buat payment link dan checkout session dari aplikasi Fastify Anda.

Customer Portal

Izinkan customer mengelola subscription dan detail mereka.

Webhooks

Verifikasi dan proses event webhook Dodo Payments.

Instalasi

1

Install the Package

Jalankan perintah berikut di root project Anda:
Paket ini memerlukan Fastify 5.4.0 atau yang lebih baru.
2

Set Up Environment Variables

Buat file .env di root project Anda:
Buat API key di Developer → API Keys. Tambahkan endpoint webhook Anda di Developer → Webhooks dan salin signing secret-nya ke DODO_PAYMENTS_WEBHOOK_KEY. Selama pengembangan, gunakan API key test mode dengan DODO_PAYMENTS_ENVIRONMENT=test_mode, karena key test mode hanya berfungsi dengan test mode. DODO_PAYMENTS_RETURN_URL bersifat opsional.
Jangan pernah melakukan commit file .env atau secret ke version control.

Contoh Handler Rute

Contoh berikut mendaftarkan rute pada instance Fastify yang dibuat dengan Fastify(). Rute webhook memerlukan raw request body, sehingga contohnya menambahkan string body parser di dalam plugin yang hanya berisi rute webhook.
Gunakan handler ini untuk mengintegrasikan checkout Dodo Payments ke aplikasi Fastify Anda. Mendukung alur pembayaran static (GET), dynamic (POST), dan session (POST). Checkout() mengembalikan getHandler untuk alur static dan postHandler untuk alur dynamic dan session. Daftarkan setiap alur POST pada path-nya sendiri.

Handler Rute Checkout

Adaptor ini mendukung ketiga alur checkout Dodo Payments. Atur type dalam konfigurasi handler untuk memilih alur yang dilayani suatu rute. Setiap alur merespons dengan JSON yang berisi checkout_url untuk dibuka oleh customer.
  • Static Payment Links: type: "static", GET. Membuat payment link untuk satu produk dari query parameter setelah memeriksa bahwa produk tersebut ada.
  • Dynamic Payment Links: type: "dynamic", POST. Membuat pembayaran satu kali atau subscription dengan payment link, bergantung pada apakah produk bersifat recurring.
  • Checkout Sessions: type: "session", POST. Membuat checkout session dari product cart dan detail customer. Gunakan alur ini untuk integrasi baru.
Checkout menerima opsi berikut: Checkout mengembalikan objek dengan dua handler. Daftarkan getHandler untuk GET ketika type adalah static, dan postHandler untuk POST ketika type adalah dynamic atau session.

Query Parameter yang Didukung

string
wajib
Identifier produk, misalnya ?productId=pdt_nZuwz45WAs64n3l07zpQR.
integer
default:"1"
Jumlah produk.
string
Nama lengkap customer. Diabaikan jika firstName atau lastName diberikan.
string
Nama depan customer.
string
Nama belakang customer.
string
Alamat email customer.
string
Negara customer sebagai kode ISO 3166-1 alpha-2.
string
Alamat jalan customer.
string
Kota customer.
string
Negara bagian atau provinsi customer.
string
Kode pos atau ZIP customer.
boolean
Atur ke true untuk menonaktifkan field nama lengkap.
boolean
Atur ke true untuk menonaktifkan field nama depan.
boolean
Atur ke true untuk menonaktifkan field nama belakang.
boolean
Atur ke true untuk menonaktifkan field email.
boolean
Atur ke true untuk menonaktifkan field negara.
boolean
Atur ke true untuk menonaktifkan field alamat.
boolean
Atur ke true untuk menonaktifkan field kota.
boolean
Atur ke true untuk menonaktifkan field negara bagian.
boolean
Atur ke true untuk menonaktifkan field kode ZIP.
string
Mata uang pembayaran, misalnya USD.
boolean
default:"true"
Tampilkan atau sembunyikan pemilih mata uang.
number
Menetapkan jumlah yang dikenakan biaya, dalam satuan utama mata uang, misalnya 12.5 untuk $12.50. Hanya berfungsi untuk produk Pay What You Want dan diabaikan jika nilainya di bawah harga minimum produk.
boolean
default:"true"
Tampilkan atau sembunyikan bagian diskon.
string
Query parameter apa pun yang diawali metadata_ diteruskan ke checkout sebagai metadata, misalnya metadata_orderId=123.
Flag disable hanya berlaku jika nilainya true dan field yang sesuai memiliki nilai, misalnya email dengan disableEmail. Handler meneruskan parameter ini ke static payment link.
Jika productId tidak ada, handler mengembalikan respons 400. Query parameter yang tidak valid atau produk yang tidak ada di akun Anda juga menghasilkan respons 400.

Format Respons

Static checkout mengembalikan respons JSON yang berisi URL checkout:
  • Kirim parameter sebagai JSON body dalam request POST.
  • Mendukung pembayaran satu kali dan recurring. Handler mengambil produk, lalu membuat subscription jika produk bersifat recurring dan pembayaran satu kali jika tidak.
  • Body memerlukan billing (dengan street, city, state, country, dan zipcode) serta customer, ditambah product_id (dengan quantity opsional) atau product_cart. Subscription memerlukan product_id.
  • Handler juga meneruskan metadata, allowed_payment_method_types, billing_currency, discount_codes (atau discount_code yang sudah deprecated), return_url, show_saved_payment_methods, dan tax_id. Untuk subscription, handler juga meneruskan addons, on_demand, dan trial_period_days. Field lainnya diabaikan.
  • Untuk detail field, lihat:
Dynamic Checkout memanggil endpoint POST /payments dan POST /subscriptions yang sudah deprecated. Gunakan Checkout Sessions untuk integrasi baru.

Format Respons

Dynamic checkout mengembalikan respons JSON dengan payment link sebagai URL checkout:
Kirim payload checkout session sebagai JSON body. Handler membuat checkout session yang menangani seluruh alur pembayaran untuk pembelian satu kali dan subscription, lalu mengembalikan checkout_url. product_cart wajib ada dan harus berisi setidaknya satu produk.Setiap checkout_url hanya dapat digunakan sekali dan kedaluwarsa setelah 24 jam, atau setelah 15 menit jika Anda meneruskan confirm: true. Session yang dibuat dengan payment_method_id tidak mengembalikan checkout_url, sehingga handler merespons dengan 400.Lihat Checkout Sessions Integration Guide untuk detail lebih lanjut dan daftar lengkap field yang didukung.

Format Respons

Checkout session mengembalikan respons JSON dengan URL checkout:

Handler Rute Customer Portal

Handler Rute Customer Portal membuat session Customer Portal untuk customer di customer_id dan mengarahkan request ke link portal. CustomerPortal menerima opsi bearerToken dan environment, sama seperti Checkout. Jika Dodo Payments tidak dapat membuat session, handler mengembalikan 500.

Query Parameter

string
wajib
ID customer untuk session portal, misalnya ?customer_id=cus_123.
boolean
Jika diatur ke true, kirim email kepada customer yang berisi link portal.
Mengembalikan 400 jika customer_id tidak ada. Handler tidak mengautentikasi request dan membuka portal untuk customer_id apa pun yang diterimanya, jadi lindungi rute dengan autentikasi Anda sendiri dan teruskan hanya ID customer pengguna yang sudah login.

Handler Rute Webhook

Handler webhook memverifikasi setiap request menggunakan secret webhook Anda, yang diteruskan sebagai webhookKey, lalu memanggil event handler Anda.
Handler webhook memerlukan raw request body sebagai string, jadi tambahkan content type parser untuk application/json dengan parseAs: 'string'. Fastify menerapkan parser ke setiap rute dalam scope tempat parser tersebut ditambahkan. Tambahkan parser di dalam plugin yang hanya mendaftarkan rute webhook, seperti pada contoh. Pada root instance, parser juga akan meneruskan string ke handler checkout POST, yang kemudian mengembalikan 400.
  • Method: Hanya request POST yang didukung. Method lain mengembalikan 405.
  • Signature Verification: Memverifikasi header webhook-id, webhook-timestamp, dan webhook-signature dengan webhookKey, sesuai spesifikasi Standard Webhooks. Mengembalikan 401 jika verifikasi gagal.
  • Payload Validation: Divalidasi dengan Zod. Mengembalikan 400 untuk payload yang tidak valid.
  • Error Handling:
    • 401: Signature tidak valid
    • 400: Payload tidak valid
    • 500: Error internal selama verifikasi
  • Event Routing: Memanggil onPayload untuk setiap event, lalu handler untuk tipe event tersebut, dan mengembalikan 200 setelah keduanya selesai. Handler tidak menangkap error yang dilempar event handler Anda.

Event Handler Webhook yang Didukung

Setiap handler bersifat opsional dan async. Untuk payload setiap event, lihat Webhook Event Guide.

Prompt untuk LLM

Terakhir diubah pada 28 September 2026