Skip to main content

GitHub Repository

Kode sumber untuk boilerplate FastAPI dan Dodo Payments.

Ikhtisar

Boilerplate FastAPI adalah backend Python yang sudah terhubung ke Dodo Payments. Boilerplate ini memiliki endpoint untuk membuat checkout sessions dan Customer Portal sessions, endpoint webhook yang memverifikasi signature, serta halaman pricing yang dirender dari template Jinja2.
Boilerplate ini menggunakan FastAPI dengan handler rute async, Pydantic untuk validasi dan pengaturan, serta dodopayments Python SDK. Handler memanggil client sinkron DodoPayments. Untuk menghindari pemblokiran event loop, gunakan AsyncDodoPayments dan await panggilannya.

Fitur

Boilerplate ini mencakup:
  • Penyiapan Cepat: Beralih dari proses clone ke server yang berjalan dalam sekitar lima menit.
  • Handler Async: Handler rute adalah fungsi async def FastAPI.
  • Checkout Sessions: Endpoint checkout yang telah dikonfigurasi dan menggunakan Python SDK.
  • Penanganan Webhook: Endpoint webhook yang memverifikasi setiap signature dengan method unwrap milik SDK.
  • Customer Portal: Endpoint yang membuat Customer Portal sessions.
  • Keamanan Tipe: Model Pydantic memvalidasi request body, dan kode menggunakan type hints.
  • Konfigurasi Environment: pydantic-settings memuat dan memvalidasi konfigurasi dari .env.

Prasyarat

Sebelum memulai, Anda memerlukan:
  • Python 3.9 atau yang lebih baru, yang diperlukan oleh dodopayments SDK. Python 3.11 atau yang lebih baru direkomendasikan.
  • pip atau uv untuk manajemen paket.
  • Akun Dodo Payments, untuk membuat API key dan webhook signing secret di dashboard.

Mulai Cepat

1

Clone the Repository

2

Create Virtual Environment

Siapkan environment Python yang terisolasi:
Atau gunakan uv untuk manajemen dependensi yang lebih cepat:
3

Install Dependencies

Atau dengan uv:
4

Get API Credentials

Daftar di Dodo Payments, lalu dapatkan kredensial Anda dari dashboard:
Buat keduanya saat switch Live Mode di sidebar dalam keadaan nonaktif. Key mode pengujian hanya berfungsi dengan DODO_PAYMENTS_ENVIRONMENT=test_mode, dan pembayaran dalam mode pengujian tidak memindahkan uang sungguhan.
5

Configure Environment Variables

Salin file contoh untuk membuat file .env di direktori root:
Atur nilainya ke kredensial Dodo Payments Anda:
.env
Keempat variabel wajib diisi. app/core/config.py memuatnya dengan pydantic-settings, dan aplikasi gagal dimulai jika salah satunya tidak ada atau kosong. DODO_PAYMENTS_RETURN_URL adalah tempat checkout mengarahkan pelanggan setelah pembayaran.
Jangan commit file .env ke version control. .gitignore milik repositori sudah mengecualikannya.
6

Add Your Products

Ganti produk contoh di app/lib/products.py dengan produk Anda sendiri. Atur setiap product_id ke ID produk di bagian Products pada dashboard Anda. Halaman pricing akan menampilkan produk-produk ini.
7

Run the Development Server

Buka http://localhost:8000/docs untuk melihat dokumentasi API interaktif.
Swagger UI mencantumkan endpoint /api/checkout/, /api/webhook/, dan /api/customer-portal/ yang siap diuji.
URL root, http://localhost:8000, menampilkan halaman pricing.
app/main.py memanggil templates.TemplateResponse("index.html", {"request": request, ...}), sebuah signature yang tidak lagi diterima oleh Starlette 1.x, sehingga halaman pricing mengembalikan error 500 pada instalasi baru. Untuk memperbaikinya, ubah pemanggilan tersebut menjadi templates.TemplateResponse(request, "index.html", {"products": products}).

Struktur Proyek

Endpoint API

app/main.py memasang setiap router di bawah prefix /api: Setiap path diakhiri dengan garis miring. FastAPI menjawab request ke path tanpa garis miring dengan redirect 307, jadi gunakan path yang tepat, terutama dalam URL webhook Anda.

Contoh Kode

Contoh-contoh ini diringkas dari file-file di app/api/.

Membuat Checkout Session

app/api/checkout.py membuat checkout session dan mengembalikan checkout_url. Request body menerima product_id, quantity opsional, dan objek customer opsional dengan name dan email:

