type CreatePaymentPayload = {
api_version: string;
data: {
token: string;
status: 'P_INITIATED' | 'P_RECEIVED' | 'P_FAILED' | 'P_REJECTED' | 'P_SETTLED';
request_id: string;
order_id: string;
trace_reference?: string;
msg_id?: string;
created_at: string;
};
};
const aggregatorMerchantIdentifier = process.env.SAFEPAY_AGGREGATOR_MERCHANT_IDENTIFIER;
if (!aggregatorMerchantIdentifier) {
throw new Error('Missing SAFEPAY_AGGREGATOR_MERCHANT_IDENTIFIER');
}
const paymentResponse = await fetch(
`${process.env.SAFEPAY_BASE_URL}/v1/aggregators/${process.env.SAFEPAY_AGGREGATOR_ID}/payments`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-SFPY-AGGREGATOR-SECRET-KEY': process.env.SAFEPAY_SECRET_KEY ?? '',
},
body: JSON.stringify({
request_id: crypto.randomUUID(),
amount: 7500,
aggregator_merchant_identifier: aggregatorMerchantIdentifier,
order_id: 'ORDER-2025-042',
type: 'RTP_NOW',
expiry_in_minutes: 30,
debitor_iban: 'PK36SCBL0000001123456702',
}),
},
);
if (!paymentResponse.ok) {
const error = await paymentResponse.json();
throw new Error(`Payment failed: ${paymentResponse.status} ${error.message}`);
}
const paymentPayload: CreatePaymentPayload = await paymentResponse.json();
console.log('Payment status', paymentPayload.data.status);