# Migrasi QRIS ke Belibayar dan BinderPay

Dokumen ini adalah checklist operator. Jangan menaruh API key, secret, atau private key di tiket, chat, screenshot, atau repository.

## Yang sudah ditangani oleh website

- Order baru dapat memilih `belibayar` atau `binderpay`.
- QRIS dibuat server-to-server dan payload QR dirender di invoice yang sama.
- Provider dan environment disimpan pada setiap order, sehingga pergantian gateway tidak mengubah order lama.
- Callback diverifikasi dengan signature resmi, reference dan nominal dicocokkan, lalu event diproses idempotent.
- Rekonsiliasi scheduler tetap mengecek pembayaran bila webhook terlambat.
- Pakasir dan DompetX tidak tampil sebagai pilihan baru. Kodenya hanya dipertahankan untuk histori/order lama.

## Sebelum deploy

1. Buat backup database dan folder website aktif.
2. Pastikan server memakai PHP 8.1+ dengan ekstensi OpenSSL dan cURL.
3. Pastikan cron menjalankan `php artisan schedule:run` setiap menit. Command `orders:reconcile` sudah dijadwalkan oleh aplikasi.
4. Catat IP publik/outbound server. Belibayar mewajibkan IP ini masuk whitelist.

## Setup Belibayar

1. Masuk dashboard Belibayar, buka **Kredensial**.
2. Salin API Key, Secret Key, dan Webhook Secret untuk environment yang sama.
3. Tambahkan IP outbound server ke **IP Whitelist**.
4. Isi callback URL dengan:

   `https://gtgstore.cloud/api/webhooks/belibayar`

5. Di admin GTGStore buka **Payment Gateway → Belibayar**.
6. Mulai dengan **Sandbox**, tempel tiga kredensial, lalu tekan **Uji Koneksi**.
7. Pilih Belibayar di tab **Ringkasan**, isi password admin, dan simpan.
8. Buat checkout uji, jalankan simulator Belibayar, lalu pastikan invoice berubah menjadi dibayar/dikirim hanya satu kali.
9. Setelah lulus, ganti ke **Production** dan gunakan API Key `byr_live_...` beserta secret production.

## Setup BinderPay

1. Siapkan Partner ID dan Private Key merchant yang sudah didaftarkan ke BinderPay.
2. Unduh public key callback resmi BinderPay dari halaman dokumentasinya (`/docs/binderpay-public.pem`).
3. Daftarkan callback QRIS ke:

   `https://gtgstore.cloud/api/webhooks/binderpay`

4. Konfirmasikan kepada support BinderPay bahwa endpoint signature callback yang dipakai adalah `/v1.0/qr/qr-mpm-notify`.
5. Di admin GTGStore buka **Payment Gateway → BinderPay**.
6. Pilih **Sandbox**, isi Partner ID, seluruh isi Private Key PEM, dan seluruh isi Public Key BinderPay PEM.
7. Tekan **Uji Koneksi**, pilih BinderPay di **Ringkasan**, isi password admin, lalu simpan.
8. Buat checkout uji dan pastikan callback mengubah order otomatis.
9. Setelah lulus, pilih **Production** dan masukkan kredensial production.

## Deploy source

Jalankan dari direktori aplikasi:

```bash
composer install --no-dev --optimize-autoloader
php artisan optimize:clear
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

Tidak ada migration database baru untuk integrasi ini; `migrate --force` tetap aman dan memastikan server tidak tertinggal migration lama.

## Uji penerimaan minimum

- Uji koneksi gateway berhasil di halaman admin.
- QR yang tampil dapat dipindai dan nominalnya sama dengan total invoice.
- Satu pembayaran mengubah order dari `PENDING_PAYMENT` ke `PAID`/`DELIVERED`.
- Pengiriman webhook yang sama dua kali tidak mengambil stok dua kali.
- Signature salah mendapat HTTP 401.
- Order tidak dikenal tidak dapat mengubah order lain.
- Scheduler dapat menemukan pembayaran paid ketika webhook sengaja tidak dikirim.

## Rollback cepat

Jika uji production gagal, aktifkan maintenance mode untuk customer, jangan menghapus order atau setting, dan kembalikan source dari backup. Invoice yang sudah terbuat menyimpan gateway asalnya; periksa order `PENDING_PAYMENT` secara manual sebelum mengubah kredensial.
