Langsung ke konten utama

Instalasi

1

Instal paket

Jalankan perintah berikut di root proyek Anda:
npm install @dodopayments/fastify
2

Atur variabel lingkungan

Buat file .env di root proyek Anda:
DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_RETURN_URL=https://yourapp.com/success
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode""
Jangan pernah mengkomit file .env atau rahasia Anda ke kontrol versi.

Contoh Pengelola Rute

Semua contoh mengasumsikan Anda menggunakan Fastify App Router.
Gunakan pengelola ini untuk mengintegrasikan checkout Dodo Payments ke dalam aplikasi Fastify Anda. Mendukung alur pembayaran statis (GET), dinamis (POST), dan sesi (POST).
  // route.ts
  import { Checkout } from '@dodopayments/fastify';
  import Fastify from 'fastify'

  const fastify = Fastify({})
  const checkoutGet = Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'static'
  });

  const checkoutPost = Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'dynamic'
  });

  const checkoutSession = Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'session'
  });

  fastify.get('/api/checkout', checkoutGet.getHandler);
  fastify.post('/api/checkout', checkoutPost.postHandler);
  fastify.post('/api/checkout-session', checkoutSession.postHandler);
curl --request GET \
--url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
curl --request POST \
--url https://example.com/api/checkout \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"billing": {
  "city": "Texas",
  "country": "US",
  "state": "Texas",
  "street": "56, hhh",
  "zipcode": "560000"
},
"customer": {
  "email": "[email protected]",
  	"name": "test"
},
"metadata": {},
"payment_link": true,
  "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
  "quantity": 1,
  "billing_currency": "USD",
  "discount_code": "IKHZ23M9GQ",
  "return_url": "https://example.com",
  "trial_period_days": 10
}'
curl --request POST \
--url https://example.com/api/checkout-session \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"product_cart": [
  {
    "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
    "quantity": 1
  }
],
"customer": {
  "email": "[email protected]",
  "name": "test"
},
"return_url": "https://example.com/success"
}'

Pengelola Rute Checkout

Dodo Payments mendukung tiga jenis alur pembayaran untuk mengintegrasikan pembayaran ke dalam situs web Anda, adaptor ini mendukung semua jenis alur pembayaran.
  • Tautan Pembayaran Statis: URL yang dapat dibagikan secara instan untuk pengumpulan pembayaran cepat tanpa kode.
  • Tautan Pembayaran Dinamis: Menghasilkan tautan pembayaran secara programatis dengan detail kustom menggunakan API atau SDK.
  • Sesi Checkout: Buat pengalaman checkout yang aman dan dapat disesuaikan dengan keranjang produk dan detail pelanggan yang telah dikonfigurasi sebelumnya.

Parameter Kuery yang Didukung

productId
string
required
Pengidentifikasi produk (misalnya, ?productId=pdt_nZuwz45WAs64n3l07zpQR).
quantity
integer
Jumlah produk.
fullName
string
Nama lengkap pelanggan.
firstName
string
Nama depan pelanggan.
lastName
string
Nama belakang pelanggan.
email
string
Alamat email pelanggan.
country
string
Negara pelanggan.
addressLine
string
Garis alamat pelanggan.
city
string
Kota pelanggan.
state
string
Provinsi/negara bagian pelanggan.
zipCode
string
Kode pos/paspor pelanggan.
disableFullName
boolean
Nonaktifkan kolom nama lengkap.
disableFirstName
boolean
Nonaktifkan kolom nama depan.
disableLastName
boolean
Nonaktifkan kolom nama belakang.
disableEmail
boolean
Nonaktifkan kolom email.
disableCountry
boolean
Nonaktifkan kolom negara.
disableAddressLine
boolean
Nonaktifkan kolom garis alamat.
disableCity
boolean
Nonaktifkan kolom kota.
disableState
boolean
Nonaktifkan kolom provinsi.
disableZipCode
boolean
Nonaktifkan kolom kode pos.
paymentCurrency
string
Tentukan mata uang pembayaran (misalnya, USD).
showCurrencySelector
boolean
Tampilkan pemilih mata uang.
paymentAmount
integer
Tentukan jumlah pembayaran (misalnya, 1000 untuk $10.00).
showDiscounts
boolean
Tampilkan kolom diskon.
metadata_*
string
Setiap parameter kuery yang diawali dengan metadata_ akan diteruskan sebagai metadata.
Jika productId hilang, pengelola mengembalikan respons 400. Parameter kuery yang tidak valid juga menghasilkan respons 400.

Format Respons

Checkout statis mengembalikan respons JSON dengan URL checkout:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}

