# Setup dari awal: qris.premnesia.shop di cPanel

## A. Yang HARUS lu ganti (semua milik orang lain di file awal)
- Domain: kode tidak hardcode domain, jadi cukup pasang app di qris.premnesia.shop (dokumentasi.txt sudah diganti).
- `.env`: pakai punya sendiri, jangan pakai MONGODB_URI / TELEGRAM_BOT_TOKEN / ADMIN_SECRET dari file lama.
- Contoh api_key, nomor HP, chat id di dokumentasi sudah dibuang.
- Upload gambar QR ke hosting orang lain sudah dihapus (QR sekarang dikirim sebagai base64).

## B. Domain & SSL
1. cPanel > Domains > Create A New Domain: `qris.premnesia.shop` (document root bebas, tidak dipakai).
2. Pastikan DNS premnesia.shop mengarah ke hosting ini. Kalau DNS di luar (Cloudflare dll), buat A record `qris` ke IP hosting.
3. cPanel > SSL/TLS Status > Run AutoSSL, tunggu sampai gembok aktif.

## C. Siapkan akun sendiri
1. Bot Telegram: chat @BotFather > /newbot > simpan token. Chat ID kamu: chat @userinfobot.
2. ADMIN_SECRET: string acak panjang (mis. `openssl rand -hex 24`).
3. Database, pilih satu di `DB_DRIVER`:
   - `json`: paling gampang, tanpa akun. Cocok buat tes / transaksi sedikit. Data di `local_database.json`.
   - `mongodb`: MongoDB Atlas gratis. Whitelist IP hosting, dan pastikan port 27017 outbound tidak diblokir.
   - `firebase`: Firestore + service account key (lewat HTTPS, aman dari blokir port).
4. Punya akun GoBiz merchant sendiri + string QRIS statisnya (untuk GoPay).

## D. Upload
Buat folder `nexpay` di home (BUKAN di public_html), upload:
`app.cjs`, `server.js`, `gobiz.js`, `package.json`, folder **`public/`** (berisi semua file .html termasuk `docs.html`, plus folder `assets/`), dan `.env` (rename dari `env.example`, isi nilai sendiri, termasuk `PUBLIC_BASE_URL=https://qris.premnesia.shop`).
Folder `integrasi/` tidak perlu diupload ke sini: itu untuk dipasang di website toko.
`firebase.js` tidak perlu.

## E. Setup Node.js App
cPanel > Setup Node.js App > Create Application
- Node.js version: 20 (minimal 18)
- Mode: Production
- Application root: `nexpay`
- Application URL: `qris.premnesia.shop`
- Startup file: `app.cjs`
Lalu Run NPM Install, lalu Restart.

## F. Cron keep-alive (Passenger mematikan app idle)
`* * * * * curl -s https://qris.premnesia.shop/health > /dev/null`

## G. Tes
- `curl https://qris.premnesia.shop/health` harus balas `{"ok":true,...}`
- Cek IP terbaca server:
  `curl -X POST https://qris.premnesia.shop/api/admin/check-ip -H "x-admin-secret: ADMIN_SECRET_KAMU"`
  Harus muncul IP kamu, bukan kosong / 127.0.0.1.

## G2. Dashboard admin
Buka `https://qris.premnesia.shop/admin`, masukkan `ADMIN_SECRET`. Dari sini merchant bisa didaftarkan (termasuk OTP GoPay),
webhook/kode unik/masa berlaku diatur, transaksi dipantau, dan QRIS uji dibuat. Langkah H di bawah masih bisa dipakai lewat curl.

## H. Daftarkan merchant
Semua endpoint daftar/login WAJIB header `x-admin-secret` (pakai kutip satu di terminal).

### ShopeePay
```
curl -X POST https://qris.premnesia.shop/api/shopee/daftar \
  -H 'Content-Type: application/json' \
  -H 'x-admin-secret: ADMIN_SECRET_LU' \
  -d '{"phone":"628xxxxxxxxxx","username":"namalu","name":"Nama Merchant","qr_string":"QRIS_STATIS_SHOPEE","shopee_token":"TOKEN_PARTNER_SHOPEE","telegram_chat_id":"CHAT_ID_LU","webhook_url":"https://URL-WEBHOOK-LU/callback/shopee"}'
```
- `qr_string`: string QRIS statis (harus mengandung `5802ID`).
- `shopee_token`: wajib supaya pembayaran terdeteksi. Diambil dari sesi login partner.shopee.co.id (field `token` di request get-transaction-list).
- `webhook_url`: wajib kalau mau deteksi otomatis di background. Kalau kosong, status hanya terdeteksi saat `/api/shopee/status` dipanggil.
- Update token kalau kedaluwarsa: `/api/shopee/login` (phone, username, shopee_token).

### GoPay
1. `curl -X POST https://qris.premnesia.shop/api/gopay/daftar -H 'Content-Type: application/json' -H 'x-admin-secret: ADMIN_SECRET_LU' -d '{"phone":"628xxx","username":"namalu","telegram_chat_id":"CHAT_ID","qr_string":"STRING_QRIS_STATIS"}'`
2. OTP masuk ke HP, lalu: `curl -X POST https://qris.premnesia.shop/api/gopay/login -H 'Content-Type: application/json' -H 'x-admin-secret: ADMIN_SECRET_LU' -d '{"phone":"628xxx","otp":"1234","username":"namalu","telegram_chat_id":"CHAT_ID"}'`

### Tes bikin QRIS
`curl -X POST https://qris.premnesia.shop/api/gopay/create-qris -H 'Authorization: Bearer API_KEY' -H 'Content-Type: application/json' -d '{"amount":10000}'`
Untuk Shopee: `/api/shopee/create-qris` dengan body `{"phone":"628xxx","api_key":"API_KEY","amount":10000}`.

## I. Kalau error
- Log: `stderr.log` di folder app, atau menu log di Setup Node.js App.
- `ERR_REQUIRE_ESM`: startup file harus `app.cjs`.
- Mongo timeout: whitelist IP di Atlas / port 27017 diblokir, pindah ke firebase atau json.

## J. Menyambungkan website toko
Lihat `INTEGRASI-TOKO.md` dan folder `integrasi/` (klien PHP + contoh checkout + contoh callback).
Ringkas: toko memanggil `create-qris` dengan `order_id` dan `amount`, mengarahkan pembeli ke `pay_url`, lalu menandai pesanan lunas dari webhook yang tanda tangannya valid.
Setelah update file, jalankan **Restart** di Setup Node.js App (cukup Run NPM Install jika `package.json` berubah; kali ini tidak ada dependency baru).


## I. Pembaruan v2.2
- Jalankan **Run NPM Install** lagi (dependensi baru: `jsqr`, `pngjs` untuk membaca QR dari foto).
- Pastikan SEMUA .html ada di `public/` (error `ENOENT .../public/login.html` di log berarti file belum di sana).
- Setelah upload, Restart app.
