image

25 Nov 2025

9K

35K

Integrasi Stripe Payment Gateway di Flutter: Panduan Lengkap

Di era digital saat ini, kemampuan untuk menerima pembayaran online adalah krusial bagi hampir setiap aplikasi mobile. Flutter, dengan kemampuannya membangun aplikasi lintas platform yang indah dan berperforma tinggi, semakin diminati. Memadukan keunggulan Flutter dengan solusi pembayaran yang aman dan fleksibel seperti Stripe Payment Gateway adalah kombinasi yang kuat untuk kesuksesan aplikasi Anda.

Artikel ini akan memandu Anda melalui langkah-langkah penting untuk mengintegrasikan Stripe ke dalam aplikasi Flutter Anda, memastikan proses transaksi yang mulus dan aman.

Mengapa Memilih Stripe untuk Aplikasi Flutter Anda?

Stripe adalah salah satu platform pembayaran paling populer dan terpercaya di dunia, dan ada beberapa alasan kuat mengapa Stripe menjadi pilihan utama bagi banyak developer:

  • Keamanan Terdepan: Stripe memegang sertifikasi PCI DSS Level 1, standar keamanan tertinggi dalam industri pembayaran. Ini berarti Stripe menangani sebagian besar beban kepatuhan keamanan, melindungi data sensitif pelanggan Anda.
  • Fleksibilitas dan Skalabilitas: Stripe mendukung berbagai metode pembayaran global (kartu kredit/debit, Apple Pay, Google Pay, dll.) dan dapat diskalakan dari startup kecil hingga perusahaan besar.
  • Dokumentasi Unggul dan SDK yang Kuat: Stripe memiliki dokumentasi yang sangat baik dan SDK (Software Development Kit) yang modern untuk berbagai platform, termasuk Flutter, membuat proses integrasi menjadi lebih mudah.
  • Fitur Lengkap: Dari pembayaran satu kali hingga langganan berulang, faktur, dan manajemen marketplace, Stripe menawarkan serangkaian fitur yang kaya untuk memenuhi berbagai kebutuhan bisnis.

Pra-syarat Integrasi

Sebelum memulai, pastikan Anda memiliki hal-hal berikut:

  • Akun Stripe yang aktif. Anda dapat mendaftar secara gratis di stripe.com.
  • Kunci API Stripe (Publishable Key dan Secret Key) dari dashboard Stripe Anda. Ingat, Secret Key tidak boleh diekspos di aplikasi frontend Anda.
  • Proyek Flutter yang sudah disiapkan (atau buat yang baru).
  • Pengetahuan dasar tentang pengembangan backend (Node.js, Python, PHP, dll.) untuk membuat Payment Intent.

Langkah-langkah Integrasi Dasar

Integrasi Stripe di Flutter umumnya melibatkan komunikasi antara aplikasi Flutter Anda, backend server Anda, dan API Stripe.

1. Menambahkan Dependensi ke Proyek Flutter

Tambahkan paket resmi Stripe untuk Flutter, flutter_stripe, ke file pubspec.yaml Anda:

dependencies:
  flutter:
    sdk: flutter
  flutter_stripe: ^VERSION_TERBARU_DI_PUB_DEV

Setelah menambahkan, jalankan flutter pub get di terminal Anda.

2. Inisialisasi Stripe di Aplikasi Flutter

Sebelum melakukan operasi Stripe apa pun, Anda perlu menginisialisasi FlutterStripe dengan publishableKey Anda. Lakukan ini di awal aplikasi Anda, misalnya di fungsi main() atau widget utama:

import 'package:flutter_stripe/flutter_stripe.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Stripe.publishableKey = 'pk_test_YOUR_STRIPE_PUBLISHABLE_KEY'; // Ganti dengan kunci Anda
  await Stripe.instance.initialize(
    // Parameter lain seperti merchantIdentifier untuk Apple Pay bisa ditambahkan di sini
    // applePay: ApplePayConfig(
    //   merchantIdentifier: 'merchant.com.your_app_name',
    //   countryCode: 'US',
    // ),
    // googlePay: GooglePayConfig(
    //   merchantName: 'Your Company',
    //   countryCode: 'US',
    //   testEnv: true, // Set false untuk produksi
    // ),
  );
  runApp(const MyApp());
}

3. Membuat Payment Intent di Backend (Sangat Penting!)

Untuk alasan keamanan, Anda tidak boleh mengekspos Secret Key Stripe Anda di aplikasi Flutter Anda. Sebaliknya, semua operasi yang melibatkan Secret Key (seperti membuat Payment Intent) harus dilakukan di server backend Anda.

Saat pengguna ingin melakukan pembayaran, aplikasi Flutter Anda akan meminta backend untuk membuat Payment Intent. Backend Anda akan memanggil API Stripe untuk membuat Payment Intent dan kemudian mengembalikan client_secret ke aplikasi Flutter Anda. Ini adalah contoh pseudo-code untuk backend (misalnya, Node.js dengan Express):

// Contoh Backend (Node.js)
const express = require('express');
const stripe = require('stripe')('sk_test_YOUR_STRIPE_SECRET_KEY'); // Ganti dengan kunci Anda

const app = express();
app.use(express.json());

app.post('/create-payment-intent', async (req, res) => {
  try {
    const { amount } = req.body;
    const paymentIntent = await stripe.paymentIntents.create({
      amount: amount, // dalam cents/sen
      currency: 'usd',
      // tambahkan parameter lain sesuai kebutuhan
    });
    res.json({ clientSecret: paymentIntent.client_secret });
  } catch (e) {
    res.status(400).json({ error: e.message });
  }
});

app.listen(3000, () => console.log('Backend listening on port 3000!'));