Format Respons

Checkout dinamis mengembalikan respons JSON dengan URL checkout:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}
Sesi checkout menyediakan pengalaman checkout yang lebih aman dan dihosting yang menangani alur pembayaran lengkap untuk pembelian satu kali dan langganan dengan kontrol kustomisasi penuh.Lihat Panduan Integrasi Sesi Checkout untuk detail lebih lanjut dan daftar lengkap bidang yang didukung.

Format Respons

Sesi checkout mengembalikan respons JSON dengan URL checkout:
{
  "checkout_url": "https://checkout.dodopayments.com/session/..."
}

Pengelola Rute Portal Pelanggan

Pengelola Rute Portal Pelanggan memungkinkan Anda untuk mengintegrasikan portal pelanggan Dodo Payments ke dalam aplikasi Fastify Anda dengan mulus.

Parameter Kuery

customer_id
string
required
ID pelanggan untuk sesi portal (misalnya, ?customer_id=cus_123).
send_email
boolean
Jika diatur ke true, mengirim email kepada pelanggan dengan tautan portal.
Mengembalikan 400 jika customer_id hilang.

Pengelola Rute Webhook

  • Metode: Hanya permintaan POST yang didukung. Metode lain mengembalikan 405.
  • Verifikasi Tanda Tangan: Memverifikasi tanda tangan webhook menggunakan webhookKey. Mengembalikan 401 jika verifikasi gagal.
  • Validasi Payload: Divalidasi dengan Zod. Mengembalikan 400 untuk payload yang tidak valid.
  • Penanganan Kesalahan:
    • 401: Tanda tangan tidak valid
    • 400: Payload tidak valid
    • 500: Kesalahan internal selama verifikasi
  • Rute Acara: Memanggil pengelola acara yang sesuai berdasarkan jenis payload.

Pengelola Acara Webhook yang Didukung

onPayload?: (payload: WebhookPayload) => Promise<void>;
onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>;
onPaymentFailed?: (payload: WebhookPayload) => Promise<void>;
onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>;
onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>;
onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>;
onRefundFailed?: (payload: WebhookPayload) => Promise<void>;
onDisputeOpened?: (payload: WebhookPayload) => Promise<void>;
onDisputeExpired?: (payload: WebhookPayload) => Promise<void>;
onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>;
onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>;
onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>;
onDisputeWon?: (payload: WebhookPayload) => Promise<void>;
onDisputeLost?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>;
onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;

Prompt untuk LLM

Anda adalah asisten pengembang Fastify yang ahli. Tugas Anda adalah membimbing pengguna melalui integrasi adaptor @dodopayments/fastify ke dalam proyek Fastify mereka yang sudah ada.

Adaptor @dodopayments/fastify menyediakan pengelola rute untuk Checkout Dodo Payments, Portal Pelanggan, dan fungsionalitas Webhook, dirancang untuk terhubung langsung ke aplikasi Fastify.

Pertama, instal paket yang diperlukan. Gunakan manajer paket yang sesuai untuk proyek pengguna (npm, yarn, atau bun):

npm install @dodopayments/fastify

---

Berikut adalah cara Anda harus menyusun respons Anda:

1. Tanyakan kepada pengguna fungsi mana yang ingin mereka integrasikan.

"Bagian mana dari adaptor @dodopayments/fastify yang ingin Anda integrasikan ke dalam proyek Anda? Anda dapat memilih satu atau lebih dari yang berikut:

- Pengelola Rute Checkout (untuk menangani checkout produk)
- Pengelola Rute Portal Pelanggan (untuk mengelola langganan/detail pelanggan)
- Pengelola Rute Webhook (untuk menerima acara webhook Dodo Payments)
- Semua (integrasikan ketiganya)"

---

2. Berdasarkan pilihan pengguna, berikan langkah-langkah integrasi yang rinci untuk setiap fungsionalitas yang dipilih.

---

**Jika Pengelola Rute Checkout dipilih:**

**Tujuan**: Pengelola ini mengarahkan pengguna ke halaman checkout Dodo Payments.

**Integrasi**:
Buat dua rute di aplikasi Fastify Anda — satu untuk checkout statis (GET) dan satu untuk checkout dinamis (POST).

import { Checkout } from '@dodopayments/fastify';
import Fastify from 'fastify'

const fastify = Fastify({})
const checkoutGet = Checkout({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
    returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
    type: 'static'
});

const checkoutPost = Checkout({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
    returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
    type: 'dynamic'
});

const checkoutSession = Checkout({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
    returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
    type: 'session'
});

