RPlus.PartnerSdk.Sqlite
1.1.3
dotnet add package RPlus.PartnerSdk.Sqlite --version 1.1.3
NuGet\Install-Package RPlus.PartnerSdk.Sqlite -Version 1.1.3
<PackageReference Include="RPlus.PartnerSdk.Sqlite" Version="1.1.3" />
<PackageVersion Include="RPlus.PartnerSdk.Sqlite" Version="1.1.3" />
<PackageReference Include="RPlus.PartnerSdk.Sqlite" />
paket add RPlus.PartnerSdk.Sqlite --version 1.1.3
#r "nuget: RPlus.PartnerSdk.Sqlite, 1.1.3"
#:package RPlus.PartnerSdk.Sqlite@1.1.3
#addin nuget:?package=RPlus.PartnerSdk.Sqlite&version=1.1.3
#tool nuget:?package=RPlus.PartnerSdk.Sqlite&version=1.1.3
RPlus.PartnerSdk (.NET)
Публичный SDK для интеграции POS-систем с API программы лояльности RPlus.
SDK закрывает типовой поток:
- Проверка QR/OTP (
scan/shortcode). - Передача финала заказа (
orders/closed). - Передача отмены (
orders/cancelled). - Отправка событий/телеметрии (
events).
Подходит для iiko, r_keeper и любых кастомных POS-решений на .NET.
Что умеет SDK
- Упрощает работу с HTTP API (готовый
PartnerClient). - Автоматически ставит служебные заголовки (
X-Integration-Key,Idempotency-Key,X-Trace-Id). - Поддерживает HMAC-подпись запросов:
X-Integration-SignatureX-Integration-Timestamp
- Нормализует OTP (в scan-запросах).
- Даёт надежные очереди с ретраями:
ReliableCommitQueueдляorders/closedиorders/cancelledReliableEventQueueдляevents
- Есть 2 варианта хранения очереди:
- JSON-файлы (
FileCommitQueueStore,FileEventQueueStore) - SQLite (проект
RPlus.PartnerSdk.Sqlite)
- JSON-файлы (
Совместимость
RPlus.PartnerSdk:netstandard2.0RPlus.PartnerSdk.Sqlite:netstandard2.0- Работает с:
- .NET Framework 4.7.2+
- .NET 6/7/8+
Cross-platform status
CI runs on every push and pull request for:
- Windows
- Linux
- macOS
Workflow file:
.github/workflows/ci.yml
Релизы
Автоматический workflow релиза:
.github/workflows/release.yml
Как выпустить новую версию:
- Создать тег формата
vX.Y.Z(напримерv1.1.0). - Запушить тег в GitHub.
- Workflow сам:
- соберет и протестирует SDK,
- сформирует
.nupkgи.snupkg, - создаст GitHub Release с артефактами.
Опционально: если в репозитории задан секрет NUGET_API_KEY, пакеты автоматически публикуются в NuGet.org.
Установка
Сейчас самый простой путь: project reference или исходники из репозитория.
Пример:
<ItemGroup>
<ProjectReference Include="src\RPlus.PartnerSdk\RPlus.PartnerSdk.csproj" />
</ItemGroup>
Если нужен SQLite-стор:
<ItemGroup>
<ProjectReference Include="src\RPlus.PartnerSdk.Sqlite\RPlus.PartnerSdk.Sqlite.csproj" />
</ItemGroup>
Сборка
cd sdk
dotnet build .\RPlus.PartnerSdk-dotnet.sln -c Release
Быстрый старт (минимальная интеграция)
using RPlus.PartnerSdk.Http;
using RPlus.PartnerSdk.Models;
var client = new PartnerClient(new PartnerSdkOptions
{
BaseUrl = "https://api.example.com",
IntegrationKey = "pk_live_xxx",
SigningSecret = "sk_live_xxx", // обязателен для orders/closed
UserAgent = "mypos/1.0 rplus-sdk/1.0"
});
// 1) Сканирование QR или OTP
var scan = await client.ScanAsync(
new ScanRequest
{
QrToken = "eyJhbGciOi...", // или OtpCode = "123456"
OrderId = "order-123",
OrderSum = 14985.00m,
TerminalId = "POS-01",
CashierId = "cashier-1",
Context = "partner"
},
idempotencyKey: Guid.NewGuid().ToString(),
traceId: Guid.NewGuid().ToString("N")
);
// 2) После успешной оплаты отправляем closed
await client.OrderClosedAsync(new OrderClosedRequest
{
ScanId = scan.ScanId,
OrderId = "order-123",
ClosedAt = DateTimeOffset.UtcNow,
FinalOrderTotal = 14486.00m
});
Типовой флоу для POS
- Кассир сканирует QR или вводит OTP.
- POS вызывает
ScanAsync(...). - POS применяет скидку в заказ.
- Заказ оплачен:
- вызвать
OrderClosedAsync(...).
- Если применение отменено/заказ отменён:
- вызвать
OrderCancelledAsync(...)(с reason).
Рекомендуется всегда передавать:
OrderIdTerminalIdCashierIdIdempotency-KeyX-Trace-Id
Надежный режим (очередь + ретраи)
Для реальной эксплуатации лучше не блокировать кассу сетью.
Используйте очереди SDK: запись локально + фоновая отправка.
Вариант 1: JSON-файлы
using RPlus.PartnerSdk.Http;
using RPlus.PartnerSdk.Models;
using RPlus.PartnerSdk.Reliability;
var client = new PartnerClient(new PartnerSdkOptions
{
BaseUrl = "https://api.example.com",
IntegrationKey = "pk_live_xxx",
SigningSecret = "sk_live_xxx"
});
var commitStore = new FileCommitQueueStore(@"C:\posdata\rplus_commits.json");
var commitQueue = new ReliableCommitQueue("https://api.example.com", client, commitStore);
await commitQueue.InitializeAsync();
commitQueue.Start();
await commitQueue.EnqueueOrderClosedAsync(new OrderClosedRequest
{
ScanId = Guid.Parse("11111111-1111-1111-1111-111111111111"),
OrderId = "order-123",
ClosedAt = DateTimeOffset.UtcNow,
FinalOrderTotal = 14486.00m
});
var eventStore = new FileEventQueueStore(@"C:\posdata\rplus_events.json");
var eventQueue = new ReliableEventQueue("https://api.example.com", client, eventStore);
await eventQueue.InitializeAsync();
eventQueue.Start();
await eventQueue.EnqueueAsync(new PartnerEvent
{
Type = "scan_succeeded",
OrderId = "order-123",
TerminalId = "POS-01"
});
Вариант 2: SQLite
using RPlus.PartnerSdk.Http;
using RPlus.PartnerSdk.Reliability;
using RPlus.PartnerSdk.Sqlite;
var client = new PartnerClient(new PartnerSdkOptions
{
BaseUrl = "https://api.example.com",
IntegrationKey = "pk_live_xxx",
SigningSecret = "sk_live_xxx"
});
var commitStore = new SqliteCommitQueueStore(@"C:\posdata\rplus_queue.db");
var commitQueue = new ReliableCommitQueue("https://api.example.com", client, commitStore);
await commitQueue.InitializeAsync();
commitQueue.Start();
var eventStore = new SqliteEventQueueStore(@"C:\posdata\rplus_queue.db");
var eventQueue = new ReliableEventQueue("https://api.example.com", client, eventStore);
await eventQueue.InitializeAsync();
eventQueue.Start();
Обработка ошибок
Основное исключение SDK: PartnerApiException.
Что можно получить:
StatusCode(HTTP-код)ErrorCode(код ошибки сервера, если есть)ResponseBody(сырой ответ сервера)
Пример:
try
{
await client.OrderClosedAsync(request);
}
catch (PartnerApiException ex)
{
Console.WriteLine($"HTTP={(int)ex.StatusCode}, code={ex.ErrorCode}");
Console.WriteLine(ex.ResponseBody);
}
Логирование и безопасность
В PartnerClient можно передать traceLogger:
var client = new PartnerClient(options, traceLogger: line => Console.WriteLine(line));
SDK маскирует чувствительные значения в логах:
- токены/подписи в headers
qrTokenиotpCodeв body
Базовые рекомендации по эксплуатации
- Для кассового ПО используйте очереди (
ReliableCommitQueue,ReliableEventQueue), а не "чистые" прямые вызовы. - Храните локальные файлы очередей в папке с правами на запись для POS-процесса.
- Передавайте стабильный
Idempotency-Keyдля повторяемых операций. - Всегда корректно закрывайте очередь при остановке приложения:
await queue.StopAsync();
Структура репозитория
sdk/
src/
RPlus.PartnerSdk/ // основной SDK (HTTP, models, reliability)
RPlus.PartnerSdk.Sqlite/ // optional SQLite stores
RPlus.PartnerSdk-dotnet.sln
README.md
Планы публикации
Репозиторий готов для публичного GitHub.
При необходимости можно добавить:
- NuGet package publish pipeline
- GitHub Actions (build/test/pack)
- versioning policy (SemVer)
Контракт API
Контракт серверных endpoint и бизнес-правила интеграции описаны в основном проекте:
project/docs/POS_INTEGRATION_SPEC_V1.md
| 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 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 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
- Microsoft.Data.Sqlite (>= 8.0.2)
- RPlus.PartnerSdk (>= 1.1.3)
- SQLitePCLRaw.bundle_e_sqlite3 (>= 2.1.8)
-
net8.0
- Microsoft.Data.Sqlite (>= 8.0.2)
- RPlus.PartnerSdk (>= 1.1.3)
- SQLitePCLRaw.bundle_e_sqlite3 (>= 2.1.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.3 | 34 | 3/3/2026 |