Cost+Docs

Python

Offisiell Python SDK for Cost+ betalingsgateway

Offisiell Python SDK for Cost+ betalingsgateway. Forenkler HPP (Hosted Payment Page) videresendingsflyten, HMAC-signering av innhold og webhook-verifisering.

Funksjoner

  • Minimale avhengigheter — kun requests
  • Fulle type hints og frosne dataclass-returtyper
  • HMAC-SHA256 signaturgenerering og konstanttids-verifisering
  • Webhook-parsing + API-basert ordreverifisering
  • Testet på tvers av Python 3.10, 3.11 og 3.12

Krav

Installasjon

pip install nopayn-sdk

Hurtigstart

1. Initialiser klienten

from nopayn import NoPaynClient

client = NoPaynClient(
    api_key="your-api-key",
    merchant_id="your-project",
)

2. Opprett en betaling og videresend til HPP

result = client.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 (Flask-eksempel)

@app.route("/webhook", methods=["POST"])
def webhook():
    verified = client.verify_webhook(request.get_data(as_text=True))

    print(verified.order.status)  # 'completed', 'cancelled', etc.
    print(verified.is_final)      # True when the order won't change

    if verified.order.status == "completed":
        # Fulfil the order
        pass

    return "", 200

API-referanse

NoPaynClient(api_key, merchant_id, base_url?)

ParameterTypePåkrevdStandard
api_keystrJa
merchant_idstrJa
base_urlstrNeihttps://api.nopayn.co.uk

client.create_order(**kwargs) -> Order

Oppretter en ordre via POST /v1/orders/.

ParameterTypePåkrevdBeskrivelse
amountintJaBeløp i minste valutaenhet (øre/cent)
currencystrJaISO 4217-kode (EUR, GBP, USD, NOK, SEK)
merchant_order_idstrNeiDin interne ordrereferanse
descriptionstrNeiOrdrebeskrivelse
return_urlstrNeiVideresending etter vellykket betaling
failure_urlstrNeiVideresending ved avbrudd/utløp/feil
webhook_urlstrNeiAsynkrone statusendringsvarsler
localestrNeiHPP-språk (en-GB, de-DE, nl-NL, osv.)
payment_methodslist[str]NeiFiltrer HPP-metoder
expiration_periodstrNeiISO 8601-varighet (PT30M)

Tilgjengelige betalingsmetoder: credit-card, apple-pay, google-pay, vipps-mobilepay

client.get_order(order_id) -> Order

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

client.create_refund(order_id, amount, description?) -> Refund

Utsteder en full eller delvis refusjon via POST /v1/orders/{id}/refunds/.

client.generate_payment_url(**kwargs) -> PaymentUrlResult

Bekvemmelighetsmetode som oppretter en ordre og returnerer:

PaymentUrlResult(
    order_id="...",       # NoPayn order UUID
    order_url="...",      # HPP URL
    payment_url="...",    # Direct payment URL (first transaction)
    signature="...",      # HMAC-SHA256 of amount:currency:order_id
    order=Order(...),     # Full order object
)

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

Genererer en HMAC-SHA256 hex-signatur.

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

Konstanttids-verifisering av en HMAC-SHA256-signatur.

client.verify_webhook(raw_body) -> VerifiedWebhook

Parser webhook-kroppen, kaller deretter GET /v1/orders/{id}/ for å verifisere faktisk status.

Frittstående HMAC-verktøy

from nopayn import generate_signature, verify_signature

sig = generate_signature("your-api-key", 1295, "EUR", "order-uuid")
ok = verify_signature("your-api-key", 1295, "EUR", "order-uuid", sig)

Datatyper

Alle API-svar returneres som frosne dataclasses:

KlasseFelt
Orderid, amount, currency, status, created, modified, transactions, description, merchant_order_id, return_url, failure_url, order_url, completed
Transactionid, amount, currency, status, created, modified, payment_method, payment_url, expiration_period
Refundid, amount, status
PaymentUrlResultorder_id, order_url, payment_url, signature, order
VerifiedWebhookorder_id, order, is_final

Feilhåndtering

from nopayn import ApiError, NoPaynError, WebhookError

try:
    client.create_order(amount=100, currency="EUR")
except ApiError as exc:
    print(exc.status_code)  # 401, 400, etc.
    print(exc.error_body)   # Raw API error response
except NoPaynError as exc:
    print(exc)              # Network or parsing error

Ordrestatuser

StatusEndelig?Beskrivelse
newNeiOrdre opprettet
processingNeiBetaling pågår
completedJaBetaling vellykket — lever varene
cancelledJaBetaling avbrutt av kunden
expiredJaBetalingslenken utløp
errorJaTeknisk feil

Beste praksis for webhooks

  1. Verifiser alltid via API-et — webhook-innholdet inneholder kun ordre-ID-en, aldri statusen. SDK-ens verify_webhook() gjør dette automatisk.
  2. Returner HTTP 200 for å bekrefte mottak. Enhver annen kode utløser opptil 10 nye forsøk (2 minutters mellomrom).
  3. Implementer en reservepoller — for ordrer eldre enn 10 minutter som ikke har nådd en endelig status, poll get_order() som sikkerhetsnett.
  4. Vær idempotent — du kan motta samme webhook flere ganger.

Testkort

Bruk disse kortene i Cost+ testmodus (sandbox-nettsted):

KortNummerMerknader
Visa (vellykket)4111 1111 1111 1111Valgfritt CVV
Mastercard (vellykket)5544 3300 0003 7Valgfritt CVV
Visa (avvist)4111 1111 1111 1105Do Not Honor
Visa (utilstrekkelige midler)4111 1111 1111 1151Insufficient Funds

Bruk en hvilken som helst fremtidig utløpsdato og en hvilken som helst 3-sifret CVC.

Demoapp

En Flask-basert demoapp er inkludert i GitHub-repositoriet for testing av den fullstendige betalingsflyten.

Kundestøtte

Trenger du hjelp? Kontakt kundestøtteteamet vårt på support@costplus.io.

On this page