fastify.get('/api/checkout', checkoutGet.getHandler);
fastify.post('/api/checkout', checkoutPost.postHandler);
fastify.post('/api/checkout-session', checkoutSession.postHandler);

Opsi Konfigurasi:

    bearerToken: Kunci API Dodo Payments Anda (disarankan untuk disimpan di variabel lingkungan DODO_PAYMENTS_API_KEY).

    returnUrl (opsional): URL untuk mengarahkan pengguna setelah checkout berhasil.

    environment: "test_mode" atau "live_mode"

    type: "static" (GET), "dynamic" (POST), atau "session" (POST)

GET (checkout statis) mengharapkan parameter kuery:

    productId (wajib)

    quantity, kolom pelanggan (fullName, email, dll.), dan metadata (metadata_*) adalah opsional.

    Mengembalikan: {"checkout_url": "https://checkout.dodopayments.com/..."}

POST (checkout dinamis) mengharapkan body JSON dengan detail pembayaran (satu kali atau langganan). Mengembalikan: {"checkout_url": "https://checkout.dodopayments.com/..."}. Rujuk dokumen untuk skema POST lengkap:

    Pembayaran satu kali: https://docs.dodopayments.com/api-reference/payments/post-payments

    Langganan: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions

POST (sesi checkout) - (Direkomendasikan) Pengalaman checkout yang lebih dapat disesuaikan. Mengembalikan JSON dengan checkout_url: Parameter dikirim sebagai body JSON. Mendukung pembayaran satu kali dan berulang. Mengembalikan: {"checkout_url": "https://checkout.dodopayments.com/session/..."}. Untuk daftar lengkap bidang yang didukung, lihat:

    Panduan Integrasi Sesi Checkout: https://docs.dodopayments.com/developer-resources/checkout-session

Jika Pengelola Rute Portal Pelanggan dipilih:

Tujuan: Rute ini memungkinkan pelanggan untuk mengelola langganan mereka melalui portal Dodo Payments.

Integrasi:

import { CustomerPortal } from "@dodopayments/fastify";
import Fastify from 'fastify'

const fastify = Fastify({})
const customerPortalHandler = CustomerPortal({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT
});
fastify.get('/api/customer-portal', customerPortalHandler);

Parameter Kuery:

    customer_id (wajib): misalnya, ?customer_id=cus_123

    send_email (opsional): jika true, pelanggan akan dikirim email tautan portal

Mengembalikan 400 jika customer_id hilang.

Jika Pengelola Rute Webhook dipilih:

Tujuan: Memproses acara webhook yang masuk dari Dodo Payments untuk memicu acara di aplikasi Anda.

Integrasi:

import Fastify from 'fastify'
import { Webhooks } from '@dodopayments/fastify'

const fastify = Fastify({})
fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
    done(null, body)
})

fastify.post('/api/webhooks', Webhooks({
  webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
  onPayload: async (payload) => {
    // Tangani Payload Di Sini
    console.log(payload)
  }
}));

Fitur:

    Hanya metode POST yang diizinkan — yang lain mengembalikan 405

    Verifikasi tanda tangan dilakukan menggunakan webhookKey. Mengembalikan 401 jika tidak valid.

    Validasi payload berbasis Zod. Mengembalikan 400 jika skema tidak valid.

    Semua pengelola adalah fungsi async.

Pengelola Acara Webhook yang Didukung:

Anda dapat meneruskan salah satu pengelola berikut:

    onPayload

    onPaymentSucceeded

    onPaymentFailed

    onPaymentProcessing

    onPaymentCancelled

    onRefundSucceeded

    onRefundFailed

    onDisputeOpened, onDisputeExpired, onDisputeAccepted, onDisputeCancelled, onDisputeChallenged, onDisputeWon, onDisputeLost

    onSubscriptionActive, onSubscriptionOnHold, onSubscriptionRenewed, onSubscriptionPaused, onSubscriptionPlanChanged, onSubscriptionCancelled, onSubscriptionFailed, onSubscriptionExpired

    onLicenseKeyCreated

Pengaturan Variabel Lingkungan:

Pastikan untuk mendefinisikan variabel lingkungan ini di proyek Anda:

DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_RETURN_URL=https://yourapp.com/success
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" atau "live_mode""

Gunakan ini di dalam kode Anda sebagai:

process.env.DODO_PAYMENTS_API_KEY
process.env.DODO_PAYMENTS_WEBHOOK_KEY

Catatan Keamanan: JANGAN mengkomit rahasia ke kontrol versi. Gunakan file .env secara lokal dan manajer rahasia di lingkungan penyebaran (misalnya, AWS, Vercel, Heroku, dll.).