Base URL: https://pga.lottonesia.org • Currency: IDR • Sign: UPPER(MD5(sorted_params&key=SECRET))
Setiap request wajib kirim merchant_id + sign. Buat sign dari semua field sign (tanpa sign itu sendiri), urut A-Z, gabung k=v dengan &, tambah &key=API_SECRET, MD5 uppercase.
PHP:
$sign = strtoupper(md5("amount=50000&channel=QRIS&merchant_id=MCH001¬ify_url=https://...&order_id=INV-001&key=s3cr3t"));
JS:
const crypto=require('crypto');
function sign(p,s){const k=Object.keys(p).sort().map(k=>k+'='+p[k]).join('&')+'&key='+s;return crypto.createHash('md5').update(k).digest('hex').toUpperCase();}
Python:
import hashlib
def sign(p,s):
q='&'.join(f"{k}={p[k]}" for k in sorted(p)) + f"&key={s}"
return hashlib.md5(q.encode()).hexdigest().upper(){
"merchant_id":"MCH001","order_id":"INV-001","amount":50000,"channel":"QRIS",
"notify_url":"https://merchant.com/lottopay_notify",
"return_url":"https://merchant.com/thanks",
"customer_name":"Budi","customer_email":"[email protected]","customer_phone":"0812xxxx",
"attach":"userid=123","sign":"..."
}
Response:
{"code":0,"msg":"success","data":{"trx_id":"LP...","order_id":"INV-001","amount":50000,"fee":1000,"channel":"QRIS","status":"PENDING","payment_link":"https://...","va_number":"","qr_string":"..."}}
Channel: QRIS, BCA, BRI, MANDIRI, BNI, PERMATA, CIMB, DANAMON, BSI, OCBC, DANA, OVO, GOPAY, SHOPEEPAY, LINKAJA. Lihat channels JSON. order_id unik per merchant (idempotent).
{"merchant_id":"MCH001","order_id":"INV-001","sign":"..."}
# atau pakai trx_id: {"merchant_id":"MCH001","trx_id":"LP...","sign":"..."}
Status: CREATED, PENDING, PAID, FAILEDLottoPay POST JSON ke notify_url saat status final. Balas HTTP 200 + SUCCESS.
{
"merchant_id":"MCH001","order_id":"INV-001","trx_id":"LP...",
"amount":"50000","paid_amount":"50000","status":"PAID",
"sign":"UPPER(MD5(amount=..&merchant_id=..&order_id=..&paid_amount=..&status=..&trx_id=..&key=SECRET))"
}{"merchant_id":"MCH001","order_id":"WD-001","amount":100000,"bank_code":"BCA","account_no":"1234567890","account_name":"BUDI","notify_url":"https://...","sign":"..."}
Query: POST /api/v1/payout_query.php {"merchant_id":"MCH001","order_id":"WD-001","sign":"..."}
Balance: GET /api/v1/balance.php?merchant_id=MCH001&sign=...
Fee payout default Rp5.000. Saldo terpotong saat create, refund otomatis jika FAILED.
0 sukses | 400 param salah | 401 sign/merchant salah | 402 saldo kurang | 404 order tidak ada | 409 duplicate | 500 server error
Upstream: StarPago v2 /api/v2/payment/order/create (appId, merOrderNo, amount, payMethod, extra.bankCode, notifyUrl, sign). Callback upstream: /callback/starpago_payin.php. Retry 9x 25 jam jika merchant tidak jawab SUCCESS.