Payment Gateway Proxy for OrderKuota QRIS
https://orkut.rizzskibidi.my.id
All endpoints return JSON with consistent structure:
{
"success": true,
"data": { ... }
}
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "Human readable message"
}
}
/api/auth/otp
Request OTP for authentication
{
"username": "your_username",
"password": "your_password"
}
{
"success": true,
"data": {
"results": {
"otp_value": "u***@gmail.com"
}
}
}
/api/auth/token
Get authentication token using OTP
{
"username": "your_username",
"otp": "123456"
}
{
"success": true,
"data": {
"results": {
"token": "abc123:xyz789",
"id": "12345",
"name": "User Name",
"balance": "100000"
}
}
}
/api/qris/generate
Generate dynamic QRIS from static QRIS with unique amount
{
"username": "your_username",
"token": "abc123:xyz789",
"amount": 50000,
"qris_static": "00020101021126670016COM.NOBUBANK.WWW..."
}
{
"success": true,
"data": {
"transaction_id": "550e8400-e29b-41d4-a716-446655440000",
"base_amount": 50000,
"unique_suffix": 123,
"final_amount": 50123,
"qris_string": "00020101021226...",
"expires_at": 1734567890
}
}
Note: Converts static QRIS to dynamic QRIS. Amount will be added with unique suffix (1-999) to prevent collision. QRIS expires in 10 minutes.
/api/qris/check
Check payment status
{
"username": "your_username",
"token": "abc123:xyz789",
"transaction_id": "550e8400-e29b-41d4-a716-446655440000"
}
{
"success": true,
"data": {
"status": "pending",
"final_amount": 50123,
"expires_in": 540
}
}
{
"success": true,
"data": {
"status": "paid",
"final_amount": 50123,
"paid_at": 1734567890
}
}
{
"success": true,
"data": {
"status": "expired"
}
}
/api/account/balance
Check account balance
{
"username": "your_username",
"token": "abc123:xyz789"
}
{
"success": true,
"data": {
"balance": 100000,
"qris_balance": 50000
}
}
/api/qris/image
Generate QR code image from QRIS string
{
"qris_string": "00020101021226...",
"size": 300,
"format": "png"
}
{
"success": true,
"data": {
"qr_image": "data:image/png;base64,iVBORw0KGgo...",
"size": 300,
"format": "png"
}
}
Note: Size range: 100-1000px. Format: png or jpeg. Returns base64 data URL.
/api/health
Health check endpoint
{
"success": true,
"data": {
"status": "ok",
"timestamp": 1734567890
}
}
const BASE_URL = 'https://orderkuota-proxy.vercel.app';
async function generatePayment(username, token, amount, qrisStatic) {
const res = await fetch(`${BASE_URL}/api/qris/generate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, token, amount, qris_static: qrisStatic })
});
return res.json();
}
async function checkPayment(username, token, transactionId) {
const res = await fetch(`${BASE_URL}/api/qris/check`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username,
token,
transaction_id: transactionId
})
});
return res.json();
}
// Usage
const QRIS_STATIC = '00020101021126670016COM.NOBUBANK.WWW...';
const payment = await generatePayment('user', 'token', 50000, QRIS_STATIC);
console.log('Pay:', payment.data.final_amount);
console.log('QRIS:', payment.data.qris_string);
// After user pays, check status
const status = await checkPayment('user', 'token', payment.data.transaction_id);
if (status.data.status === 'paid') {
console.log('Payment received!');
}
# Generate QRIS
curl -X POST https://orderkuota-proxy.vercel.app/api/qris/generate \
-H "Content-Type: application/json" \
-d '{"username":"user","token":"abc:xyz","amount":50000,"qris_static":"00020101021126670016COM.NOBUBANK.WWW..."}'
# Check Payment
curl -X POST https://orderkuota-proxy.vercel.app/api/qris/check \
-H "Content-Type: application/json" \
-d '{"username":"user","token":"abc:xyz","transaction_id":"uuid-here"}'
| Code | Description |
|---|---|
| MISSING_PARAMS | Required parameters missing |
| INVALID_AMOUNT | Amount must be positive number |
| OTP_ERROR | Failed to request OTP |
| TOKEN_ERROR | Failed to get token |
| QRIS_ERROR | Failed to generate QRIS |
| CHECK_ERROR | Failed to check payment |
| BALANCE_ERROR | Failed to get balance |
| IMAGE_ERROR | Failed to generate QR image |