4. Mengumpulkan Detail Pembayaran dan Mengkonfirmasi di Flutter

flutter_stripe menyediakan widget dan metode untuk mengumpulkan detail pembayaran dan mengkonfirmasi transaksi. Metode yang paling disarankan adalah menggunakan PaymentSheet karena memberikan pengalaman pengguna yang sudah jadi dan sesuai standar Stripe.

Berikut adalah alur umum menggunakan PaymentSheet:

  • Ambil client_secret: Panggil endpoint backend Anda (/create-payment-intent) untuk mendapatkan client_secret.
  • Inisialisasi PaymentSheet: Gunakan Stripe.instance.initPaymentSheet() dengan client_secret yang diterima dari backend.
  • Tampilkan PaymentSheet: Panggil Stripe.instance.presentPaymentSheet() untuk menampilkan UI pembayaran kepada pengguna.
  • Konfirmasi Pembayaran: Setelah pengguna menyelesaikan interaksi di PaymentSheet, Stripe akan mengkonfirmasi pembayaran. Anda akan menerima hasil dari presentPaymentSheet() yang menunjukkan apakah pembayaran berhasil atau gagal.
import 'package:flutter/material.dart';
import 'package:flutter_stripe/flutter_stripe.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class PaymentScreen extends StatefulWidget {
  const PaymentScreen({super.key});

  @override
  State createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State {
  Map<String, dynamic>? paymentIntent;

  Future<void> makePayment() async {
    try {
      // 1. Panggil backend untuk mendapatkan client_secret
      paymentIntent = await createPaymentIntent('1000', 'USD'); // Contoh: Rp10.000 atau $10.00

      // 2. Inisialisasi PaymentSheet
      await Stripe.instance.initPaymentSheet(
        paymentSheetParameters: SetupPaymentSheetParameters(
          paymentIntentClientSecret: paymentIntent!['clientSecret'],
          merchantDisplayName: 'Nama Toko Anda',
          // customerId: paymentIntent!['customerId'], // Opsional, jika Anda mengelola pelanggan di Stripe
          // customerEphemeralKeySecret: paymentIntent!['ephemeralKey'], // Opsional
          style: ThemeMode.light, // Atau ThemeMode.dark
        ),
      );

      // 3. Tampilkan PaymentSheet
      await displayPaymentSheet();
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Terjadi kesalahan: $e')),
      );
    }
  }

  Future<void> displayPaymentSheet() async {
    try {
      await Stripe.instance.presentPaymentSheet();
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('Pembayaran Berhasil!')),
      );
      // Lakukan navigasi atau update UI setelah pembayaran berhasil
    } on StripeException catch (e) {
      if (e.error.code == FailureCode.Canceled) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('Pembayaran dibatalkan.')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Pembayaran gagal: ${e.error.message}')),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Terjadi kesalahan tidak terduga: $e')),
      );
    }
  }

  Future<Map<String, dynamic>> createPaymentIntent(String amount, String currency) async {
    try {
      Map<String, dynamic> body = {
        'amount': amount,
        'currency': currency,
      };

      // Ganti dengan URL backend Anda
      var response = await http.post(
        Uri.parse('http://YOUR_BACKEND_URL/create-payment-intent'),
        headers: {'Content-Type': 'application/json'},
        body: jsonEncode(body),
      );
      return jsonDecode(response.body);
    } catch (e) {
      throw Exception('Gagal membuat Payment Intent: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Pembayaran Stripe')),
      body: Center(
        child: ElevatedButton(
          onPressed: makePayment,
          child: const Text('Bayar Sekarang'),
        ),
      ),
    );
  }
}

Keamanan dan Best Practices

  • Jangan Pernah Ekspos Secret Key: Ini adalah aturan emas. Secret Key Stripe Anda harus selalu disimpan di server backend Anda dan tidak pernah dikirimkan ke frontend (aplikasi Flutter).
  • Gunakan HTTPS: Pastikan semua komunikasi antara aplikasi Flutter dan backend Anda menggunakan HTTPS untuk mengenkripsi data yang transit.
  • Validasi Sisi Server: Selain validasi di sisi klien, selalu lakukan validasi di sisi server untuk jumlah pembayaran dan detail transaksi lainnya untuk mencegah penipuan.
  • Tangani Error dengan Baik: Implementasikan penanganan error yang robust di sisi frontend maupun backend untuk memberikan umpan balik yang jelas kepada pengguna dan membantu debugging.
  • Uji Secara Menyeluruh: Gunakan mode pengujian Stripe (dengan kunci pengujian dan nomor kartu uji) untuk memastikan semua alur pembayaran berfungsi dengan benar sebelum go-live.

Kesimpulan

Mengintegrasikan Stripe Payment Gateway di aplikasi Flutter Anda adalah langkah penting untuk memungkinkan transaksi yang aman dan efisien. Meskipun memerlukan pengaturan backend, prosesnya relatif lugas berkat dokumentasi Stripe yang lengkap dan paket flutter_stripe yang canggih.

Dengan mengikuti panduan ini, Anda dapat membangun solusi pembayaran yang kuat, memberikan pengalaman pengguna yang unggul, dan meningkatkan kapabilitas bisnis aplikasi Flutter Anda. Selamat mencoba!

Related Articles

May 14, 2026

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter Countdown timers are essential in many applic

May 11, 2026

Unleashing Dynamic UIs: Flutter's Animation Prowess

Unleashing Dynamic UIs: Flutter's Animation Prowess for Slide & Scale Effects Flutter's declarative UI framework, combined with its powerful animation capabilit

May 11, 2026

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy A well-designed Product Detail Page (PDP) is