Cost+Docs

Node.js / TypeScript

Officiellt Node.js SDK för Cost+ betalningsgateway

Officiellt Node.js/TypeScript SDK för Cost+ betalningsgateway. Förenklar HPP-omdirigeringsflödet (Hosted Payment Page), HMAC payload-signering och webhook-verifiering.

Funktioner

  • Inga beroenden — använder bara inbyggda Node.js crypto och fetch
  • Fullständiga TypeScript-typer med declaration maps
  • HMAC-SHA256 signaturgenerering och verifiering med konstant tid
  • Automatisk snake_case/camelCase-mappning mellan API:et och SDK:t
  • Webhook-tolkning + API-baserad orderverifiering
  • Testad med Node.js 18, 20 och 22

Krav

Installation

npm install nopayn-node-sdk

Snabbstart

1. Initiera 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. Skapa en betalning och omdirigera till HPP

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. Hantera 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-referens

new NoPaynClient(config)

ParameterTypObligatoriskStandard
apiKeystringJa
merchantIdstringJa
baseUrlstringNejhttps://api.nopayn.co.uk

client.createOrder(params)

Skapar en order via POST /v1/orders/.

ParameterTypObligatoriskBeskrivning
amountnumberJaBelopp i minsta valutaenhet (cent)
currencystringJaISO 4217-kod (EUR, GBP, USD, NOK, SEK)
merchantOrderIdstringNejDin interna orderreferens
descriptionstringNejOrderbeskrivning
returnUrlstringNejOmdirigering efter lyckad betalning
failureUrlstringNejOmdirigering vid avbrytning/utgång/fel
webhookUrlstringNejAsynkrona statusändringsnotifieringar
localestringNejHPP-språk (en-GB, de-DE, nl-NL, etc.)
paymentMethodsPaymentMethod[]NejFiltrera HPP-metoder
expirationPeriodstringNejISO 8601-duration (PT30M)

Tillgängliga betalningsmetoder: credit-card, apple-pay, google-pay, vipps-mobilepay

client.getOrder(orderId)

Hämtar orderdetaljer via GET /v1/orders/{id}/.

client.createRefund(orderId, amount, description?)

Utfärdar en fullständig eller partiell återbetalning via POST /v1/orders/{id}/refunds/.

client.generatePaymentUrl(params)

Bekvämlighetsmetod som skapar en order och returnerar:

{
  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)

Genererar en HMAC-SHA256 hex-signatur. Det kanoniska meddelandet är ${amount}:${currency}:${orderId}, signerat med API-nyckeln.

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

Verifiering med konstant tid av en HMAC-SHA256-signatur. Returnerar true om giltig.

client.verifyWebhook(rawBody)

Tolkar webhook-kroppen och anropar sedan GET /v1/orders/{id}/ för att verifiera faktisk status. Returnerar:

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

client.parseWebhookBody(rawBody)

Tolkar och validerar en webhook-kropp utan att anropa API:et.

Fristående HMAC-verktyg

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);

Felhantering

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
  }
}

Orderstatusar

StatusSlutgiltig?Beskrivning
newNejOrder skapad
processingNejBetalning pågår
completedJaBetalning lyckades — leverera varorna
cancelledJaBetalning avbruten av kunden
expiredJaBetalningslänken löpte ut
errorJaTekniskt fel

Bästa praxis för webhooks

  1. Verifiera alltid via API:et — webhook-payloaden innehåller bara order-ID:t, aldrig statusen. SDK:ts verifyWebhook() gör detta automatiskt.
  2. Returnera HTTP 200 för att bekräfta mottagandet. Annan kod utlöser upp till 10 omförsök (2 minuter emellan).
  3. Implementera en reservpoller — för ordrar äldre än 10 minuter som inte har nått slutgiltig status, polla getOrder() som säkerhetsnät.
  4. Var idempotent — du kan ta emot samma webhook flera gånger.

Testkort

Använd dessa kort i Cost+ testläge (sandbox-webbplats):

KortNummerNoteringar
Visa (lyckad)4111 1111 1111 1111Valfritt CVV
Mastercard (lyckad)5544 3300 0003 7Valfritt CVV
Visa (nekad)4111 1111 1111 1105Do Not Honor
Visa (otillräckligt saldo)4111 1111 1111 1151Insufficient Funds

Använd valfritt framtida utgångsdatum och valfri 3-siffrig CVC.

Demoapplikation

En Docker-baserad demoapplikation ingår i GitHub-repositoryt för att testa det fullständiga betalningsflödet:

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

Öppna http://localhost:3000 för att se demoutcheckningssidan.

Support

Behöver du hjälp? Kontakta vårt supportteam på support@costplus.io.

On this page