WayForPaySDK 1.2.1
See the version list below for details.
dotnet add package WayForPaySDK --version 1.2.1
NuGet\Install-Package WayForPaySDK -Version 1.2.1
<PackageReference Include="WayForPaySDK" Version="1.2.1" />
<PackageVersion Include="WayForPaySDK" Version="1.2.1" />
<PackageReference Include="WayForPaySDK" />
paket add WayForPaySDK --version 1.2.1
#r "nuget: WayForPaySDK, 1.2.1"
#:package WayForPaySDK@1.2.1
#addin nuget:?package=WayForPaySDK&version=1.2.1
#tool nuget:?package=WayForPaySDK&version=1.2.1
WayForPaySDK
A modern .NET SDK for WayForPay payment gateway integration. This library provides a type-safe, async-first API for all WayForPay operations.
Features
Complete API Coverage
- Purchase operations (standard and with regular payments)
- Charge operations (with token and regular payments)
- Refund and Settlement operations
- Transaction status checks and verification
- Invoice creation
- 3D-Secure support
- QR Code generation
- Split payments (Marketplace)
- Regular payment management (Suspend/Resume/Remove)
Developer Experience
- Async/await pattern throughout
- Strong typing with nullable reference types
- Comprehensive XML documentation
- Dependency injection support
- Multi-framework targeting (.NET 8.0, 9.0, 10.0)
- ASP.NET Core webhook middleware
Production Ready
- Secure MD5 signature generation
- Automatic request/response validation
- Structured error handling
- Comprehensive test coverage
Installation
dotnet add package WayForPaySDK
Or via Package Manager Console:
Install-Package WayForPaySDK
Quick Start
1. Configuration
Add WayForPay settings to your appsettings.json:
{
"WayForPay": {
"MerchantAccount": "your_merchant_account",
"MerchantSecretKey": "your_secret_key",
"MerchantDomainName": "example.com"
}
}
2. Service Registration
Register WayForPaySDK in your DI container:
// Program.cs or Startup.cs
builder.Services.AddWayForPay(configuration.GetSection("WayForPay"));
3. Basic Usage
public class PaymentService
{
private readonly IWayForPayClient _client;
public PaymentService(IWayForPayClient client)
{
_client = client;
}
public async Task<PurchaseResponse> CreatePaymentAsync()
{
var request = new PurchaseRequest
{
OrderReference = "ORDER-12345",
Amount = 100.50m,
Currency = Currency.UAH,
OrderDate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
ProductName = ["Test Product"],
ProductCount = [1],
ProductPrice = [100.50m]
};
return await _client.CreatePurchaseAsync(request);
}
}
Usage Examples
Creating a Payment (Redirect)
var purchase = await _client.CreatePurchaseAsync(new PurchaseRequest
{
OrderReference = $"ORDER-{DateTime.UtcNow:yyyyMMddHHmmss}",
Amount = 250.00m,
Currency = Currency.UAH,
OrderDate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
ProductName = ["Premium Subscription"],
ProductCount = [1],
ProductPrice = [250.00m],
ClientFirstName = "John",
ClientLastName = "Doe",
ClientEmail = "john.doe@example.com",
ClientPhone = "380501234567"
});
Direct Card Charge (S2S)
var charge = await _client.ChargeAsync(new ChargeRequest
{
OrderReference = $"ORDER-CHARGE-{DateTime.UtcNow.Ticks}",
Amount = 100.00m,
Currency = Currency.UAH,
OrderDate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
CardNumber = "4111111111111111",
ExpMonth = "12",
ExpYear = "2025",
CardCvv = "123",
CardHolder = "JOHN DOE",
ProductName = ["Direct Charge"],
ProductPrice = [100.00m],
ProductCount = [1]
});
Charging with Token
var charge = await _client.ChargeWithTokenAsync(new ChargeRequest
{
OrderReference = "ORDER-67890",
Amount = 50.00m,
Currency = Currency.UAH,
OrderDate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
Token = "saved_card_token"
});
Regular Payments (Subscriptions)
// 1. Start a subscription via Purchase (Redirect)
var regularPurchase = await _client.CreatePurchaseWithRegularAsync(new PurchaseRequest
{
OrderReference = "SUB-START-1",
Amount = 100.00m,
Currency = Currency.UAH,
// ... products ...
RegularBehavior = RegularBehavior.Preset,
RegularMode = [RegularMode.Client], // Client can modify
RegularAmount = 100.00m,
RegularCount = 12, // 12 payments
RegularOn = "month" // Monthly
});
// 2. Charge next payment (S2S)
var regularCharge = await _client.ChargeWithRegularAsync(new ChargeRequest
{
OrderReference = "SUB-PAYMENT-2",
Amount = 100.00m,
// ... card details ...
RegularBehavior = RegularBehavior.None // Continue existing behavior
});
Managing Regular Payments
// Suspend a subscription
await _client.SuspendRegularAsync("ORDER-SUB-123");
// Resume a subscription
await _client.ResumeRegularAsync("ORDER-SUB-123");
// Cancel/Remove a subscription permanently
await _client.RemoveRegularAsync("ORDER-SUB-123");
Split Payments (Marketplace)
var purchaseWithSplit = await _client.CreatePurchaseAsync(new PurchaseRequest
{
OrderReference = "ORDER-SPLIT-1",
Amount = 1000.00m,
Currency = Currency.UAH,
// ... other fields ...
Splits =
[
// Transfer 100 UAH to sub-merchant 1
new Split { Id = "merchant_id_1", Type = "flat", Value = "100" },
// Transfer 10% to sub-merchant 2
new Split { Id = "merchant_id_2", Type = "percentage", Value = "10" }
]
});
Generating a Payment QR Code
var qrResponse = await _client.CreateQrAsync(
orderReference: $"QR-{DateTime.UtcNow.Ticks}",
amount: 500.00m,
currency: Currency.UAH,
products: [new Product("Coffee", 500.00m, 1)]
);
// Use qrResponse.QrCodeUrl to display the QR code
Console.WriteLine($"QR Code URL: {qrResponse.QrCodeUrl}");
Two-Stage Payments (Auth/Settle/Void)
// 1. Authorize (Hold funds)
// Use MerchantTransactionType.Auth in your Purchase or Charge request
// 2. Settle (Confirm/Capture)
var settle = await _client.SettleAsync(new SettleRequest
{
OrderReference = "ORDER-AUTH-1",
Amount = 100.00m, // Can be partial amount
Currency = Currency.UAH
});
// OR
// 3. Void (Cancel Hold)
var voidTx = await _client.VoidAsync(new VoidRequest
{
OrderReference = "ORDER-AUTH-1",
Amount = 100.00m,
Currency = Currency.UAH
});
Refunds
var refund = await _client.RefundAsync(new RefundRequest
{
OrderReference = "ORDER-12345",
Amount = 100.50m,
Currency = Currency.UAH,
Comment = "Customer requested refund"
});
P2P Transfers
// Credit to Card
var p2pCredit = await _client.P2PCreditAsync(new P2PCreditRequest
{
OrderReference = $"P2P-{DateTime.UtcNow.Ticks}",
Amount = 1000.00m,
Currency = Currency.UAH,
CardBeneficiary = "4111111111111111" // Receiver card
});
// Transfer to IBAN
var p2pAccount = await _client.P2PAccountAsync(new P2PAccountRequest
{
OrderReference = $"IBAN-{DateTime.UtcNow.Ticks}",
Amount = 5000.00m,
Currency = Currency.UAH,
Iban = "UA12345678901234567890123456",
Okpo = "12345678",
AccountName = "Beneficiary Name",
Description = "Payment for services"
});
Transaction Info
// Check single status
var status = await _client.CheckStatusAsync(new StatusRequest
{
OrderReference = "ORDER-12345"
});
// Get list of transactions
var history = await _client.GetTransactionListAsync(new TransactionListRequest
{
DateBegin = DateTimeOffset.UtcNow.AddDays(-7).ToUnixTimeSeconds(),
DateEnd = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
});
Invoice Creation
var invoice = await _client.CreateInvoiceAsync(new InvoiceRequest
{
OrderReference = $"INV-{DateTime.UtcNow.Ticks}",
Amount = 1500.00m,
Currency = Currency.UAH,
ProductName = ["Consulting Services"],
ProductPrice = [1500.00m],
ProductCount = [1],
OrderLifetime = 86400 // 24 hours
});
Console.WriteLine($"Invoice URL: {invoice.InvoiceUrl}");
Complete 3D Secure
// When you receive 3DS callback (md, pares)
var result = await _client.Complete3DSAsync(new Complete3DSRequest
{
D3Md = "md_value_from_bank",
D3Pares = "pares_value_from_bank"
});
Verify Card
var verification = await _client.VerifyAsync(new VerifyRequest
{
OrderReference = $"VERIFY-{DateTime.UtcNow.Ticks}",
CardNumber = "4111111111111111",
ExpMonth = "12",
ExpYear = "2025",
CardCvv = "123",
CardHolder = "JOHN DOE"
});
// Creates a temporary hold (e.g. 1 UAH) which is auto-reversed
Webhook Handling (ASP.NET Core)
// Register webhook handler
builder.Services.AddWayForPayWebhooks();
// In your controller
[ApiController]
[Route("api/webhooks")]
public class WebhookController : ControllerBase
{
private readonly IWayForPayWebhookHandler _handler;
public WebhookController(IWayForPayWebhookHandler handler)
{
_handler = handler;
}
[HttpPost("wayforpay")]
public async Task<IActionResult> HandleWebhook([FromBody] WebhookRequest webhook)
{
if (!_handler.VerifySignature(webhook))
{
return Unauthorized();
}
// Process the webhook
return Ok();
}
}
Documentation
For detailed documentation, see the docs folder:
Supported Operations
| Operation | Method | Description |
|---|---|---|
| Purchase | CreatePurchaseAsync |
Create a new payment |
| Charge | ChargeAsync |
Charge a card |
| Charge with Token | ChargeWithTokenAsync |
Charge using saved token |
| Refund | RefundAsync |
Refund a transaction |
| Settlement | SettleAsync |
Settle a transaction |
| Void | VoidAsync |
Cancel a transaction |
| Check Status | CheckStatusAsync |
Check transaction status |
| Verify | VerifyAsync |
Verify merchant signature |
| Create Invoice | CreateInvoiceAsync |
Create payment invoice |
| Complete 3DS | Complete3DSAsync |
Complete 3D-Secure |
| Create QR | CreateQrAsync |
Generate payment QR code |
| Suspend Regular | SuspendRegularAsync |
Suspend recurring payment |
| Resume Regular | ResumeRegularAsync |
Resume recurring payment |
| Remove Regular | RemoveRegularAsync |
Remove recurring payment |
Requirements
- .NET 8.0, 9.0, or 10.0
- Microsoft.Extensions.DependencyInjection 9.0+
- Microsoft.Extensions.Http 9.0+
- Microsoft.AspNetCore.App (for webhook support)
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
- GitHub Issues - Report bugs or request features
- WayForPay Documentation - Official API documentation
Acknowledgments
- Built for the Ukrainian payment ecosystem
- Powered by WayForPay
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
-
net8.0
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Http (>= 9.0.0)
- Microsoft.Extensions.Options (>= 9.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.0)
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Security improvements and validation enhancements:
• XSS prevention in PaymentFormBuilder (HTML encoding for all user-controlled values)
• Signature exception properties now internal (prevents information disclosure)
• Exception messages sanitized (no raw response data in errors)
• Proper URL construction for Regular API endpoints
• Added domain validation methods (Card, Client, Product) with Luhn algorithm for card numbers
• Added options validation at startup (IValidateOptions pattern)
• Added certificate pinning support via ServerCertificateCustomValidationCallback
• Improved webhook error handling with optional ILogger support
• InvariantCulture for ReasonCode formatting (consistent signatures across cultures)