Cost+Docs

C# / .NET

Oficjalny SDK C#/.NET dla bramki płatności Cost+

Oficjalny SDK C#/.NET dla bramki płatności Cost+. Upraszcza przepływ przekierowań HPP (hostowanej strony płatności), podpisywanie HMAC i weryfikację webhooków.

Funkcje

  • Zero zależności — używa tylko wbudowanych System.Text.Json i System.Security.Cryptography
  • Wymaga .NET 8.0 z funkcjami C# 12 (rekordy, przestrzenie nazw w zakresie pliku, dopasowywanie wzorców)
  • Nullable reference types włączone w całym SDK
  • Generowanie podpisów HMAC-SHA256 i weryfikacja w stałym czasie
  • Automatyczne mapowanie snake_case/PascalCase między API a SDK
  • Parsowanie webhooków + weryfikacja zamówienia przez API
  • W pełni asynchroniczna powierzchnia API

Wymagania

Instalacja

dotnet add package NoPayn

Lub jako lokalna referencja projektu:

dotnet add reference path/to/src/NoPayn/NoPayn.csproj

Szybki start

1. Zainicjalizuj klienta

using NoPayn;
using NoPayn.Models;

var nopayn = new NoPaynClient(new NoPaynConfig(
    ApiKey: "your-api-key",
    MerchantId: "your-project"
));

2. Utwórz płatność i przekieruj na HPP

var result = await nopayn.GeneratePaymentUrlAsync(new CreateOrderParams
{
    Amount = 1295,              // 12,95 EUR w centach
    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",
});

// Przekieruj klienta
// result.OrderUrl   → HPP (klient wybiera metodę płatności)
// result.PaymentUrl → bezpośredni link do metody płatności pierwszej transakcji
// result.Signature  → HMAC-SHA256 do weryfikacji
// result.OrderId    → UUID zamówienia NoPayn

3. Obsłuż webhook

app.MapPost("/webhook", async (HttpContext ctx) =>
{
    using var reader = new StreamReader(ctx.Request.Body);
    var rawBody = await reader.ReadToEndAsync();
    var verified = await nopayn.VerifyWebhookAsync(rawBody);

    Console.WriteLine(verified.Order.Status); // "completed", "cancelled", itp.
    Console.WriteLine(verified.IsFinal);      // true gdy zamówienie się nie zmieni

    if (verified.Order.Status == "completed")
    {
        // Zrealizuj zamówienie
    }

    return Results.Ok();
});

Dokumentacja API

new NoPaynClient(config, httpClient?)

ParametrTypWymaganyDomyślnie
ApiKeystringTak
MerchantIdstringTak
BaseUrlstringNiehttps://api.nopayn.co.uk

Opcjonalny HttpClient może być przekazany jako drugi parametr konstruktora dla niestandardowej obsługi HTTP lub testowania.

client.CreateOrderAsync(params): Task<Order>

Tworzy zamówienie przez POST /v1/orders/.

ParametrTypWymaganyOpis
AmountintTakKwota w najmniejszej jednostce waluty (centy)
CurrencystringTakKod ISO 4217 (EUR, GBP, USD, NOK, SEK)
MerchantOrderIdstring?NieTwoja wewnętrzna referencja zamówienia
Descriptionstring?NieOpis zamówienia
ReturnUrlstring?NiePrzekierowanie po pomyślnej płatności
FailureUrlstring?NiePrzekierowanie przy anulowaniu/wygaśnięciu/błędzie
WebhookUrlstring?NieAsynchroniczne powiadomienia o zmianie statusu
Localestring?NieJęzyk HPP (en-GB, de-DE, nl-NL, itp.)
PaymentMethodsIReadOnlyList<string>?NieFiltruj metody HPP
ExpirationPeriodstring?NieCzas trwania ISO 8601 (PT30M)

Dostępne metody płatności: credit-card, apple-pay, google-pay, vipps-mobilepay

client.GetOrderAsync(orderId): Task<Order>

Pobiera szczegóły zamówienia przez GET /v1/orders/{id}/.

