- Instalasi
- Panduan Cepat
- Setup Development
- Cara Penggunaan
- Referensi API
- Konfigurasi
- Contoh Penggunaan
- Penanganan Error
- Kontribusi
import { PropanaService, PropanaDisplayService, InputUtil } from './src';
async function main() {
const service = new PropanaService();
try {
// Login dengan kredensial agen
await service.login('PRID119932', '08XXXXXXXXX');
// Minta kode OTP
await service.requestOTP();
// Verifikasi OTP
const otp = await InputUtil.getUserInput('Masukkan kode OTP: ');
await service.verifyOTP(otp);
// Membuat koneksi dan inisialisasi sesi
await service.establishConnection();
await service.initializeSession();
// Dapatkan daftar produk dan tampilkan
const products = await service.getProductList();
PropanaDisplayService.displayProductList(products);
// Buat pesanan
const order = await service.orderProduct('TDKG1', '08XXXXXXXXX');
PropanaDisplayService.displayProductOrderResult(order);
// Lakukan deposit
const deposit = await service.deposit(100000);
PropanaDisplayService.displayDepositResult(deposit);
} catch (error) {
console.error('Error:', error.message);
} finally {
InputUtil.closeInput();
}
}
main();- Node.js >= 20.0.0
- npm atau yarn
- Clone repositori:
git clone https://github.com/imtaqin/PropanaReload
cd PropanaReload- Install dependensi:
npm install- Build project:
npm run build- Jalankan development server:
npm run devimport { PropanaService } from 'propana-api-client';
const service = new PropanaService();
// 1. Login
await service.login('ID_AGEN', 'NOMOR_TELEPON');
// 2. Minta OTP
await service.requestOTP();
// 3. Verifikasi OTP
await service.verifyOTP('123456');
// 4. Buat koneksi
await service.establishConnection();
// 5. Inisialisasi sesi
await service.initializeSession();
// Sekarang siap digunakan!import { PropanaService } from 'propana-api-client';
// Menggunakan konfigurasi custom
const customConfig = {
appKey1: 'app_key_1_custom',
appKey2: 'app_key_2_custom',
fcmToken: 'fcm_token_custom'
};
const service = new PropanaService(customConfig);// Simpan sesi untuk penggunaan selanjutnya
await service.saveSession();
// Muat sesi yang tersimpan
const sessionLoaded = await service.loadSession();
if (sessionLoaded) {
console.log('Sesi berhasil dimuat');
} else {
console.log('Tidak ada sesi tersimpan');
}
// Hapus sesi
await service.clearSession();constructor(config?: PropanaConfig)Membuat instance baru dari Propana API client.
Parameter:
config(opsional): Objek konfigurasi dengan API keys dan FCM token
Memulai proses login dengan kredensial agen.
Parameter:
agentId: String identifikasi agen (contoh: 'PRID119932')phoneNumber: Nomor telepon untuk autentikasi (contoh: '08123456789')
Return: Promise<ApiResponse>
Contoh:
await service.login('PRID119932', '08123456789');Meminta kode OTP untuk dikirim ke nomor telepon terdaftar.
Return: Promise<ApiResponse>
Memverifikasi kode OTP yang diterima via SMS.
Parameter:
otp: Kode OTP 6 digit yang diterima
Return: Promise<ApiResponse>
Membuat koneksi dengan server setelah verifikasi OTP berhasil.
Return: Promise<boolean>
Inisialisasi sesi untuk penggunaan API.
Return: Promise<boolean>
Mendapatkan daftar produk yang tersedia.
Return: Promise<ApiResponse>
Contoh:
const products = await service.getProductList();
PropanaDisplayService.displayProductList(products);Membuat pesanan produk.
Parameter:
productCode: Kode produk (contoh: 'TDKG1')destination: Nomor tujuanamount(opsional): Jumlah/nominal
Return: Promise<ApiResponse>
Contoh:
const order = await service.orderProduct('TDKG1', '08123456789');Memproses permintaan deposit.
Parameter:
amount: Jumlah deposit dalam Rupiah
Return: Promise<ApiResponse>
Contoh:
const deposit = await service.deposit(100000);
PropanaDisplayService.displayDepositResult(deposit);Mendapatkan status sesi saat ini.
Return: SessionState ('INITIAL' | 'LOGGED_IN' | 'OTP_SENT' | 'VERIFIED' | 'CONNECTED' | 'READY')
Mendapatkan informasi agen yang sedang login.
Return: AgentInfo
Menyimpan sesi ke file untuk penggunaan selanjutnya.
Memuat sesi yang tersimpan sebelumnya.
Menghapus data sesi saat ini.
Service untuk menampilkan hasil API dalam format yang mudah dibaca.
Menampilkan daftar produk dalam format tabel.
Menampilkan hasil pesanan produk.
Menampilkan hasil deposit dengan detail bank transfer.
Menampilkan informasi agen.
Format angka menjadi mata uang Rupiah.
Utility untuk input dari terminal.
Mendapatkan input dari user via terminal.
Menutup interface input.
| Variable | Deskripsi | Wajib | Default |
|---|---|---|---|
APP_KEY1 |
Kunci aplikasi utama | Ya | - |
APP_KEY2 |
Kunci aplikasi kedua | Ya | - |
FCM_TOKEN |
Token Firebase Cloud Messaging | Ya | - |
NODE_ENV |
Environment mode | Tidak | development |
DEBUG |
Mode debug | Tidak | false |
export const DEFAULT_DEVICE_INFO = {
deviceId: 'a2fc143605ca913f',
model: 'SAMSUNG',
androidId: '34475820',
versionCode: '1252',
appVersion: '510',
sdkVersion: '10'
};import {
PropanaService,
PropanaDisplayService,
InputUtil
} from 'propana-api-client';
async function processTransaction() {
const service = new PropanaService();
try {
console.log('π Memulai proses login...');
// Input kredensial
const agentId = await InputUtil.getUserInput('Masukkan ID Agen: ');
const phoneNumber = await InputUtil.getUserInput('Masukkan Nomor HP: ');
// Login
await service.login(agentId, phoneNumber);
console.log('β
Login berhasil');
// Minta OTP
await service.requestOTP();
console.log('π± OTP telah dikirim');
// Verifikasi OTP
const otp = await InputUtil.getUserInput('Masukkan kode OTP: ');
await service.verifyOTP(otp);
console.log('β
OTP terverifikasi');
// Setup koneksi
await service.establishConnection();
await service.initializeSession();
console.log('π Sesi siap digunakan');
// Tampilkan menu
console.log('\n=== MENU TRANSAKSI ===');
console.log('1. Lihat Daftar Produk');
console.log('2. Beli Produk');
console.log('3. Deposit');
const choice = await InputUtil.getUserInput('Pilih menu (1-3): ');
switch (choice) {
case '1':
const products = await service.getProductList();
PropanaDisplayService.displayProductList(products);
break;
case '2':
const productCode = await InputUtil.getUserInput('Masukkan kode produk: ');
const destination = await InputUtil.getUserInput('Masukkan nomor tujuan: ');
const order = await service.orderProduct(productCode, destination);
PropanaDisplayService.displayProductOrderResult(order);
break;
case '3':
const amountStr = await InputUtil.getUserInput('Masukkan jumlah deposit: ');
const amount = parseInt(amountStr);
if (isNaN(amount) || amount <= 0) {
throw new Error('Jumlah deposit tidak valid');
}
const deposit = await service.deposit(amount);
PropanaDisplayService.displayDepositResult(deposit);
break;
default:
console.log('Pilihan tidak valid');
}
// Simpan sesi
await service.saveSession();
console.log('πΎ Sesi tersimpan');
} catch (error) {
console.error('β Error:', error.message);
if (error.message.includes('OTP')) {
console.log('π‘ Pastikan kode OTP benar dan belum kadaluarsa');
} else if (error.message.includes('login')) {
console.log('π‘ Periksa kembali ID Agen dan nomor HP');
}
} finally {
InputUtil.closeInput();
}
}
processTransaction();async function resumeOrStartSession() {
const service = new PropanaService();
// Coba muat sesi yang tersimpan
const sessionLoaded = await service.loadSession();
if (sessionLoaded && service.getSessionState() === 'READY') {
console.log('π Menggunakan sesi tersimpan');
// Langsung gunakan API
const products = await service.getProductList();
PropanaDisplayService.displayProductList(products);
} else {
console.log('π Memulai sesi baru');
// Proses login lengkap
await service.login('PRID119932', '08123456789');
await service.requestOTP();
const otp = await InputUtil.getUserInput('Masukkan OTP: ');
await service.verifyOTP(otp);
await service.establishConnection();
await service.initializeSession();
await service.saveSession();
}
}try {
await service.login('INVALID_ID', '08123456789');
} catch (error) {
if (error.message.includes('login failed')) {
console.log('ID Agen atau nomor HP salah');
} else if (error.message.includes('network')) {
console.log('Periksa koneksi internet');
} else {
console.log('Error tidak diketahui:', error.message);
}
}async function robustTransaction() {
const service = new PropanaService();
let retryCount = 0;
const maxRetries = 3;
while (retryCount < maxRetries) {
try {
await service.login('PRID119932', '08123456789');
break; // Berhasil, keluar dari loop
} catch (error) {
retryCount++;
if (retryCount >= maxRetries) {
throw new Error(`Login gagal setelah ${maxRetries} percobaan: ${error.message}`);
}
console.log(`Percobaan ${retryCount} gagal, mencoba lagi...`);
await new Promise(resolve => setTimeout(resolve, 2000)); // Tunggu 2 detik
}
}
}1. FCM Token Error
Error: FCM token invalid
Solusi: Pastikan FCM_TOKEN di file .env valid dan tidak kadaluarsa.
2. Session Expired
Error: Session expired
Solusi: Hapus sesi dan login ulang:
await service.clearSession();
// Lakukan login ulang3. Network Error
Error: Network request failed
Solusi: Periksa koneksi internet dan pastikan server dapat diakses.