Cost+Docs

PHP

Officielt PHP SDK til Cost+ betalingsgateway

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

Funktioner

  • Ingen eksterne afhængigheder — bruger kun indbyggede PHP-udvidelser (curl, json, hash)
  • PHP 8.1+ med readonly properties, named arguments og strict types
  • HMAC-SHA256 signaturgenerering og tidskonstant verificering via hash_equals
  • Automatisk snake_case/camelCase-mapping mellem API'et og SDK'et
  • Webhook-parsing + API-baseret ordreverificering
  • Testet på tværs af PHP 8.1, 8.2 og 8.3

Krav

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

Installation

composer require nopayn/sdk

Hurtigstart

1. Initialiser klienten

use NoPayn\NoPaynClient;

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

2. Opret en betaling og omdiriger til HPP'en

$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-reference

new NoPaynClient(array $config)

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

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

Opretter en ordre via POST /v1/orders/.

ParameterTypePåkrævetBeskrivelse
amountintJaBelø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.)
paymentMethodsstring[]NejFiltrer HPP-metoder
expirationPeriodstringNejISO 8601-varighed (PT30M)

Tilgængelige 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

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

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

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'      => 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

Tidskonstant verificering af en HMAC-SHA256-signatur.

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

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

Selvstændige HMAC-hjælpefunktioner

use NoPayn\Signature;

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

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

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.

Support

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

On this page