Cost+Docs

Node.js / TypeScript

Officielt Node.js SDK til Cost+ betalingsgateway

Officielt Node.js/TypeScript SDK til Cost+ betalingsgateway. Forenkler HPP (Hosted Payment Page) redirect-flowet, HMAC payload-signering og webhook-verificering.

Funktioner

  • Ingen afhængigheder — bruger kun Node.js' indbyggede crypto og fetch
  • Fulde TypeScript-typer med declaration maps
  • HMAC-SHA256 signaturgenerering og tidskonstant verificering
  • Automatisk snake_case/camelCase-mapping mellem API'et og SDK'et
  • Webhook-parsing + API-baseret ordreverificering
  • Testet på tværs af Node.js 18, 20 og 22

Krav

Installation

npm install nopayn-node-sdk

Hurtigstart

1. Initialiser klienten

import { NoPaynClient } from 'nopayn-node-sdk';

const nopayn = new NoPaynClient({
  apiKey: 'your-api-key',      // From the NoPayn merchant portal
  merchantId: 'your-project',  // Your project/merchant ID
});

2. Opret en betaling og omdiriger til HPP'en

const result = await nopayn.generatePaymentUrl({
  amount: 1295,            // €12.95 in cents
  currency: 'EUR',
  merchantOrderId: 'ORDER-001',
  description: 'Premium Widget',
  returnUrl: 'https://shop.example.com/success',
  failureUrl: 'https://shop.example.com/failure',
  webhookUrl: 'https://shop.example.com/webhook',
  locale: 'en-GB',
  expirationPeriod: 'PT30M',
});

// Redirect the customer
// result.orderUrl   → HPP (customer picks payment method)
// result.paymentUrl → direct link to the first transaction's payment method
// result.signature  → HMAC-SHA256 for verification
// result.orderId    → NoPayn order UUID

3. Håndter webhooken

app.post('/webhook', async (req, res) => {
  const verified = await nopayn.verifyWebhook(JSON.stringify(req.body));

  console.log(verified.order.status); // 'completed', 'cancelled', etc.
  console.log(verified.isFinal);      // true when the order won't change

  if (verified.order.status === 'completed') {
    // Fulfil the order
  }

  res.sendStatus(200);
});

API-reference

new NoPaynClient(config)

ParameterTypePåkrævetStandard
apiKeystringJa
merchantIdstringJa
baseUrlstringNejhttps://api.nopayn.co.uk

client.createOrder(params)

Opretter en ordre via POST /v1/orders/.

ParameterTypePåkrævetBeskrivelse
amountnumberJaBeløb i mindste valutaenhed (øre/cent)
currencystringJaISO 4217-kode (EUR, GBP, USD, NOK, SEK)
merchantOrderIdstringNejDin interne ordrereference
descriptionstringNejOrdrebeskrivelse
returnUrlstringNejOmdirigering efter vellykket betaling
failureUrlstringNejOmdirigering ved annullering/udløb/fejl
webhookUrlstringNejAsynkrone statusændringsnotifikationer
localestringNejHPP-sprog (en-GB, de-DE, nl-NL osv.)
paymentMethodsPaymentMethod[]NejFiltrer HPP-metoder
expirationPeriodstringNejISO 8601-varighed (PT30M)

Tilgængelige betalingsmetoder: credit-card, apple-pay, google-pay, vipps-mobilepay

client.getOrder(orderId)

Henter ordredetaljer via GET /v1/orders/{id}/.

client.createRefund(orderId, amount, description?)

Udsteder en fuld eller delvis refusion via POST /v1/orders/{id}/refunds/.

client.generatePaymentUrl(params)

Convenience-metode der opretter en ordre og returnerer:

{
  orderId: string;     // NoPayn order UUID
  orderUrl: string;    // HPP URL
  paymentUrl?: string; // Direct payment URL (first transaction)
  signature: string;   // HMAC-SHA256 of amount:currency:orderId
  order: Order;        // Full order object
}

client.generateSignature(amount, currency, orderId)

Genererer en HMAC-SHA256 hex-signatur. Den kanoniske besked er ${amount}:${currency}:${orderId}, signeret med API-nøglen.

client.verifySignature(amount, currency, orderId, signature)

Tidskonstant verificering af en HMAC-SHA256-signatur. Returnerer true hvis gyldig.

client.verifyWebhook(rawBody)

Parser webhook-kroppen og kalder derefter GET /v1/orders/{id}/ for at verificere den faktiske status. Returnerer:

{
  orderId: string;
  order: Order;     // Verified via API
  isFinal: boolean; // true for completed/cancelled/expired/error
}

client.parseWebhookBody(rawBody)

Parser og validerer en webhook-krop uden at kalde API'et.

Selvstændige HMAC-hjælpefunktioner

import { generateSignature, verifySignature } from 'nopayn-node-sdk';

const sig = generateSignature('your-api-key', 1295, 'EUR', 'order-uuid');
const ok  = verifySignature('your-api-key', 1295, 'EUR', 'order-uuid', sig);

Fejlhåndtering

import { NoPaynApiError, NoPaynError, NoPaynWebhookError } from 'nopayn-node-sdk';

try {
  await nopayn.createOrder({ amount: 100, currency: 'EUR' });
} catch (err) {
  if (err instanceof NoPaynApiError) {
    console.error(err.statusCode); // 401, 400, etc.
    console.error(err.errorBody);  // Raw API error response
  } else if (err instanceof NoPaynError) {
    console.error(err.message);    // Network or parsing error
  }
}

Ordrestatusser

StatusEndelig?Beskrivelse
newNejOrdre oprettet
processingNejBetaling i gang
completedJaBetaling vellykket — lever varerne
cancelledJaBetaling annulleret af kunden
expiredJaBetalingslink udløbet
errorJaTeknisk fejl

Webhook best practices

  1. Verificer altid via API'et — webhook-payloaden indeholder kun ordre-ID'et, aldrig status. SDK'ets verifyWebhook() gør dette automatisk.
  2. Returner HTTP 200 for at bekræfte modtagelsen. Enhver anden kode udløser op til 10 genforsøg (2 minutters mellemrum).
  3. Implementer en backup-poller — for ordrer ældre end 10 minutter, der ikke har nået en endelig status, poll getOrder() som sikkerhedsnet.
  4. Vær idempotent — du kan modtage den samme webhook flere gange.

Testkort

Brug disse kort i Cost+ testtilstand (sandbox-website):

KortNummerNoter
Visa (succes)4111 1111 1111 1111Vilkårlig CVV
Mastercard (succes)5544 3300 0003 7Vilkårlig CVV
Visa (afvist)4111 1111 1111 1105Do Not Honor
Visa (utilstrækkelig saldo)4111 1111 1111 1151Insufficient Funds

Brug en vilkårlig fremtidig udløbsdato og en vilkårlig 3-cifret CVC.

Demo-app

En Docker-baseret demo-app er inkluderet i GitHub-repositoriet til test af det fulde betalingsflow:

cd demo

cat > .env << EOF
NOPAYN_API_KEY=your-api-key
NOPAYN_MERCHANT_ID=your-merchant-id
PUBLIC_URL=http://localhost:3000
EOF

docker compose up --build

Åbn http://localhost:3000 for at se demo-checkout-siden.

Support

Brug for hjælp? Kontakt vores supportteam på support@costplus.io.

On this page