Cost+Docs

Ruby

Officielt Ruby SDK til Cost+ betalingsgateway

Officielt Ruby SDK til Cost+ betalingsgateway. Forenkler HPP (Hosted Payment Page) redirect-flowet, HMAC payload-signering og webhook-verificering.

Funktioner

  • HMAC-SHA256 signaturgenerering og tidskonstant verificering
  • Automatisk snake_case-mapping fra API'et til Ruby-venlige OpenStruct-objekter
  • Webhook-parsing + API-baseret ordreverificering
  • Testet på tværs af Ruby 3.1, 3.2 og 3.3
  • Sinatra-baseret demo-forhandlerapp inkluderet

Krav

Installation

Tilføj til din Gemfile:

gem "nopayn"

Kør derefter:

bundle install

Eller installer direkte:

gem install nopayn

Hurtigstart

1. Initialiser klienten

require "nopayn"

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

2. Opret en betaling og omdiriger til HPP'en

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. Håndter webhooken

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

API-reference

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

ParameterTypePåkrævetStandard
api_keyStringJa
merchant_idStringJa
base_urlStringNejhttps://api.nopayn.co.uk

client.create_order(params) -> OpenStruct

Opretter en ordre via POST /v1/orders/.

ParameterTypePåkrævetBeskrivelse
:amountIntegerJaBeløb i mindste valutaenhed (øre/cent)
:currencyStringJaISO 4217-kode (EUR, GBP, USD, NOK, SEK)
:merchant_order_idStringNejDin interne ordrereference
:descriptionStringNejOrdrebeskrivelse
:return_urlStringNejOmdirigering efter vellykket betaling
:failure_urlStringNejOmdirigering ved annullering/udløb/fejl
:webhook_urlStringNejAsynkrone statusændringsnotifikationer
:localeStringNejHPP-sprog (en-GB, de-DE, nl-NL osv.)
:payment_methodsArray<String>NejFiltrer HPP-metoder
:expiration_periodStringNejISO 8601-varighed (PT30M)

Tilgængelige betalingsmetoder: credit-card, apple-pay, google-pay, vipps-mobilepay

client.get_order(order_id) -> OpenStruct

Henter ordredetaljer via GET /v1/orders/{id}/.

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

Udsteder en fuld eller delvis refusion via POST /v1/orders/{id}/refunds/.

client.generate_payment_url(params) -> OpenStruct

Convenience-metode der opretter en ordre og returnerer:

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

Genererer en HMAC-SHA256 hex-signatur.

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

Tidskonstant verificering af en HMAC-SHA256-signatur.

client.verify_webhook(raw_body) -> OpenStruct

Parser webhook-kroppen og kalder derefter GET /v1/orders/{id}/ for at verificere den faktiske status.

Selvstændige HMAC-hjælpefunktioner

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)

Fejlhåndtering

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
UndtagelseForælderBeskrivelse
NoPayn::ErrorStandardErrorGrundfejl for alle SDK-fejl
NoPayn::ApiErrorNoPayn::ErrorHTTP-fejl fra API'et
NoPayn::WebhookErrorNoPayn::ErrorUgyldig webhook-payload

Ordrestatusser

StatusEndelig?Beskrivelse
newNejOrdre oprettet
processingNejBetaling i gang
completedJaBetaling vellykket — lever varerne
cancelledJaBetaling annulleret af kunden
expiredJaBetalingslink udløbet
errorJaTeknisk fejl

Webhook best practices

  1. Verificer altid via API'et — webhook-payloaden indeholder kun ordre-ID'et, aldrig status. SDK'ets verify_webhook gør dette automatisk.
  2. Returner HTTP 200 for at bekræfte modtagelsen. Enhver anden kode udløser op til 10 genforsøg (2 minutters mellemrum).
  3. Implementer en backup-poller — for ordrer ældre end 10 minutter, der ikke har nået en endelig status, poll get_order som sikkerhedsnet.
  4. Vær idempotent — du kan modtage den samme webhook flere gange.

Testkort

Brug disse kort i Cost+ testtilstand (sandbox-website):

KortNummerNoter
Visa (succes)4111 1111 1111 1111Vilkårlig CVV
Mastercard (succes)5544 3300 0003 7Vilkårlig CVV
Visa (afvist)4111 1111 1111 1105Do Not Honor
Visa (utilstrækkelig saldo)4111 1111 1111 1151Insufficient Funds

Brug en vilkårlig fremtidig udløbsdato og en vilkårlig 3-cifret CVC.

Demo-app

En Sinatra-baseret demo-app er inkluderet i GitHub-repositoriet til test af det fulde betalingsflow.

Support

Brug for hjælp? Kontakt vores supportteam på support@costplus.io.

On this page