Cost+Docs

Ruby

SDK oficial de Ruby para la pasarela de pago Cost+

SDK oficial de Ruby 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

  • Generacion de firma HMAC-SHA256 y verificacion en tiempo constante
  • Mapeo automatico de snake_case desde la API a objetos OpenStruct amigables con Ruby
  • Analisis de webhooks + verificacion de pedidos basada en API
  • Probado en Ruby 3.1, 3.2 y 3.3
  • App de demostracion basada en Sinatra incluida

Requisitos

Instalacion

Agrega a tu Gemfile:

gem "nopayn"

Luego ejecuta:

bundle install

O instala directamente:

gem install nopayn

Inicio rapido

1. Inicializar el cliente

require "nopayn"

nopayn = NoPayn::Client.new(
  api_key:     "your-api-key",
  merchant_id: "your-project"
)

2. Crear un pago y redirigir al HPP

result = nopayn.generate_payment_url(
  amount:            1295,           # €12.95 in cents
  currency:          "EUR",
  merchant_order_id: "ORDER-001",
  description:       "Premium Widget",
  return_url:        "https://shop.example.com/success",
  failure_url:       "https://shop.example.com/failure",
  webhook_url:       "https://shop.example.com/webhook",
  locale:            "en-GB",
  expiration_period: "PT30M"
)

# Redirect the customer
# result.order_url   → HPP (customer picks payment method)
# result.payment_url → direct link to the first transaction's payment method
# result.signature   → HMAC-SHA256 for verification
# result.order_id    → NoPayn order UUID

3. Gestionar el webhook

post "/webhook" do
  request.body.rewind
  raw_body = request.body.read

  verified = nopayn.verify_webhook(raw_body)

  puts verified.order.status  # "completed", "cancelled", etc.
  puts verified.is_final      # true when the order won't change

  if verified.order.status == "completed"
    # Fulfil the order
  end

  status 200
end

Referencia de la API

NoPayn::Client.new(api_key:, merchant_id:, base_url:)

ParametroTipoObligatorioPredeterminado
api_keyStringSi
merchant_idStringSi
base_urlStringNohttps://api.nopayn.co.uk

client.create_order(params) -> OpenStruct

Crea un pedido via POST /v1/orders/.

ParametroTipoObligatorioDescripcion
:amountIntegerSiImporte en la unidad monetaria mas pequena (centimos)
:currencyStringSiCodigo ISO 4217 (EUR, GBP, USD, NOK, SEK)
:merchant_order_idStringNoTu referencia interna de pedido
:descriptionStringNoDescripcion del pedido
:return_urlStringNoRedireccion despues de pago exitoso
:failure_urlStringNoRedireccion en cancelacion/expiracion/error
:webhook_urlStringNoNotificaciones asincronas de cambio de estado
:localeStringNoIdioma del HPP (en-GB, de-DE, nl-NL, etc.)
:payment_methodsArray<String>NoFiltrar metodos del HPP
:expiration_periodStringNoDuracion ISO 8601 (PT30M)

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

client.get_order(order_id) -> OpenStruct

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

client.create_refund(order_id, amount, description: nil) -> OpenStruct

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

client.generate_payment_url(params) -> OpenStruct

Metodo de conveniencia que crea un pedido y devuelve:

result.order_id     # NoPayn order UUID
result.order_url    # HPP URL
result.payment_url  # Direct payment URL (first transaction)
result.signature    # HMAC-SHA256 of amount:currency:order_id
result.order        # Full order OpenStruct

client.generate_signature(amount, currency, order_id) -> String

Genera una firma HMAC-SHA256 en hexadecimal.

client.verify_signature(amount, currency, order_id, signature) -> Boolean

Verificacion en tiempo constante de una firma HMAC-SHA256.

client.verify_webhook(raw_body) -> OpenStruct

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

Utilidades HMAC independientes

require "nopayn"

sig = NoPayn::Signature.generate("your-api-key", 1295, "EUR", "order-uuid")
ok  = NoPayn::Signature.verify("your-api-key", 1295, "EUR", "order-uuid", sig)

Gestion de errores

begin
  nopayn.create_order(amount: 100, currency: "EUR")
rescue NoPayn::ApiError => e
  puts e.status_code  # 401, 400, etc.
  puts e.error_body   # Raw API error response
rescue NoPayn::Error => e
  puts e.message      # Network or parsing error
end
ExcepcionPadreDescripcion
NoPayn::ErrorStandardErrorError base para todos los errores del SDK
NoPayn::ApiErrorNoPayn::ErrorError HTTP de la API
NoPayn::WebhookErrorNoPayn::ErrorPayload de webhook invalido

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 verify_webhook 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 get_order 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 Sinatra 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