Mikrofin.EMoney.CashDeskSdk
1.1.0
dotnet add package Mikrofin.EMoney.CashDeskSdk --version 1.1.0
NuGet\Install-Package Mikrofin.EMoney.CashDeskSdk -Version 1.1.0
<PackageReference Include="Mikrofin.EMoney.CashDeskSdk" Version="1.1.0" />
<PackageVersion Include="Mikrofin.EMoney.CashDeskSdk" Version="1.1.0" />
<PackageReference Include="Mikrofin.EMoney.CashDeskSdk" />
paket add Mikrofin.EMoney.CashDeskSdk --version 1.1.0
#r "nuget: Mikrofin.EMoney.CashDeskSdk, 1.1.0"
#:package Mikrofin.EMoney.CashDeskSdk@1.1.0
#addin nuget:?package=Mikrofin.EMoney.CashDeskSdk&version=1.1.0
#tool nuget:?package=Mikrofin.EMoney.CashDeskSdk&version=1.1.0
Mikrofin EMoney CashDesk SDK – Detaljna dokumentacija
Šta je Mikrofin EMoney CashDesk SDK?
Mikrofin.EMoney.CashDeskSdk je .NET biblioteka koja omogućava vašoj aplikaciji da se poveže na Mikrofin EMoney Core API putem WebSocket konekcije i obavlja rad sa blagajnom (Cash Desk).
Pomoću ovog SDK-a možete:
slati poruke uz pomoc vec definisanih metoda prema Mikrofin EMoney Core API-u:
- LoginAsync
- CreatePaymentAsync
- CancelPaymentAsync
- CreateCashInAsync
- CancelCashInAsync
- CreateCashOutAsync
- CompleteCashOutAsync
- CancelCashOutAsync
primati jasno definisane događaje koje integracija može pretvoriti u UI obavijesti ili poslovnu logiku:
- CashierLoginSucceeded
- CashierLoginFailed
- PaymentCreated
- TransactionCreateFailed
- PaymentCompleted
- CashInCreated
- CashInCompleted
- CashOutCreated
- CashOutPaidByUser
- CashOutCompleted
- GeneralErrorReceived
SDK sakriva kompletnu WebSocket komunikaciju, tako da vi radite samo sa jasnim C# metodama i događajima.
Kako SDK radi?
- SDK uspostavlja jednu stalnu WebSocket vezu prema EMoney API-ju
- Vi šaljete zahtjeve metodama kao što su:
- LoginAsync
- CreatePaymentAsync
- CancelPaymentAsync
- CreateCashInAsync
- CancelCashInAsync
- CreateCashOutAsync
- CompleteCashOutAsync
- CancelCashOutAsync
- Server vam vraća odgovore kroz događaje (events), npr.:
- PaymentCreated
- PaymentCompleted
- TransactionCreateFailed
- CashInCreated
- CashInCompleted
- CashOutCreated
- CashOutPaidByUser
- CashOutCompleted
- Te događaje možete koristiti za:
- prikaz QR koda,
- obavijesti korisniku,
- pokretanje poslovne logike u aplikaciji.
Tehnički zahtjevi
Prije nego počnete, potrebno je sljedeće:
Softverski zahtjevi
- .NET 6.0 ili noviji
- Ili bilo koje runtime okruženje koje podržava .NET Standard 2.0
Sistemski zahtjevi
- Kreiran blagajnički (cashier) račun u EMoney Core sistemu
- Pristup WebSocket endpointu:
Lokalno:
ws://localhost:5000/ws/cashdeskDev / Test
wss://test-api-emoney.mfsoftware.com/ws/cashdeskProd
wss://api.totopay.ba/ws/cashdesk
Instalacija SDK-a
Opcija 1: preko .NET CLI (NuGet paket)
dotnet add package Mikrofin.EMoney.CashDeskSdk
Opcija 2: ručno u .csproj fajlu
<ItemGroup>
<PackageReference Include="Mikrofin.EMoney.CashDeskSdk" Version="x.y.z" />
</ItemGroup>
Kreiranje i konfiguracija klijenta
Prvi korak u kodu je konfiguracija CashDeskClient-a.
var options = new CashDeskClientOptions(
new Uri("wss://<your-host>/ws/cashdesk"))
{
KeepAliveInterval = TimeSpan.FromSeconds(30),
ReceiveBufferSize = 32 * 1024,
DiagnosticLogger = message =>
logger.LogInformation("[CashDeskSdk] {Message}", message)
};
await using var client = new CashDeskClient(options);
Obavezni parametri
Endpoint– puniws://iliwss://Mikrofin EMoney Core API URL izloženog CashDesk endpointa.
Dodatne postavke
KeepAliveInterval– period slanja pingova (default 30 sek).ReceiveBufferSize– veličina buffera za prijem frame-ova (default 32 KB).Headers– kolekcija custom zaglavlja (trenutno nije neophodna; koristite samo ako vam gateway naknadno zatraži dodatne header-e).DiagnosticLogger– callback za logovanje lifecycle događaja (spajanje, diskonekcija).
Tipičan tok integracije
- Instancirati
CashDeskClient(prethodno poglavlje) - pretplatiti se na događaje
client.CashierLoginSucceeded += (_, payload) =>
{
Console.WriteLine($"Cashier {payload.Cashier.UserName} logged in.");
};
client.PaymentCompleted += (_, payload) =>
{
Console.WriteLine($"Payment {payload.Payment.Id} completed.");
};
client.CashInCompleted += (_, payload) =>
{
Console.WriteLine($"CashIn {payload.CashIn.Id} completed.");
};
client.CashOutCompleted += (_, payload) =>
{
Console.WriteLine($"CashOut {payload.CashOut.Id} completed.");
};
- Uspostaviti WebSocket konekciju
await client.ConnectAsync(ct);
- Prijaviti blagajnika (Login)
await client.LoginAsync(
new CashierLoginRequest(accountId, username, password), ct);
- Po potrebi pozivati:
CreatePaymentAsyncsa linijama artikala, valutom i metapodacima.CancelPaymentAsync(paymentId)za otkazivanje placanja.CreateCashInAsyncsa iznosom, valutom.CancelCashInAsync(cashInId)za otkazivanje cashIna.CreateCashOutAsyncsa iznosom, valutom.CompleteCashOutAsync(cashOutId)za potvrdu placanja.CancelCashOutAsync(cashOutId)za otkazivanje cashOuta.
await client.CreatePaymentAsync(
new CashDeskPaymentCreateRequest(
totalAmount: 25.00m,
currency: "BAM",
lineItems: new[]
{
new CashDeskPaymentLineItemRequest("Brasno", 25.00m)
},
paymentMetadata: Array.Empty<CashDeskPaymentMetadata>()),
cancellationToken);
await client.CancelPaymentAsync(paymentId, cts.Token);
await client.CreateCashInAsync(
new CashDeskCashInCreateRequest(
totalAmount: 25.00m,
currency: "BAM",
cancellationToken);
await client.CancelCashInAsync(cashInId, cts.Token);
await client.CreateCashOutAsync(
new CashDeskCashOutCreateRequest(
totalAmount: 25.00m,
currency: "BAM",
cancellationToken);
await client.CancelCashOutAsync(cashOutId, cts.Token);
- Rukovati događajima koje server šalje (npr.
PaymentCreated,PaymentCompleted,cashInCreated, ...). - Na gašenje aplikacije ili gubitak konekcije pozvati
DisconnectAsynciDisposeAsync(ili koristitiawait usingkao u primjerima).
await client.DisconnectAsync();
Događaji
| Događaj | Opis | Payload (ključna polja) |
|---|---|---|
CashierLoginSucceeded |
Server je prihvatio cashier.login. |
Cashier (AccountId, UserName, Location…), opciona polja PendingPayment + PaymentDeepLink, PendingCashIn + CashInDeepLink, PendingCashOut + CashOutDeepLink (zavisno od tipa pending transakcije). |
CashierLoginFailed |
Prijava odbijena. | CashDeskErrorPayload – Code (npr. InvalidCredentials, UserLocked) i Message. Nijedno polje nije null; koristi ih za prikaz operateru ili za audit log. |
PaymentCreated |
payment.create uspješan. |
PaymentCreatedPayload – Payment (PaymentDetailsResponse: Id, Amount, Currency, Status, Metadata, LineItems), obavezni PaymentDeepLink. |
TransactionCreateFailed |
Kreiranje transakcije odbijeno (transaction.create.error). |
TransactionCreateErrorPayload – nasljeđuje CashDeskErrorPayload. Opciona polja: PendingPayment + PaymentDeepLink, PendingCashIn + CashInDeepLink, PendingCashOut + CashOutDeepLink (zavisno od tipa transakcije), uz Code i Message. |
PaymentCompleted |
Korisnik je završio plaćanje (payment.completed). |
PaymentCompletedPayload – Payment (iste strukture kao iznad) i UserId koji je inicirao završetak. |
GeneralErrorReceived |
Šalje se cashdesk.error za sve ostale greške protokola. |
CashDeskErrorPayload – Code, Message. Koristite za prikaz korisniku ili logovanje; može značiti da je server odbio komandu zbog stanja uređaja. |
ConnectionClosed |
Konekcija zatvorena sa bilo koje strane. | ConnectionClosedEventArgs – Status (npr. NormalClosure, AbnormalClosure), Description (poruka servera ili izuzetak). Korisno za prikaz i za retry logiku. |
CashInCreated |
cashIn.create uspješan. |
CashInCreatedPayload – CashIn (CashInDetailsResponse: Id, Amount, Currency, Status, Location, CreatedAt), obavezni CashInDeepLink. |
CashInCompleted |
Korisnik je završio cashIn (cashIn.completed). |
CashInCompletedPayload – CashIn (iste strukture kao iznad) i UserId koji je inicirao završetak. |
CashOutCreated |
cashOut.create uspješan. |
CashOutCreatedPayload – CashOut (CashOutDetailsResponse: Id, Amount, Currency, Status, Location, CreatedAt), obavezni CashOutDeepLink. |
CashOutPaidByUser |
cashOut uplacen od strane usera | CashOutPaidByUserPayload – CashOut (CashOutDetailsResponse: Id, Amount, Currency, Status, Location, CreatedAt) i UserId koji je inicirao uplatu. |
CashOutCompleted |
Korisnik je završio cashOut (cashOut.completed). |
CashInCompletedPayload – CashOut (iste strukture kao iznad) i UserId koji je inicirao završetak. |
Obavezna polja po zahtjevima
CashierLoginRequest:AccountId- string (obavezno)UserName- string (obavezno)Password- string (obavezno)
CashDeskPaymentCreateRequest:TotalAmount- decimal (obavezan)Currency- string (defaultBAM).LineItems-CashDeskPaymentLineItemRequest(opcionalan)Name- string (obavezan)UnitPrice- decimal (obavezan)Quantity- int (default 1)
PaymentMetadata-CashDeskPaymentMetadata(može biti prazna lista)Key- stringValue- stringDisplayToUser- bool (defaultfalse).
CashDeskPaymentCancelRequest:PaymentId- Guid (obavezan)
CashDeskCashInCreateRequest:TotalAmount- decimal (obavezan)Currency- string (defaultBAM).
CashDeskCashInCancelRequest:CashInId- Guid (obavezan)
CashDeskCashOutCreateRequest:TotalAmount- decimal (obavezan)Currency- string (defaultBAM).
CashDeskCashOutCompleteRequest:CashOutId- Guid (obavezan)
CashDeskCashOutCancelRequest:CashOutId- Guid (obavezan)
Struktura tipova
PaymentDetailsResponse(server response) sadrži:Id- GuidAmount- decimalCurrency- stringStatus- enum (Pending,Successful,Canceled)Location-LocationInfoName- stringAddress- string
CreatedAt-JsonElement(server šalje datum u ISO formatu)LineItems(listaPaymentLineItemResponse)Id- GuidName- stringQuantity- intUnitPrice- decimalAmount- decimal
Metadata(listaPaymentMetadataResponse)Key- stringValue- stringDisplayToUser- bool
CashInDetailsResponse(server response) sadrži:Id- GuidAmount- decimalCurrency- stringStatus- enum (Pending,Completed,Canceled)Location-LocationInfoName- stringAddress- string
CreatedAt-JsonElement(server šalje datum u ISO formatu)
CashOutDetailsResponse(server response) sadrži:Id- GuidAmount- decimalCurrency- stringStatus- enum (Pending,UserPaid,Completed,Canceled)Location-LocationInfoName- stringAddress- string
CreatedAt-JsonElement(server šalje datum u ISO formatu)
Koristite ova polja direktno ili mapirajte na vlastite DTO klasse. SDK već koristi System.Text.Json sa JsonNamingPolicy.CamelCase, tako da su nazivi polja identični onome što vidite u JSON payload-ima.
Rukovanje greškama
- Svaki poziv (
ConnectAsync,LoginAsync,CreatePaymentAsync,CreateCashInAsync,CreateCashOutAsync, ...) prihvataCancellationToken– koristite ga za timeoute i graceful shutdown. - U slučaju izuzetka u
ReceiveLoopSDK pozivaConnectionClosedsa razlogom. - Ako primite
CashierLoginFailed, tipično treba ponovo pitati korisnika za kredencijale ili blokirati dalji rad. TransactionCreateFailedmože vratitiPendingPayment+PaymentDeepLink,PendingCashIn+CashInDeepLinkiliPendingCashOut+CashOutDeepLink, što vam omogućava prikaz korisniku šta je ostalo otvoreno i direktno usmjeravanje na odgovarajući deep link.
Testiranje i okruženja
- Lokalno: pokrenite sample API na
http://localhost:5000, podesiteappsettings.jsonnaws://localhost:5000/ws/cashdesk. - Development:
DOTNET_ENVIRONMENT=Development+appsettings.Development.jsongdje definišetewss://test-api-emoney.mfsoftware.com/ws/cashdeskili drugi URL. - Production: koristite
wss://api.totopay.ba/ws/cashdesk(TLS) URL koji obezbjeđuje vaš API gateway; provjerite da li treba dodatna autentifikacija na nivou zaglavlja. - Automatski testovi: možete koristiti testove iz Mikrofin.EMoney.CashDeskSdk.Tests.
Resursi
Mikrofin.EMoney.CashDeskSdk.Sample– konzolna aplikacija koja demonstrira sve funkcionalnosti (prijava, kreiranje uplata, praćenje događaja).- Github repo: https://github.com/EvoltDev/Mikrofin.EMoney.CashDeskSdk/tree/main/Mikrofin.EMoney.CashDeskSdk.Sample
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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 was computed. 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 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Text.Json (>= 6.0.11)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.