Test your payment integration in a safe sandbox environment
Test payment flows without any real transactions or money involved
Create test QRIS payment codes with customizable amounts and details
Simulate payment completion and trigger callbacks to your server
Track payment status and callback delivery in real-time
The simulator is fully functional and ready for development testing. All payments created here are in sandbox mode.
The Payment Simulator is a secure sandbox environment where you can test your payment integration before going live. You can create test QRIS payments, simulate payment completion, and verify that your callback handlers work correctly.
Visit https://cicis.online/simulator to open the payment simulator interface.
Fill in the payment form with test details:
The simulator generates a QRIS QR code that you can scan or display in your application. This is identical to production QR codes.
Click the "Simulate Payment" button to instantly mark the payment as completed. This triggers a real callback to your registered endpoint.
Check your server logs to confirm that the callback was received and processed correctly. Verify that your order status was updated.
You can also create test payments programmatically using the regular payment API. The simulator works with the same endpoints as production.
# Create a test QRIS payment
curl -X POST https://cicis.online/api/qris/initiate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amount": 50000,
"order_id": "TEST-001",
"customer_name": "Test Customer",
"customer_email": "test@example.com",
"customer_phone": "+6281234567890",
"callback_url": "https://yourdomain.com/payment-callback",
"description": "Test Payment"
}'
# Check payment status
curl -X GET "https://cicis.online/api/qris/check-status/TEST-001" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const axios = require('axios');
// Create test payment
async function createTestPayment() {
try {
const response = await axios.post(
'https://cicis.online/api/qris/initiate',
{
amount: 50000,
order_id: 'TEST-001',
customer_name: 'Test Customer',
customer_email: 'test@example.com',
customer_phone: '+6281234567890',
callback_url: 'https://yourdomain.com/payment-callback',
description: 'Test Payment'
},
{
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
}
);
console.log('Payment created:', response.data);
return response.data;
} catch (error) {
console.error('Error:', error.response.data);
}
}
// Check payment status
async function checkPaymentStatus(orderId) {
try {
const response = await axios.get(
`https://cicis.online/api/qris/check-status/${orderId}`,
{
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
}
);
console.log('Payment status:', response.data);
return response.data;
} catch (error) {
console.error('Error:', error.response.data);
}
}
Payment created: nullPayment status: null
import requests
import json
API_TOKEN = 'YOUR_ACCESS_TOKEN'
BASE_URL = 'https://cicis.online/api'
headers = {
'Authorization': f'Bearer {API_TOKEN}',
'Content-Type': 'application/json'
}
# Create test payment
def create_test_payment():
payload = {
'amount': 50000,
'order_id': 'TEST-001',
'customer_name': 'Test Customer',
'customer_email': 'test@example.com',
'customer_phone': '+6281234567890',
'callback_url': 'https://yourdomain.com/payment-callback',
'description': 'Test Payment'
}
response = requests.post(
f'{BASE_URL}/qris/initiate',
json=payload,
headers=headers
)
print('Payment created:')
print(json.dumps(response.json(), indent=2))
return response.json()
# Check payment status
def check_payment_status(order_id):
response = requests.get(
f'{BASE_URL}/qris/check-status/{order_id}',
headers=headers
)
print('Payment status:')
print(json.dumps(response.json(), indent=2))
return response.json()
# Usage
if __name__ == '__main__':
create_test_payment()
check_payment_status('TEST-001')
Once you have a QRIS code generated, you can simulate payment completion:
# Simulate payment completion (triggers callback)
curl -X POST https://cicis.online/simulator/simulate-payment \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"order_id": "TEST-001"
}'
// Simulate payment completion
async function simulatePayment(orderId) {
try {
const response = await axios.post(
'https://cicis.online/simulator/simulate-payment',
{ order_id: orderId },
{
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
}
);
console.log('Payment simulated:', response.data);
return response.data;
} catch (error) {
console.error('Error:', error.response.data);
}
}
// Usage
simulatePayment('TEST-001');
Payment simulated: null
Use these tools to verify your callback endpoint is working correctly:
Create a public URL for your localhost:
ngrok http 8000
Get a unique URL to capture and inspect requests from the simulator
Check your application logs for incoming callback requests
Verify callback_sent_at timestamp and callback_response in winpay_orders table
In the Payment Simulator, you can view a complete history of all test payments created, including:
curl https://yourdomain.com/callbacknslookup yourdomain.com# Download and run ngrok
./ngrok http 8000
# This gives you a public URL like:
# https://abc123.ngrok.io
# Use this in your callback URL:
# https://abc123.ngrok.io/payment-callback
# View incoming requests at:
# http://localhost:4040
| Feature | Simulator | Production |
|---|---|---|
| Real Transactions | No | Yes |
| QRIS Generation | Yes | Yes |
| Payment Simulation | Yes | No (Real payments) |
| Callback Delivery | Yes | Yes |
| Webhook Signing | Yes | Yes |
| Retry Logic | Yes | Yes |
| Error Scenarios | Limited | All Types |
| Rate Limits | No | Yes |
Once you've thoroughly tested your integration in the simulator:
For additional support with the payment simulator, please visit our Support Page or contact our development team.