uz-payment-sdk
v0.2.0
Published
Neutral payment SDK core for Uzbekistan providers.
Maintainers
Readme
Payment SDK
TypeScript SDK для интеграции с payme, click и uzum.
Быстрая документация для интегратора лежит в:
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/README.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/getting-started.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/nextjs.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/providers.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/webhooks.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/testing.md
- /mnt/data/projects/business/uz-pay-sdk/docs/sdk/releasing.md
Install
npm install uz-payment-sdkMoney Contract
Во всём SDK поле amount передаётся просто в UZS.
500=500 UZS1250.5=1250.5 UZS
Это правило едино для:
Payme receipts.*Click invoice/payment/fiscalizationUzum Checkout- webhook payloads и normalized responses
Внутри драйверов SDK сам конвертирует сумму в provider-specific формат там, где провайдер ожидает минимальные единицы валюты.
Stable Contract
Для интеграции можно считать стабильными такие правила:
PaymentResult.amountвсегда возвращается вUZSPaymentResult.successвычисляется из нормализованногоstatus, а не из raw provider payloadPaymentResult.isTerminal,isSettled,isFinalSuccess,requiresActionдают более безопасные флаги для серверного branchingtransactionId— основной SDK id для дальнейших операцийproviderInvoiceIdиproviderPaymentIdсохраняют official ids провайдера, когда они реально естьcheckoutReferenceдаёт стабильную ссылку на checkout/order flow без парсингаraw
Эти правила зафиксированы и экспортируются из SDK как:
SDK_RESULT_CONTRACTSDK_SUPPORT_POLICY
Quick Start
import { PaymentsService } from 'uz-payment-sdk';
const payments = new PaymentsService({
providers: {
click: {
serviceId: '101202',
merchantId: 'merchant-1',
merchantUserId: 'merchant-user-1',
secretKey: 'secret',
apiUrl: 'https://api.click.uz/v2/merchant'
}
}
});
const invoice = await payments.createClickInvoice({
orderId: 'order-123',
amount: 500,
phoneNumber: '998901234567'
});
const invoiceUrl = payments.generateInvoiceUrl({
provider: 'click',
orderId: 'order-123',
amount: 500,
returnUrl: 'https://your-app.uz/payments/return'
});PaymentsService поддерживает оба стиля:
create({ provider, ...data })create(provider, data)
И поверх этого даёт явные facade methods:
createClickInvoicecheckClickInvoicecheckClickPaymentcheckClickPaymentByOrdercancelClickPaymentcreatePaymeReceiptcheckPaymeReceiptcancelPaymeReceiptgetPaymeReceiptsendPaymeReceiptpayPaymeReceiptsetPaymeReceiptFiscalDataregisterUzumPaymentcompleteUzumPaymentreverseUzumPaymentrefundUzumPaymentmerchantPayUzumgetUzumReceiptspurchaseUzumReceipt
Если нужен более низкий уровень, можно работать напрямую с provider clients:
PaymeClientClickClientUzumClient
У этих методов можно передавать optional request options:
signaltimeoutMsretry
Для server-side интеграции также доступны helper-ы:
createPaymentsServiceFromEnvcreateWebhookServiceFromEnvcreatePaymentSdkServerServicesparseProviderWebhookRequestprocessProviderWebhookRequest
Для transport integration доступны:
createAxiosTransportcreateFetchTransporttransportиrequestDefaultsвPaymentSdkConfig
Важно для webhook processing:
- для production нужно передать shared
cacheStore(Redis/DB-backed), иначеWebhookServiceне запустит идемпотентную обработку allowInMemoryWebhookIdempotencyоставлен только для single-process development и тестов
Error Model
SDK экспортирует typed errors:
PaymentSdkErrorPaymentValidationErrorPaymentConfigurationErrorPaymentTransportErrorPaymeErrorClickError
У typed errors доступны поля:
codeproviderhttpStatusretryablecategory
Support Matrix
| Provider | Covered now | Notes |
| --- | --- | --- |
| Payme | receipts.create, receipts.check, receipts.cancel, receipts.get, receipts.send, receipts.pay, receipts.set_fiscal_data, hosted invoice URL, optional card token flow (cards.create, cards.get_verify_code, cards.verify, cards.check) | public SDK amount всегда в UZS |
| Click | invoice.create, invoice.status, payment.status, payment.status_by_mti, payment.reversal, hosted invoice URL, fiscalization submit/get endpoints | invoice flow и payment flow разделены по official docs |
| Uzum Checkout | payment.register, payment.getOrderStatus, payment.getOperationState, payment.merchantPay, payment.getReceipts, acquiring.complete, acquiring.refund, acquiring.reverse, acquiring.purchaseReceipt | merchant callbacks вынесены в отдельный toolkit |
| Uzum Merchant API | typed request/response helpers для /check, /create, /confirm, /reverse, /status, basic auth validation helper | нужно реализовать свой HTTP handler в приложении |
Provider Examples
Payme
const payments = new PaymentsService({
providers: {
payme: {
merchantId: process.env.PAYME_MERCHANT_ID!,
key: process.env.PAYME_KEY!,
apiUrl: process.env.PAYME_API_URL!,
}
}
});
const receipt = await payments.createPaymeReceipt({
orderId: 'order-1',
amount: 2500,
});
await payments.sendPaymeReceipt({
transactionId: receipt.transactionId,
phone: '998901234567',
});Click
const status = await payments.checkClickPayment({
paymentId: '1946296773',
});
await payments.cancelClickPayment({
paymentId: '1946296773',
});Uzum
const registered = await payments.registerUzumPayment({
orderId: '504e8fa5-2eab-456a-acc3-822147fd0c533',
amount: 1500,
returnUrl: 'https://merchant.example/return',
});
await payments.refundUzumPayment({
orderId: registered.transactionId,
amount: 1500,
});Uzum Merchant Webhook Toolkit
import {
createUzumMerchantCheckResponse,
createUzumMerchantConfirmErrorResponse,
validateUzumMerchantAuthorization,
} from 'uz-payment-sdk';Доступно:
validateUzumMerchantAuthorizationcreateUzumMerchantAuthorizationHeadercreateUzumMerchantCheckResponsecreateUzumMerchantCheckErrorResponsecreateUzumMerchantCreateResponsecreateUzumMerchantCreateErrorResponsecreateUzumMerchantConfirmResponsecreateUzumMerchantConfirmErrorResponsecreateUzumMerchantReverseResponsecreateUzumMerchantReverseErrorResponsecreateUzumMerchantStatusResponsecreateUzumMerchantStatusErrorResponse
Важно:
helper-ы для Uzum Merchant API повторяют официальный webhook contract провайдера. Если Uzum требует raw amount в минимальных единицах, в этих webhook responses нужно следовать именно official schema.
Webhook Forwarding Env
ENTERPRISE_WEBHOOK_URLENTERPRISE_WEBHOOK_SECRETENTERPRISE_WEBHOOK_TIMEOUT_MSENTERPRISE_WEBHOOK_SOURCEENTERPRISE_WEBHOOK_HEADER_PREFIX
Repo Layout
src/core— стабильные SDK contracts и общие правилаsrc/providers/payme— low-level Payme clientsrc/providers/click— low-level Click clientsrc/providers/uzum— low-level Uzum clientsrc/payments— high-level facade и нормализация результатовsrc/webhooks— webhook parsing, normalization и Uzum merchant toolkitsrc/server— server-only helpers для Next.js/fetch runtimesdocs/examples— минимальные примеры интеграции
Scripts
npm run typechecknpm run test:contractsnpm testnpm run test:bunnpm run test:matrixnpm run buildnpm run release:smoke
