LKPD: Transaksi & Otorisasi API
Identitas
- Mata Pelajaran: Pemrograman Mobile (Flutter)
- Topik: Integrasi API Transaksi dengan Token JWT
A. Tujuan Pembelajaran
Siswa mampu: 1. Mengirim request POST dengan data kompleks (Nested JSON). 2. Menambahkan Header Authorization (Bearer Token) pada request. 3. Membuat logika Checkout sederhana. 4. Membuat halaman Success Page sebagai umpan balik transaksi.
B. Skenario
Aplikasi toko online belum lengkap kalau tidak bisa belanja. Di tugas ini, kalian akan membuat fitur Checkout.
Saat user menekan tombol "Bayar" di keranjang/halaman checkout: 1. Aplikasi mengambil Token dari penyimpanan lokal. 2. Aplikasi mengirim data transaksi beserta Token ke Server. 3. Jika sukses, User diarahkan ke halaman "Terima Kasih".
C. Spesifikasi API
- Endpoint:
{{ API_URL }}/transactions - Method:
POST - Headers:
Content-Type:application/jsonAuthorization:Bearer <TOKEN_KALIAN_DISINI>
1. Request Body (Data yang dikirim)
Struktur datanya sedikit kompleks karena ada array details (daftar barang yang dibeli).
{
"recipient_name": "Nama Penerima",
"recipient_address": "Alamat Lengkap",
"recipient_phone": "08123456789",
"subtotal": 300000,
"total_amount": 350000,
"details": [
{
"product_id": 1,
"quantity": 1,
"price": 100000,
"subtotal": 100000
},
{
"product_id": 2,
"quantity": 1,
"price": 200000,
"subtotal": 200000
}
]
}
2. Response Sukses (201 Created)
{
"id": "8b5ee0bd-1219-46d3-9c32-f53bde727a9f",
"user_id": 1,
"recipient_name": "Nama Penerima",
# ... data lainnya
"status": "pending",
"details": [...]
}
D. Langkah Kerja
Langkah 1: Siapkan Model
Gunakan app.quicktype.io untuk membuat model dari JSON Request di atas.
- Name: TransactionPayload (atau sesuka kalian).
- Language: Dart.
- Simpan di lib/models/transaction_model.dart.
Tips: Hati-hati dengan struktur
detailsyang berupa List of Object. Pastikan Quicktype membacanya sebagai struktur yang benar.
Langkah 2: Buat Transaction Service
Buat file lib/services/transaction_service.dart.
Kalian ditantang untuk melengkapi kode berikut agar bisa mengirim data transaksi + Token.
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
class TransactionService {
final storage = const FlutterSecureStorage();
final String baseUrl = dotenv.env['API_URL'] ?? 'http://localhost:8080';
// TUGAS 1: Lengkapi fungsi ini!
Future<bool> checkout(Map<String, dynamic> dataTransaksi) async {
// A. Ambil Token dari Secure Storage
// Coding disini...
// B. Cek jika token tidak ada, lempar error
// Coding disini...
// C. Siapkan URL
// Coding disini...
// D. Kirim Request POST
// Jangan lupa tambahkan Header:
// 'Authorization': 'Bearer <token_kalian>'
// Coding disini...
// E. Cek Status Code (Harusnya 201)
// Coding disini...
return false; // Hapus baris ini jika sudah selesai coding
}
}
Langkah 3: Integrasi ke Tombol Checkout
Di halaman Keranjang atau Checkout kalian:
1. Susun data transaksi (hardcode dulu tidak apa-apa untuk latihan).
2. Panggil TransactionService.
3. Jika sukses -> Pindah ke Halaman Success.
// TUGAS 2: Panggil service saat tombol ditekan
void onCheckoutPressed() async {
// 1. Siapkan data transaksi (Map / Model) sesuai contoh JSON di atas
// 2. Panggil TransactionService().checkout(...)
// 3. Jika berhasil, pindah halaman ke SuccessPage
// context.go('/success');
}
Langkah 4: Halaman Success Page
Buat file lib/pages/success_page.dart.
- Tampilkan Icon Centang Besar / Gambar Transaksi Berhasil.
- Teks "Terima Kasih, pesanan Anda sedang diproses".
- Tombol "Kembali ke Home" yang mengarah ke /home.
E. Tugas / Challenge
- Pastikan kalian login terlebih dahulu untuk mendapatkan Token.
- Lakukan transaksi menggunakan data dummy.
- Cek apakah sukses masuk ke database (atau setidaknya balasan server 201).
- Tantangan: Buat form inputan Alamat Pengiriman sebelum tombol checkout, agar data
recipient_addressdinamis!
F. Troubleshooting
- 401 Unauthorized: Token yang dikirim salah atau kadaluarsa. Cek penulisan
Bearer(ada spasi). - 400 Bad Request: JSON Body tidak sesuai (cek nama field).
- Connection Refused: Pastikan server API menyala.