BoomPay/partners

Atos / Worldline

Plug BoomPay into Worldline's SIPS (Secure Internet Payment System) APM registry as a redirect method: your platform responds to SIPS payment requests with paymentMeanBrand BOOMPAY and handles the signed return before updating the SIPS order.

GatewaySIPS / Worldline APIRedirect APM

Worldline’s SIPS platform (used across European acquirers and merchant banks that Atos/Worldline serves) routes payments by paymentMeanBrand. Registering BOOMPAY as a brand in your SIPS environment means any SIPS merchant can enable Boomcoin through your platform’s dashboard — your APM handler creates the BoomPay intent, returns the redirect URL in SIPS’s expected shape, and handles the signed return before posting a SIPS notification to the merchant.

Registration

Register BoomPay as a paymentMeanBrand in your Worldline SIPS environment through your Worldline technical account manager. Provide the configuration below as the initial registration payload — Worldline’s partner onboarding process will confirm the exact schema for your contract type.

sips-registration.json
{
  "paymentMeanBrand": "BOOMPAY",
  "paymentMeanType": "REDIRECT",
  "displayLabel": "Boomcoin (BoomPay)",
  "currency": "BMC",
  "processingMode": "EXTERNAL_REDIRECT",
  "notificationUrl": "https://your-psp.example.com/boompay/return",
  "regions": ["GLOBAL"]
}

Flow

01

SIPS payment initialisation

Merchant's checkout submits a SIPS payment request with paymentMeanBrand: BOOMPAY.

02

Your handler creates intent

Your APM handler calls createIntent() and returns a redirectionUrl in SIPS's response format.

03

SIPS redirects customer

SIPS forwards the customer to BoomPay's hosted page via the redirectionUrl.

04

Customer pays

The customer approves from their Boom wallet on BoomPay's hosted page.

05

Signed return

BoomPay redirects to your return URL with paymentIntentId and X-Boom-Signature.

06

Notify merchant

Your handler verifies, confirms, and fires a SIPS notification to the merchant.

Code

atos/sips-boompay-handler.js
const BoomPay = require('boom-pay-sdk');

// Worldline SIPS routes a payment initialisation for paymentMeanBrand === 'BOOMPAY'
// to your APM handler. Create a BoomPay intent and return the redirect URL
// in SIPS's redirectionUrl response field.
async function handleSipsBoompayPayment(sipsRequest, merchant) {
  const boomPay = new BoomPay({
    apiKey: merchant.boompayApiKey,
    sandbox: process.env.NODE_ENV !== 'production',
  });

  const intent = await boomPay.payments.createIntent({
    amount: toBmc(sipsRequest.amount, sipsRequest.currencyCode),
    successUrl: `${process.env.PSP_BASE}/boompay/return?status=success&txn=${sipsRequest.transactionReference}&mid=${merchant.id}`,
    failureUrl: `${process.env.PSP_BASE}/boompay/return?status=failure&txn=${sipsRequest.transactionReference}&mid=${merchant.id}`,
    label: `SIPS ${sipsRequest.transactionReference}`,
    metadata: {
      sipsTransactionRef: sipsRequest.transactionReference,
      merchantId: merchant.id,
    },
  });

  // SIPS APM response: provide a redirectionUrl for SIPS to forward
  // the customer to, plus your automaticResponseUrl for server-to-server
  // notification (your return handler serves both roles here).
  return {
    responseCode: '00', // 00 = success / proceed
    redirectionUrl: intent.link,
    automaticResponseUrl: `${process.env.PSP_BASE}/boompay/return`,
    transactionReference: sipsRequest.transactionReference,
    paymentMeanBrand: 'BOOMPAY',
  };
}

// SIPS uses ISO 4217 numeric currency codes and amounts in minor units.
function toBmc(minorUnitAmount, currencyCode) {
  const majorUnit = minorUnitAmount / 100;
  return majorUnit; // placeholder -- replace with real FX conversion
}
atos/boompay-return.js
const crypto = require('crypto');

// BoomPay redirects the customer's browser here. SIPS also posts its own
// automaticResponse to this route (or a separate endpoint -- your SIPS
// integration determines which). Verify BoomPay's signature first.
async function handleBoompayReturn(req, res) {
  const { txn: transactionRef, mid, status } = req.query;
  const intentId = req.query.paymentIntentId;
  const signature = (req.query['X-Boom-Signature'] || '').replace(/ /g, '+');
  const merchant = await db.getMerchant(mid);

  const expected = crypto
    .createHmac('sha1', merchant.boompayApiKey)
    .update(intentId)
    .digest('base64');

  if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
    return res.status(403).send('Signature verification failed');
  }

  const boomPay = new BoomPay({ apiKey: merchant.boompayApiKey, sandbox: process.env.NODE_ENV !== 'production' });
  const payment = await boomPay.payments.getPayment(intentId);

  if (status === 'success' && payment.paidAt) {
    await db.markTransactionPaid(transactionRef, { provider: 'boompay', reference: intentId });
    await sipsNotify(merchant, 'PAID', transactionRef);
    return res.redirect(merchant.sipsSuccessUrl);
  }

  await db.markTransactionFailed(transactionRef);
  await sipsNotify(merchant, 'FAILED', transactionRef);
  res.redirect(merchant.sipsFailureUrl);
}
!

SIPS field names and response shapes vary between Worldline API versions (SIPS 2.x vs Paypage vs JSON API). The handler above uses illustrative field names based on SIPS 2 conventions — confirm exact field names against your Worldline contract’s API reference before building against them.

Go-live checklist

  • Complete Worldline’s APM partner registration — BOOMPAY as a brand won’t route until it’s provisioned in your SIPS environment.
  • Implement toBmc() with a real conversion rate; SIPS amounts are in minor units.
  • Verify your SIPS automaticResponseUrl is configured correctly so server-to-server notifications reach your handler independently of the browser redirect.
  • Run end-to-end in SIPS test mode (not just BoomPay sandbox) before going live.