client.CreateRefundAsync(orderId, amount, description?): Task<Refund>

Dokonuje pełnego lub częściowego zwrotu przez POST /v1/orders/{id}/refunds/.

client.GeneratePaymentUrlAsync(params): Task<PaymentUrlResult>

Metoda pomocnicza, która tworzy zamówienie i zwraca:

public record PaymentUrlResult(
    string OrderId,        // UUID zamówienia NoPayn
    string OrderUrl,       // URL HPP
    string? PaymentUrl,    // Bezpośredni URL płatności (pierwsza transakcja)
    string Signature,      // HMAC-SHA256 z amount:currency:orderId
    Order Order            // Pełny obiekt zamówienia
);

client.GenerateSignature(amount, currency, orderId): string

Generuje podpis HMAC-SHA256 w formacie hex.

client.VerifySignature(amount, currency, orderId, signature): bool

Weryfikacja HMAC-SHA256 w stałym czasie.

client.VerifyWebhookAsync(rawBody): Task<VerifiedWebhook>

Parsuje treść webhooka, następnie wywołuje GET /v1/orders/{id}/, aby zweryfikować rzeczywisty status.

Samodzielne narzędzia HMAC

using NoPayn;

var sig = NoPaynSignature.Generate("your-api-key", 1295, "EUR", "order-uuid");
var ok  = NoPaynSignature.Verify("your-api-key", 1295, "EUR", "order-uuid", sig);

Obsługa błędów

using NoPayn.Exceptions;

try
{
    await nopayn.CreateOrderAsync(new CreateOrderParams { Amount = 100, Currency = "EUR" });
}
catch (ApiException ex)
{
    Console.Error.WriteLine(ex.StatusCode);  // 401, 400, itp.
    Console.Error.WriteLine(ex.ErrorBody);   // Surowa odpowiedź błędu API
}
catch (NoPaynException ex)
{
    Console.Error.WriteLine(ex.Message);     // Błąd sieci lub parsowania
}
WyjątekOpis
NoPaynExceptionBazowy wyjątek (sieć, parsowanie)
ApiExceptionBłąd HTTP z API
WebhookExceptionNieprawidłowa treść webhooka

Statusy zamówień

StatusKońcowy?Opis
newNieZamówienie utworzone
processingNiePłatność w toku
completedTakPłatność zakończona sukcesem — wydaj towar
cancelledTakPłatność anulowana przez klienta
expiredTakLink płatności wygasł
errorTakBłąd techniczny

Najlepsze praktyki dotyczące webhooków

  1. Zawsze weryfikuj przez API — treść webhooka zawiera tylko identyfikator zamówienia, nigdy status. VerifyWebhookAsync() SDK robi to automatycznie.
  2. Zwracaj HTTP 200, aby potwierdzić odbiór. Każdy inny kod powoduje do 10 ponowień (co 2 minuty).
  3. Zaimplementuj zapasowe odpytywanie — dla zamówień starszych niż 10 minut, które nie osiągnęły końcowego statusu, odpytuj GetOrderAsync() jako zabezpieczenie.
  4. Bądź idempotentny — możesz otrzymać ten sam webhook wielokrotnie.

Karty testowe

Użyj tych kart w trybie testowym Cost+ (strona testowa):

KartaNumerUwagi
Visa (sukces)4111 1111 1111 1111Dowolny CVV
Mastercard (sukces)5544 3300 0003 7Dowolny CVV
Visa (odrzucona)4111 1111 1111 1105Do Not Honor
Visa (brak środków)4111 1111 1111 1151Insufficient Funds

Użyj dowolnej przyszłej daty ważności i dowolnego 3-cyfrowego CVC.

Aplikacja demonstracyjna

Aplikacja demonstracyjna oparta na Dockerze z ASP.NET Core jest dołączona w repozytorium GitHub do testowania pełnego przepływu płatności.

Wsparcie

Potrzebujesz pomocy? Skontaktuj się z naszym zespołem wsparcia pod adresem support@costplus.io.

On this page