Cost+Docs

PHP

Officiellt PHP SDK för Cost+ betalningsgateway

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

Funktioner

  • Inga externa beroenden — använder bara inbyggda PHP-tillägg (curl, json, hash)
  • PHP 8.1+ med readonly properties, named arguments och strict types
  • HMAC-SHA256 signaturgenerering och verifiering med konstant tid via hash_equals
  • Automatisk snake_case/camelCase-mappning mellan API:et och SDK:t
  • Webhook-tolkning + API-baserad orderverifiering
  • Testad med PHP 8.1, 8.2 och 8.3

Krav

  • PHP 8.1 eller senare
  • Tillägg: curl, json (båda inkluderade i standard-PHP)
  • Ett Cost+-handelskonto — dashboard.costplus.io

Installation

composer require nopayn/sdk

Snabbstart

1. Initiera klienten

use NoPayn\NoPaynClient;

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

2. Skapa en betalning och omdirigera till 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. Hantera 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-referens

new NoPaynClient(array $config)

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

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

Skapar en order via POST /v1/orders/.

ParameterTypObligatoriskBeskrivning
amountintJaBelopp 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.)
paymentMethodsstring[]NejFiltrera HPP-metoder
expirationPeriodstringNejISO 8601-duration (PT30M)

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

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

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

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

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

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

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

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

Genererar en HMAC-SHA256 hex-signatur.

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

Verifiering med konstant tid av en HMAC-SHA256-signatur.

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

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

Fristående HMAC-verktyg

use NoPayn\Signature;

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

Felhantering

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
}

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.

Support

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

On this page