Cost+Docs

PHP

Offisiell PHP SDK for Cost+ betalingsgateway

Offisiell PHP SDK for Cost+ betalingsgateway. Forenkler HPP (Hosted Payment Page) videresendingsflyten, HMAC-signering av innhold og webhook-verifisering.

Funksjoner

  • Null eksterne avhengigheter — bruker kun innebygde PHP-utvidelser (curl, json, hash)
  • PHP 8.1+ med readonly-egenskaper, navngitte argumenter og strenge typer
  • HMAC-SHA256 signaturgenerering og konstanttids-verifisering via hash_equals
  • Automatisk snake_case/camelCase-kartlegging mellom API og SDK
  • Webhook-parsing + API-basert ordreverifisering
  • Testet på tvers av PHP 8.1, 8.2 og 8.3

Krav

  • PHP 8.1 eller nyere
  • Utvidelser: curl, json (begge inkludert i standard PHP)
  • En Cost+ forhandlerkonto — dashboard.costplus.io

Installasjon

composer require nopayn/sdk

Hurtigstart

1. Initialiser klienten

use NoPayn\NoPaynClient;

$nopayn = new NoPaynClient([
    'apiKey'     => 'your-api-key',
    'merchantId' => 'your-project',
]);

2. Opprett en betaling og videresend til HPP

$result = $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
header('Location: ' . ($result['paymentUrl'] ?? $result['orderUrl']));

3. Håndter webhooken

$rawBody  = file_get_contents('php://input');
$verified = $nopayn->verifyWebhook($rawBody);

echo $verified['order']['status']; // 'completed', 'cancelled', etc.
echo $verified['isFinal'];        // true when the order won't change

if ($verified['order']['status'] === 'completed') {
    // Fulfil the order
}

http_response_code(200);

API-referanse

new NoPaynClient(array $config)

ParameterTypePåkrevdStandard
apiKeystringJa
merchantIdstringJa
baseUrlstringNeihttps://api.nopayn.co.uk

$client->createOrder(array $params): array

Oppretter en ordre via POST /v1/orders/.

ParameterTypePåkrevdBeskrivelse
amountintJaBeløp i minste valutaenhet (øre/cent)
currencystringJaISO 4217-kode (EUR, GBP, USD, NOK, SEK)
merchantOrderIdstringNeiDin interne ordrereferanse
descriptionstringNeiOrdrebeskrivelse
returnUrlstringNeiVideresending etter vellykket betaling
failureUrlstringNeiVideresending ved avbrudd/utløp/feil
webhookUrlstringNeiAsynkrone statusendringsvarsler
localestringNeiHPP-språk (en-GB, de-DE, nl-NL, osv.)
paymentMethodsstring[]NeiFiltrer HPP-metoder
expirationPeriodstringNeiISO 8601-varighet (PT30M)

Tilgjengelige betalingsmetoder: credit-card, apple-pay, google-pay, vipps-mobilepay

$client->getOrder(string $orderId): array

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

$client->createRefund(string $orderId, int $amount, ?string $description = null): array

Utsteder en full eller delvis refusjon via POST /v1/orders/{id}/refunds/.

$client->generatePaymentUrl(array $params): array

Bekvemmelighetsmetode som oppretter 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'      => array,    // Full order object
]

$client->generateSignature(int $amount, string $currency, string $orderId): string

Genererer en HMAC-SHA256 hex-signatur.

$client->verifySignature(int $amount, string $currency, string $orderId, string $signature): bool

Konstanttids-verifisering av en HMAC-SHA256-signatur.

$client->verifyWebhook(string $rawBody): array

Parser webhook-kroppen, kaller deretter GET /v1/orders/{id}/ for å verifisere faktisk status.

Frittstående HMAC-verktøy

use NoPayn\Signature;

$sig = Signature::generate('your-api-key', 1295, 'EUR', 'order-uuid');
$ok  = Signature::verify('your-api-key', 1295, 'EUR', 'order-uuid', $sig);

Feilhåndtering

use NoPayn\Exceptions\ApiException;
use NoPayn\Exceptions\NoPaynException;
use NoPayn\Exceptions\WebhookException;

try {
    $nopayn->createOrder(['amount' => 100, 'currency' => 'EUR']);
} catch (ApiException $e) {
    echo $e->getStatusCode(); // 401, 400, etc.
    print_r($e->getErrorBody()); // Raw API error response
} catch (NoPaynException $e) {
    echo $e->getMessage(); // Network or parsing error
}

Ordrestatuser

StatusEndelig?Beskrivelse
newNeiOrdre opprettet
processingNeiBetaling pågår
completedJaBetaling vellykket — lever varene
cancelledJaBetaling avbrutt av kunden
expiredJaBetalingslenken utløp
errorJaTeknisk feil

Beste praksis for webhooks

  1. Verifiser alltid via API-et — webhook-innholdet inneholder kun ordre-ID-en, aldri statusen. SDK-ens verifyWebhook() gjør dette automatisk.
  2. Returner HTTP 200 for å bekrefte mottak. Enhver annen kode utløser opptil 10 nye forsøk (2 minutters mellomrom).
  3. Implementer en reservepoller — for ordrer eldre enn 10 minutter som ikke har nådd en endelig status, poll getOrder() som sikkerhetsnett.
  4. Vær idempotent — du kan motta samme webhook flere ganger.

Testkort

Bruk disse kortene i Cost+ testmodus (sandbox-nettsted):

KortNummerMerknader
Visa (vellykket)4111 1111 1111 1111Valgfritt CVV
Mastercard (vellykket)5544 3300 0003 7Valgfritt CVV
Visa (avvist)4111 1111 1111 1105Do Not Honor
Visa (utilstrekkelige midler)4111 1111 1111 1151Insufficient Funds

Bruk en hvilken som helst fremtidig utløpsdato og en hvilken som helst 3-sifret CVC.

Demoapp

En Docker-basert demoapp er inkludert i GitHub-repositoriet for testing av den fullstendige betalingsflyten.

Kundestøtte

Trenger du hjelp? Kontakt kundestøtteteamet vårt på support@costplus.io.

On this page