Cost+Docs

PHP

SDK oficial de PHP para la pasarela de pago Cost+

SDK oficial de PHP para la pasarela de pago Cost+. Simplifica el flujo de redireccion HPP (pagina de pago alojada), la firma de payloads HMAC y la verificacion de webhooks.

Caracteristicas

  • Sin dependencias externas — usa solo extensiones PHP integradas (curl, json, hash)
  • PHP 8.1+ con propiedades readonly, argumentos con nombre y tipos estrictos
  • Generacion de firma HMAC-SHA256 y verificacion en tiempo constante via hash_equals
  • Mapeo automatico de snake_case/camelCase entre la API y el SDK
  • Analisis de webhooks + verificacion de pedidos basada en API
  • Probado en PHP 8.1, 8.2 y 8.3

Requisitos

  • PHP 8.1 o posterior
  • Extensiones: curl, json (ambas incluidas en PHP estandar)
  • Una cuenta de comerciante Cost+ — dashboard.costplus.io

Instalacion

composer require nopayn/sdk

Inicio rapido

1. Inicializar el cliente

use NoPayn\NoPaynClient;

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

2. Crear un pago y redirigir al 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. Gestionar el 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);

Referencia de la API

new NoPaynClient(array $config)

ParametroTipoObligatorioPredeterminado
apiKeystringSi
merchantIdstringSi
baseUrlstringNohttps://api.nopayn.co.uk

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

Crea un pedido via POST /v1/orders/.

ParametroTipoObligatorioDescripcion
amountintSiImporte en la unidad monetaria mas pequena (centimos)
currencystringSiCodigo ISO 4217 (EUR, GBP, USD, NOK, SEK)
merchantOrderIdstringNoTu referencia interna de pedido
descriptionstringNoDescripcion del pedido
returnUrlstringNoRedireccion despues de pago exitoso
failureUrlstringNoRedireccion en cancelacion/expiracion/error
webhookUrlstringNoNotificaciones asincronas de cambio de estado
localestringNoIdioma del HPP (en-GB, de-DE, nl-NL, etc.)
paymentMethodsstring[]NoFiltrar metodos del HPP
expirationPeriodstringNoDuracion ISO 8601 (PT30M)

Metodos de pago disponibles: credit-card, apple-pay, google-pay, vipps-mobilepay

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

Obtiene los detalles del pedido via GET /v1/orders/{id}/.

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

Emite un reembolso total o parcial via POST /v1/orders/{id}/refunds/.

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

Metodo de conveniencia que crea un pedido y devuelve:

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

Genera una firma HMAC-SHA256 en hexadecimal.

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

Verificacion en tiempo constante de una firma HMAC-SHA256.

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

Analiza el cuerpo del webhook, luego llama a GET /v1/orders/{id}/ para verificar el estado real.

Utilidades HMAC independientes

use NoPayn\Signature;

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

Gestion de errores

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
}

Estados del pedido

EstadoFinal?Descripcion
newNoPedido creado
processingNoPago en curso
completedSiPago exitoso — entregar los bienes
cancelledSiPago cancelado por el cliente
expiredSiEl enlace de pago expiro
errorSiFallo tecnico

Mejores practicas para webhooks

  1. Verifica siempre via la API — el payload del webhook solo contiene el ID del pedido, nunca el estado. El metodo verifyWebhook() del SDK hace esto automaticamente.
  2. Devuelve HTTP 200 para confirmar la recepcion. Cualquier otro codigo activa hasta 10 reintentos (cada 2 minutos).
  3. Implementa un poller de respaldo — para pedidos de mas de 10 minutos que no hayan alcanzado un estado final, consulta getOrder() como red de seguridad.
  4. Se idempotente — puedes recibir el mismo webhook multiples veces.

Tarjetas de prueba

Usa estas tarjetas en modo de prueba de Cost+ (sitio web sandbox):

TarjetaNumeroNotas
Visa (exito)4111 1111 1111 1111Cualquier CVV
Mastercard (exito)5544 3300 0003 7Cualquier CVV
Visa (rechazada)4111 1111 1111 1105Do Not Honor
Visa (fondos insuficientes)4111 1111 1111 1151Insufficient Funds

Usa cualquier fecha de caducidad futura y cualquier CVC de 3 digitos.

App de demostracion

Se incluye una app de demostracion basada en Docker en el repositorio de GitHub para probar el flujo completo de pago.

Soporte

Necesitas ayuda? Contacta a nuestro equipo de soporte en support@costplus.io.

On this page