Cost+Docs

PHP

Virallinen PHP SDK Cost+-maksuportille

Virallinen PHP SDK Cost+-maksuportille. Yksinkertaistaa HPP (isännöidyn maksusivun) uudelleenohjausta, HMAC-allekirjoitusta ja webhook-vahvistusta.

Ominaisuudet

  • Nolla ulkoista riippuvuutta — käyttää vain PHP:n sisäänrakennettuja laajennuksia (curl, json, hash)
  • PHP 8.1+ readonly-ominaisuuksilla, nimetyillä argumenteilla ja tiukoilla tyypeillä
  • HMAC-SHA256-allekirjoituksen luonti ja vakioaikainen vahvistus hash_equals-funktiolla
  • Automaattinen snake_case/camelCase-muunnos API:n ja SDK:n välillä
  • Webhook-jäsennys + API-pohjainen tilauksen vahvistus
  • Testattu PHP 8.1-, 8.2- ja 8.3-versioilla

Vaatimukset

  • PHP 8.1 tai uudempi
  • Laajennukset: curl, json (molemmat sisältyvät PHP:n vakioasennukseen)
  • Cost+-kauppiastili — dashboard.costplus.io

Asennus

composer require nopayn/sdk

Pikaopas

1. Alusta asiakas

use NoPayn\NoPaynClient;

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

2. Luo maksu ja ohjaa HPP:hen

$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. Käsittele webhook

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

new NoPaynClient(array $config)

ParametriTyyppiPakollinenOletus
apiKeystringKyllä
merchantIdstringKyllä
baseUrlstringEihttps://api.nopayn.co.uk

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

Luo tilauksen kutsulla POST /v1/orders/.

ParametriTyyppiPakollinenKuvaus
amountintKylläSumma pienimmässä valuuttayksikössä (senteissä)
currencystringKylläISO 4217 -koodi (EUR, GBP, USD, NOK, SEK)
merchantOrderIdstringEiOma sisäinen tilausviitteesi
descriptionstringEiTilauksen kuvaus
returnUrlstringEiUudelleenohjaus onnistuneen maksun jälkeen
failureUrlstringEiUudelleenohjaus peruutuksen/vanhenemisen/virheen yhteydessä
webhookUrlstringEiAsynkroniset tilanmuutosilmoitukset
localestringEiHPP:n kieli (en-GB, de-DE, nl-NL jne.)
paymentMethodsstring[]EiSuodata HPP:n maksutapoja
expirationPeriodstringEiISO 8601 -kesto (PT30M)

Käytettävissä olevat maksutavat: credit-card, apple-pay, google-pay, vipps-mobilepay

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

Hakee tilauksen tiedot kutsulla GET /v1/orders/{id}/.

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

Tekee täyden tai osittaisen palautuksen kutsulla POST /v1/orders/{id}/refunds/.

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

Apumetodi, joka luo tilauksen ja palauttaa:

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

Luo HMAC-SHA256 hex-allekirjoituksen.

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

Vakioaikainen HMAC-SHA256-allekirjoituksen vahvistus.

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

Jäsentää webhook-rungon ja kutsuu sitten GET /v1/orders/{id}/ varmistaakseen todellisen tilan.

Erilliset HMAC-apufunktiot

use NoPayn\Signature;

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

Virheenkäsittely

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
}

Tilausten tilat

TilaLopullinen?Kuvaus
newEiTilaus luotu
processingEiMaksu käynnissä
completedKylläMaksu onnistui — toimita tavarat
cancelledKylläAsiakas peruutti maksun
expiredKylläMaksulinkki vanheni
errorKylläTekninen virhe

Webhook-parhaat käytännöt

  1. Vahvista aina API:n kautta — webhook-data sisältää vain tilauksen tunnisteen, ei koskaan tilaa. SDK:n verifyWebhook() tekee tämän automaattisesti.
  2. Palauta HTTP 200 kuittauksena. Mikä tahansa muu koodi käynnistää enintään 10 uudelleenyritystä (2 minuutin välein).
  3. Toteuta varapolleri — yli 10 minuuttia vanhoille tilauksille, jotka eivät ole saavuttaneet lopullista tilaa, pollaa getOrder() turvavarana.
  4. Ole idempotentti — saatat vastaanottaa saman webhookin useita kertoja.

Testikortit

Käytä näitä kortteja Cost+:n testitilassa (sandbox-verkkosivusto):

KorttiNumeroHuomautukset
Visa (onnistunut)4111 1111 1111 1111Mikä tahansa CVV
Mastercard (onnistunut)5544 3300 0003 7Mikä tahansa CVV
Visa (hylätty)4111 1111 1111 1105Do Not Honor
Visa (riittämätön kate)4111 1111 1111 1151Insufficient Funds

Käytä mitä tahansa tulevaa voimassaolopäivää ja mitä tahansa 3-numeroista CVC:tä.

Demosovellus

Docker-pohjainen demosovellus sisältyy GitHub-tietovarastoon täyden maksukulun testaamiseksi.

Tuki

Tarvitsetko apua? Ota yhteyttä tukitiimiimme osoitteessa support@costplus.io.

On this page