C# / .NET
Officiele C#/.NET SDK voor de Cost+ betaalgateway
Officiele C#/.NET SDK voor de Cost+ betaalgateway. Vereenvoudigt de HPP (Hosted Payment Page) doorverwijzingsflow, HMAC-payloadondertekening en webhookverificatie.
Kenmerken
- Geen afhankelijkheden — gebruikt alleen ingebouwde
System.Text.JsonenSystem.Security.Cryptography - Vereist .NET 8.0 met C# 12-functies (records, file-scoped namespaces, pattern matching)
- Nullable reference types overal ingeschakeld
- HMAC-SHA256-handtekeninggeneratie en constant-time verificatie
- Automatische snake_case/PascalCase-mapping tussen de API en de SDK
- Webhook-parsing + API-gebaseerde bestellingsverificatie
- Volledig async API-oppervlak
Vereisten
- .NET 8.0 SDK of hoger
- Een Cost+ handelaarsaccount — dashboard.costplus.io
Installatie
dotnet add package NoPaynOf als lokale projectreferentie:
dotnet add reference path/to/src/NoPayn/NoPayn.csprojSnelstart
1. De client initialiseren
using NoPayn;
using NoPayn.Models;
var nopayn = new NoPaynClient(new NoPaynConfig(
ApiKey: "your-api-key",
MerchantId: "your-project"
));2. Een betaling aanmaken en doorverwijzen naar de HPP
var result = await nopayn.GeneratePaymentUrlAsync(new CreateOrderParams
{
Amount = 1295, // €12.95 in cents
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",
});
// Redirect the customer
// result.OrderUrl → HPP (customer picks payment method)
// result.PaymentUrl → direct link to the first transaction's payment method
// result.Signature → HMAC-SHA256 for verification
// result.OrderId → NoPayn order UUID3. De webhook afhandelen
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", etc.
Console.WriteLine(verified.IsFinal); // true when the order won't change
if (verified.Order.Status == "completed")
{
// Fulfil the order
}
return Results.Ok();
});API-referentie
new NoPaynClient(config, httpClient?)
| Parameter | Type | Vereist | Standaard |
|---|---|---|---|
ApiKey | string | Ja | — |
MerchantId | string | Ja | — |
BaseUrl | string | Nee | https://api.nopayn.co.uk |
Een optionele HttpClient kan als tweede constructorparameter worden meegegeven voor aangepaste HTTP-afhandeling of testen.
client.CreateOrderAsync(params): Task<Order>
Maakt een bestelling aan via POST /v1/orders/.
| Parameter | Type | Vereist | Beschrijving |
|---|---|---|---|
Amount | int | Ja | Bedrag in kleinste valuta-eenheid (centen) |
Currency | string | Ja | ISO 4217-code (EUR, GBP, USD, NOK, SEK) |
MerchantOrderId | string? | Nee | Uw interne bestellingsreferentie |
Description | string? | Nee | Bestellingsbeschrijving |
ReturnUrl | string? | Nee | Doorverwijzing na geslaagde betaling |
FailureUrl | string? | Nee | Doorverwijzing bij annulering/verloop/fout |
WebhookUrl | string? | Nee | Asynchrone statuswijzigingsmeldingen |
Locale | string? | Nee | HPP-taal (en-GB, de-DE, nl-NL, enz.) |
PaymentMethods | IReadOnlyList<string>? | Nee | HPP-methoden filteren |
ExpirationPeriod | string? | Nee | ISO 8601-duur (PT30M) |
Beschikbare betaalmethoden: credit-card, apple-pay, google-pay, vipps-mobilepay
client.GetOrderAsync(orderId): Task<Order>
Haalt bestellingsdetails op via GET /v1/orders/{id}/.
client.CreateRefundAsync(orderId, amount, description?): Task<Refund>
Voert een volledige of gedeeltelijke terugbetaling uit via POST /v1/orders/{id}/refunds/.
client.GeneratePaymentUrlAsync(params): Task<PaymentUrlResult>
Hulpmethode die een bestelling aanmaakt en retourneert:
public record PaymentUrlResult(
string OrderId, // NoPayn order UUID
string OrderUrl, // HPP URL
string? PaymentUrl, // Direct payment URL (first transaction)
string Signature, // HMAC-SHA256 of amount:currency:orderId
Order Order // Full order object
);client.GenerateSignature(amount, currency, orderId): string
Genereert een HMAC-SHA256 hex-handtekening.
client.VerifySignature(amount, currency, orderId, signature): bool
Constant-time verificatie van een HMAC-SHA256-handtekening.
client.VerifyWebhookAsync(rawBody): Task<VerifiedWebhook>
Parst de webhook-body en roept vervolgens GET /v1/orders/{id}/ aan om de werkelijke status te verifieren.
Standalone HMAC-hulpmiddelen
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);Foutafhandeling
using NoPayn.Exceptions;
try
{
await nopayn.CreateOrderAsync(new CreateOrderParams { Amount = 100, Currency = "EUR" });
}
catch (ApiException ex)
{
Console.Error.WriteLine(ex.StatusCode); // 401, 400, etc.
Console.Error.WriteLine(ex.ErrorBody); // Raw API error response
}
catch (NoPaynException ex)
{
Console.Error.WriteLine(ex.Message); // Network or parsing error
}| Uitzondering | Beschrijving |
|---|---|
NoPaynException | Basisuitzondering (netwerk, parsing) |
ApiException | HTTP-fout van de API |
WebhookException | Ongeldige webhook-payload |
Bestellingsstatussen
| Status | Definitief? | Beschrijving |
|---|---|---|
new | Nee | Bestelling aangemaakt |
processing | Nee | Betaling wordt verwerkt |
completed | Ja | Betaling geslaagd — lever de goederen |
cancelled | Ja | Betaling geannuleerd door klant |
expired | Ja | Betaallink verlopen |
error | Ja | Technische storing |
Best practices voor webhooks
- Verifieer altijd via de API — de webhook-payload bevat alleen het bestelling-ID, nooit de status. De
VerifyWebhookAsync()van de SDK doet dit automatisch. - Retourneer HTTP 200 om de ontvangst te bevestigen. Elke andere code triggert tot 10 herhaalpogingen (2 minuten tussenpozen).
- Implementeer een backup-poller — voor bestellingen ouder dan 10 minuten die nog geen definitieve status hebben bereikt, poll
GetOrderAsync()als vangnet. - Wees idempotent — u kunt dezelfde webhook meerdere keren ontvangen.
Testkaarten
Gebruik deze kaarten in Cost+ testmodus (sandbox-website):
| Kaart | Nummer | Opmerkingen |
|---|---|---|
| Visa (geslaagd) | 4111 1111 1111 1111 | Willekeurige CVV |
| Mastercard (geslaagd) | 5544 3300 0003 7 | Willekeurige CVV |
| Visa (geweigerd) | 4111 1111 1111 1105 | Do Not Honor |
| Visa (onvoldoende saldo) | 4111 1111 1111 1151 | Insufficient Funds |
Gebruik een willekeurige toekomstige vervaldatum en een willekeurige 3-cijferige CVC.
Demo-app
Een op Docker gebaseerde ASP.NET Core demo-app is opgenomen in de GitHub-repository om de volledige betalingsflow te testen.
Ondersteuning
Hulp nodig? Neem contact op met ons supportteam via support@costplus.io.