To securely update transaction statuses in your database, do not rely on frontend callbacks. Instead, implement a webhook endpoint that listens for POST notifications from Midtrans. Use the transaction.notification(notificationJson) method to parse and validate the notification.
const midtransClient = require('midtrans-client');
let apiClient = new midtransClient.Snap({
isProduction : false,
serverKey : 'YOUR_SERVER_KEY',
clientKey : 'YOUR_CLIENT_KEY'
});
// This should be called inside your web server's POST route handler
apiClient.transaction.notification(notificationJson)
.then((statusResponse) => {
const { order_id, transaction_status, fraud_status } = statusResponse;
if (transaction_status === 'capture') {
if (fraud_status === 'challenge') {
// Handle challenge
} else if (fraud_status === 'accept') {
// Handle success
}
} else if (transaction_status === 'settlement') {
// Handle success
} else if (transaction_status === 'pending') {
// Handle pending
} else if (transaction_status === 'cancel' || transaction_status === 'expire') {
// Handle failure
}
});