Cost+Docs

Ruby

SDK oficial Ruby para o gateway de pagamento Cost+

SDK oficial Ruby para o gateway de pagamento Cost+. Simplifica o fluxo de redirecionamento HPP (Página de Pagamento Alojada), assinatura de payloads HMAC e verificação de webhooks.

Funcionalidades

  • Geração de assinaturas HMAC-SHA256 e verificação em tempo constante
  • Mapeamento automático snake_case da API para objetos OpenStruct amigáveis ao Ruby
  • Análise de webhooks + verificação de encomendas baseada na API
  • Testado com Ruby 3.1, 3.2 e 3.3
  • Aplicação de demonstração baseada em Sinatra incluída

Requisitos

Instalação

Adicione ao seu Gemfile:

gem "nopayn"

Depois execute:

bundle install

Ou instale diretamente:

gem install nopayn

Início Rápido

1. Inicializar o Cliente

require "nopayn"

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

2. Criar um Pagamento e Redirecionar para o 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. Tratar o 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

Referência da API

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

ParâmetroTipoObrigatórioPredefinição
api_keyStringSim
merchant_idStringSim
base_urlStringNãohttps://api.nopayn.co.uk

client.create_order(params) -> OpenStruct

Cria uma encomenda via POST /v1/orders/.

ParâmetroTipoObrigatórioDescrição
:amountIntegerSimMontante na menor unidade monetária (cêntimos)
:currencyStringSimCódigo ISO 4217 (EUR, GBP, USD, NOK, SEK)
:merchant_order_idStringNãoA sua referência interna da encomenda
:descriptionStringNãoDescrição da encomenda
:return_urlStringNãoRedirecionamento após pagamento bem-sucedido
:failure_urlStringNãoRedirecionamento em cancelamento/expiração/erro
:webhook_urlStringNãoNotificações assíncronas de alteração de estado
:localeStringNãoIdioma do HPP (en-GB, de-DE, nl-NL, etc.)
:payment_methodsArray<String>NãoFiltrar métodos do HPP
:expiration_periodStringNãoDuração ISO 8601 (PT30M)

Métodos de pagamento disponíveis: credit-card, apple-pay, google-pay, vipps-mobilepay

client.get_order(order_id) -> OpenStruct

Obtém detalhes da encomenda via GET /v1/orders/{id}/.

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

Emite um reembolso total ou parcial via POST /v1/orders/{id}/refunds/.

client.generate_payment_url(params) -> OpenStruct

Método de conveniência que cria uma encomenda e devolve:

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

Gera uma assinatura HMAC-SHA256 em hexadecimal.

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

Verificação em tempo constante de uma assinatura HMAC-SHA256.

client.verify_webhook(raw_body) -> OpenStruct

Analisa o corpo do webhook, depois chama GET /v1/orders/{id}/ para verificar o estado real.

Utilitários HMAC Autónomos

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)

Tratamento de Erros

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
ExceçãoPaiDescrição
NoPayn::ErrorStandardErrorErro base para todos os erros do SDK
NoPayn::ApiErrorNoPayn::ErrorErro HTTP da API
NoPayn::WebhookErrorNoPayn::ErrorPayload de webhook inválido

Estados da Encomenda

EstadoFinal?Descrição
newNãoEncomenda criada
processingNãoPagamento em curso
completedSimPagamento bem-sucedido — entregue a mercadoria
cancelledSimPagamento cancelado pelo cliente
expiredSimLink de pagamento expirou
errorSimFalha técnica

Boas Práticas para Webhooks

  1. Verifique sempre através da API — o payload do webhook contém apenas o ID da encomenda, nunca o estado. O verify_webhook do SDK faz isto automaticamente.
  2. Devolva HTTP 200 para confirmar a receção. Qualquer outro código desencadeia até 10 tentativas (com 2 minutos de intervalo).
  3. Implemente um poller de backup — para encomendas com mais de 10 minutos que não atingiram um estado final, consulte get_order como rede de segurança.
  4. Seja idempotente — pode receber o mesmo webhook várias vezes.

Cartões de Teste

Utilize estes cartões no modo de teste da Cost+ (website sandbox):

CartãoNúmeroNotas
Visa (sucesso)4111 1111 1111 1111Qualquer CVV
Mastercard (sucesso)5544 3300 0003 7Qualquer CVV
Visa (recusado)4111 1111 1111 1105Do Not Honor
Visa (fundos insuficientes)4111 1111 1111 1151Insufficient Funds

Utilize qualquer data de validade futura e qualquer CVC de 3 dígitos.

Aplicação de Demonstração

Uma aplicação de demonstração baseada em Sinatra está incluída no repositório GitHub para testar o fluxo completo de pagamento.

Suporte

Precisa de ajuda? Contacte a nossa equipa de suporte em support@costplus.io.

On this page