Menangani Webhook

app/api/webhook.py memverifikasi signature dengan method unwrap milik SDK, lalu memilih cabang berdasarkan tipe event:

Integrasi Customer Portal

app/api/portal.py membuat session Customer Portal untuk ID customer dan mengembalikan link portal sebagai url:
Halaman pricing di app/templates/index.html mengirim ID customer hardcoded (cus_001) ke endpoint ini, serta nama dan email hardcoded ke endpoint checkout. Ganti nilai-nilai tersebut dengan nilai pengguna yang sudah sign in.

Event Webhook

Handler di app/api/webhook.py memilih cabang berdasarkan event berikut: Untuk menangani event lain, tambahkan cabang untuk tipenya, seperti refund.succeeded untuk refund yang berhasil diproses. Untuk setiap tipe event, lihat Panduan Event Webhook. Tambahkan business logic Anda di dalam webhook handler untuk:
  • Memperbarui permission pengguna di database Anda
  • Mengirim email konfirmasi
  • Menyediakan akses ke produk digital
  • Melacak analytics dan metrics

Menguji Webhook Secara Lokal

Dodo Payments tidak dapat menjangkau localhost. Untuk pengembangan lokal, gunakan tool seperti ngrok untuk mengekspos server lokal Anda:
Tambahkan URL HTTPS ngrok, diikuti /api/webhook/, sebagai endpoint di Dodo Payments Dashboard Anda:
Salin signing secret endpoint ke DODO_PAYMENTS_WEBHOOK_KEY di .env, lalu mulai ulang server. Aplikasi hanya membaca .env saat startup.

Deployment

Docker

Repository ini tidak menyertakan Dockerfile. Untuk menjalankan aplikasi dalam container, tambahkan Dockerfile ini ke root repository:
COPY . . menyalin setiap file dalam build context, termasuk .env. Agar key Anda tidak masuk ke image, tambahkan file .dockerignore yang mencantumkan .env. Kemudian build image dan jalankan dengan environment file Anda:

Pertimbangan Produksi

Sebelum melakukan deployment ke production:
  • Ubah DODO_PAYMENTS_ENVIRONMENT menjadi live_mode.
  • Gunakan API key live mode dari dashboard.
  • Tambahkan endpoint webhook untuk domain production Anda, dan atur DODO_PAYMENTS_WEBHOOK_KEY ke signing secret-nya.
  • Atur DODO_PAYMENTS_RETURN_URL ke URL production Anda.
  • Aktifkan HTTPS untuk semua endpoint.

Pemecahan Masalah

Pastikan virtual environment Anda aktif dan dependencies sudah terpasang:
app/main.py menyajikan file statis dari app/static, tetapi repository tidak menyertakan direktori tersebut. Buat direktori itu dengan mkdir app/static, lalu mulai ulang server.
Periksa penyebab umum berikut:
  • Product ID tidak ada di dashboard Dodo Payments Anda.
  • API key atau DODO_PAYMENTS_ENVIRONMENT di .env salah. Key test mode hanya berfungsi dengan test_mode.
Endpoint mengembalikan error SDK dalam response 400. Periksa log FastAPI untuk pesan error yang lebih terperinci.
Untuk pengujian lokal, gunakan ngrok untuk mengekspos server Anda:
Di dashboard Dodo Anda, tambahkan endpoint dengan URL ngrok yang diikuti /api/webhook/, termasuk garis miring penutup. Salin signing secret endpoint tersebut ke DODO_PAYMENTS_WEBHOOK_KEY dalam file .env Anda.
  • Pastikan DODO_PAYMENTS_WEBHOOK_KEY di .env cocok dengan signing secret endpoint.
  • Verifikasi signature terhadap raw request body, sebelum Anda mem-parsing-nya sebagai JSON.
  • Teruskan ketiga header webhook-id, webhook-timestamp, dan webhook-signature ke client.webhooks.unwrap(). Signature Standard Webhooks mencakup id.timestamp.body, bukan body saja.

Pelajari Lebih Lanjut

Python SDK

Dokumentasi Python SDK lengkap dengan dukungan async

Webhooks Documentation

Pelajari semua event webhook dan praktik terbaik

Checkout Sessions

Pelajari secara mendalam konfigurasi checkout session

API Reference

Dokumentasi Dodo Payments API lengkap

Dukungan

Untuk bantuan terkait boilerplate:
Terakhir diubah pada 26 September 2026