Download the PHP package iamtime/uzpay without Composer

On this page you can find all versions of the php package iamtime/uzpay. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package uzpay

uzpay

Packagist PHP

Payme, Click, Uzum, Paynet и Octo (карты Visa, Mastercard, Uzcard, Humo) для магазинов Узбекистана на чистом PHP. Ответы на вызовы провайдеров, сохранённые карты и повторные платежи Payme, ссылки на оплату, строки фискального чека и эмулятор оплаты для тестов. Без зависимостей, с любым фреймворком или без него.

Неофициальная библиотека: не связана с Payme, Click, Uzum, Paynet и Octo.

English

Возможности

Провайдер Классы Что умеет
Payme Merchant API Payme\Merchant все шесть методов: CheckPerformTransaction, CreateTransaction, PerformTransaction, CancelTransaction, CheckTransaction, GetStatement. Basic-авторизация, тестовый ключ, блокировка при создании и проведении, истечение транзакции через 12 часов
Payme Subscribe API Payme\Subscribe сохранённые карты (токен + код из SMS) и чеки, которые магазин оплачивает сам: подписки, повторные платежи, холдирование, возврат
Click SHOP API Click\Shop Prepare и Complete, подпись md5. Повторный Prepare возвращает ту же транзакцию
Uzum Bank Merchant API Uzum\Merchant check, create, confirm, reverse, status. Basic-авторизация, суммы в тийинах
Paynet Paynet\Merchant GetInformation, PerformTransaction, CheckTransaction, CancelTransaction, GetStatement, ChangePassword. Paynet списывает деньги до вызова, поэтому заказ оплачивается за один вызов
Octo Octo\Client, Octo\Payments, Octo\Notifications страница оплаты Octo, двухстадийная оплата (Octo держит деньги, мы отвечаем capture или cancel), возврат

И ещё:

Если заказ изменили или оплатили другим способом, пока провайдер проводил оплату, эта оплата не проходит. Заказ помечается оплаченным ровно один раз, каким бы провайдером его ни оплатили.

Установка

PHP 8.2+ и ext-mbstring. Для Octo и Payme Subscribe API нужен ext-curl или свой Http\Transport.

Как подключить

1. Четыре интерфейса

Интерфейс Что это
Contracts\Payable то, что оплачивают: заказ или счёт. Номер, сумма в сумах ("125000.00"), состояние, markPaidVia(), фискальный чек
Contracts\PayableSource поиск заказа по номеру из вызова провайдера и имя этого поля (order_id)
Contracts\Gateway ключи магазина у провайдера и тестовый режим
Contracts\TransactionStore таблица транзакций. atomic() запускает код в транзакции БД, чтения внутри неё блокируют строки (SELECT … FOR UPDATE)

Готовые реализации есть в примерах: на PDO (examples/pdo/) и на Laravel (examples/laravel/). Gateway может быть совсем простым:

2. Ключи

Провайдер Ключи в Gateway::credential() Тестовый режим (testMode())
Payme merchant_id (id кассы), key, test_key проверяется test_key; Subscribe API идёт на checkout.test.paycom.uz; ссылка - на test.paycom.uz
Click service_id, merchant_id, secret_key нет: тестовые ключи выдаёт Click
Uzum service_id, login, password нет: тестовые ключи выдаёт Uzum
Paynet service_id (необязательно), login, password нет: тестовые ключи выдаёт Paynet
Octo shop_id, secret, unique_key (выдаёт поддержка Octo, нужен для подписи уведомлений) в Octo уходит test: true

3. Адреса для вызовов провайдеров

Payme, Uzum, Paynet и Octo присылают JSON, Click - поля формы. Адреса указываются в кабинетах провайдеров.

Заказ становится оплаченным только здесь: Payable::markPaidVia() вызывается один раз, внутри транзакции atomic(). Возврат покупателя со страницы оплаты ничего не оплачивает.

4. Кнопка «Оплатить»

Octo фискализирует корзину только по товарам, которые менеджер Octo заранее внёс для магазина. Когда они внесены, передайте корзину: start($order, $back, $notify, ['basket' => Octo\Basket::fromReceipt($order->fiscalDetail(), $inn)]).

Payme Subscribe API: сохранённые карты

Покупатель один раз сохраняет карту, дальше магазин сам списывает с неё деньги: подписка, ежемесячный счёт, оплата в одно касание.

Что нужно заранее:

Сохранение карты происходит в браузере, номер карты не попадает на ваш сервер:

  1. Форма карты вызывает cards.create, cards.get_verify_code и cards.verify на checkout.paycom.uz/api с заголовком X-Auth: <id кассы> (Payme\Subscribe::frontAuth($keys)). Код из SMS вводит владелец карты.
  2. Браузер отправляет на сервер только токен.
  3. Сервер проверяет токен и хранит токен и маску номера:

Списание:

Остальное:

Метод Что делает
createReceipt($amount, $account, $description, $detail, hold: false) / receiptFor($order) создать чек
payReceipt($id, $token, $payer, hold: false) оплатить чек сохранённой картой
charge($order, $token, ...) создать и оплатить; если Payme отказал, чек отменяется
sendReceipt($id, $phone) Payme отправит покупателю SMS со ссылкой на оплату
cancelReceipt($id) отменить неоплаченный, вернуть деньги за оплаченный, отпустить захолдированный
confirmHold($id) списать захолдированные деньги (hold: true при создании и оплате)
checkReceipt($id) → ReceiptState состояние: 0 создан, 4 оплачен, 5 холд, 50 отменён...
getReceipt($id), receipts($from, $to) чек целиком, список чеков за период (время в мс)
createCard(), sendVerifyCode(), verifyCard(), removeCard() карты с сервера: только если вы сертифицированы для работы с номерами карт (PCI DSS); removeCard() - отвязать карту

В песочнице Payme код из SMS для любой тестовой карты - 666666 (Subscribe::TEST_CODE).

Тестовый режим и проверка без провайдера

Testing\InMemoryTransactions хранит транзакции в памяти, Sandbox\Emulator присылает вызовы провайдера в том же порядке и с той же подписью:

То же для Emulator::click(), uzum(), paynet() и octo(). API Octo в памяти - Testing\FakeOcto, Subscribe API - Testing\FakePaymeSubscribe (его колбэк получает оплаченный чек, чтобы проиграть вызовы Merchant API эмулятором). Их же можно поставить на тестовую страницу магазина с кнопками «оплатить» и «отказаться».

Фискальный чек

Безопасность

Об уязвимостях сообщайте по SECURITY.md, не в открытых issues.

Примеры

Примеры лежат в репозитории (в пакет из Composer они не входят) и запускаются без установки: php examples/sandbox.php.

Файл Что показывает
sandbox.php оплату целиком в памяти всеми пятью провайдерами; Click с отказом и повторной оплатой
payme-subscribe.php сохранить карту с кодом из SMS и списывать с неё ежемесячные счета
fiscal-receipt.php чек с МХИК, кодом упаковки и НДС; что налоговая не примет
checkout-links.php ссылки на оплату Payme (боевую и тестовую), Click, Uzum и Paynet
pdo/ интеграция на чистом PHP: таблицы, заказ, хранилище транзакций, вебхук. php examples/pdo/demo.php оплачивает и возвращает заказы в SQLite
laravel/ то же для Laravel: миграция, модели, EloquentTransactions, контроллер с маршрутами

Тесты пакета: composer install && composer test. Изменения - в CHANGELOG.md. Лицензия MIT.


O‘zbekcha

Payme, Click, Uzum, Paynet va Octo (Visa, Mastercard, Uzcard, Humo kartalari) O‘zbekiston do‘konlari uchun, toza PHP. Provayder so‘rovlariga javoblar, Payme saqlangan kartalari va takroriy to‘lovlar, to‘lov havolalari, fiskal chek qatorlari va sinov uchun to‘lov emulyatori. Bog‘liqliklarsiz, istalgan freymvork bilan yoki usiz. Norasmiy kutubxona: Payme, Click, Uzum, Paynet va Octo bilan bog‘liq emas.

O‘rnatish: composer require iamtime/uzpay. PHP 8.2+ va ext-mbstring; Octo va Payme Subscribe API uchun ext-curl yoki o‘zingizning Http\Transport.

Imkoniyatlar

Ulash. Ilova to‘rtta interfeysni amalga oshiradi: Payable (buyurtma), PayableSource (buyurtmani raqami bo‘yicha topish), Gateway (kalitlar va sinov rejimi), TransactionStore (tranzaksiyalar jadvali; atomic() DB tranzaksiyasi, ichidagi o‘qishlar qatorlarni qulflaydi). Kod misollari yuqorida, rus bo‘limida.

Provayder Kalitlar Sinov rejimi
Payme merchant_id, key, test_key test_key tekshiriladi, Subscribe API checkout.test.paycom.uz ga boradi
Click service_id, merchant_id, secret_key yo‘q: sinov kalitlarini Click beradi
Uzum service_id, login, password yo‘q
Paynet service_id (ixtiyoriy), login, password yo‘q
Octo shop_id, secret, unique_key Octo ga test: true yuboriladi

Manzillar: Payme, Uzum, Paynet va Octo JSON yuboradi, Click - forma maydonlari. Payme javobi har doim HTTP 200; Uzum va Octo uchun Uzum\Merchant::httpStatus() va Octo\Notifications::httpStatus(). Buyurtma faqat shu yerda to‘langan bo‘ladi: markPaidVia() bir marta, tranzaksiya ichida chaqiriladi.

Payme Subscribe API. Karta brauzerda saqlanadi: forma cards.create, cards.get_verify_code, cards.verify ni X-Auth: <kassa id> (Subscribe::frontAuth()) bilan chaqiradi, serverga faqat token keladi, server uni checkCard() bilan tekshiradi. Keyin charge($buyurtma, $token) chek yaratib to‘laydi; to‘lov paytida Payme kassaning Merchant API sini chaqiradi, buyurtma o‘sha yerda to‘lanadi. Boshqa metodlar: createReceipt(), payReceipt(), sendReceipt(), cancelReceipt(), confirmHold(), checkReceipt() → ReceiptState, getReceipt(), receipts(), removeCard(). Xatolar: SubscribeException (kod va ru / uz / en matnlar). Payme qumdonida SMS kodi - 666666.

Xavfsizlik. Karta raqamlari serverga kelmasin; kalitlarni loglarga yozmang (o‘z Http\Transport ingiz sarlavha va tanani loglamasin); Payme uchun alohida test_key saqlang; kolbek manzillariga faqat provayderlar manzillarini qo‘ying va CSRF ni o‘chiring. Zaifliklar haqida SECURITY.md orqali xabar bering.

Misollar repozitoriyda (examples/): sandbox.php, payme-subscribe.php, fiscal-receipt.php, checkout-links.php, pdo/, laravel/. Testlar: composer install && composer test. Litsenziya: MIT.


English

Payme, Click, Uzum, Paynet and Octo (Visa, Mastercard, Uzcard and Humo cards) for Uzbekistan shops in plain PHP: answers to the providers' callbacks, Payme saved cards and recurring payments, checkout links, fiscal receipt lines and a payment emulator for tests. No dependencies; works with any framework or none. Unofficial: not affiliated with Payme, Click, Uzum, Paynet or Octo.

Features

Provider Classes What it does
Payme Merchant API Payme\Merchant all six methods: CheckPerformTransaction, CreateTransaction, PerformTransaction, CancelTransaction, CheckTransaction, GetStatement. Basic auth, test key, a lock around create and perform, transactions expire after 12 hours
Payme Subscribe API Payme\Subscribe saved cards (a token plus the SMS code) and receipts the shop charges itself: subscriptions, repeat payments, holds, refunds
Click SHOP API Click\Shop Prepare and Complete, md5 signature. A repeated Prepare returns the same transaction
Uzum Bank Merchant API Uzum\Merchant check, create, confirm, reverse, status. Basic auth, amounts in tiyin
Paynet Paynet\Merchant GetInformation, PerformTransaction, CheckTransaction, CancelTransaction, GetStatement, ChangePassword. Paynet takes the money before calling, so an order is paid in one call
Octo Octo\Client, Octo\Payments, Octo\Notifications Octo's payment page, two-stage payment (Octo holds the money, you answer capture or cancel), refunds

Also: checkout links (Payme\Checkout, Click\Checkout, Uzum\Checkout, Paynet\Checkout), fiscal receipt lines (Fiscal\Receipt with the MXIK (IKPU) code, package code and VAT; problems() lists what the tax office will reject; Octo\Basket), Sandbox\Emulator, Testing\InMemoryTransactions, Testing\FakeOcto, Testing\FakePaymeSubscribe, and Money (so'm ↔ tiyin digit by digit, no float rounding).

If the order was changed or paid another way while a provider was paying it, that payment does not go through. An order is marked paid exactly once, whichever provider paid it.

Install

PHP 8.2+ and ext-mbstring. Octo and the Payme Subscribe API need ext-curl or your own Http\Transport.

Setup

Your app implements four interfaces:

Interface What it is
Contracts\Payable what is paid: an order or an invoice. Number, sum in so'm ("125000.00"), state, markPaidVia(), the fiscal receipt
Contracts\PayableSource finds an order by the number in a callback and names that field (order_id)
Contracts\Gateway your keys at a provider and the test mode
Contracts\TransactionStore the transactions table. atomic() runs a DB transaction; reads inside it lock rows (SELECT … FOR UPDATE)

Ready implementations are in examples/pdo/ (plain PDO) and examples/laravel/ (Eloquent).

Provider Keys in Gateway::credential() Test mode (testMode())
Payme merchant_id (cashbox id), key, test_key test_key is checked; the Subscribe API goes to checkout.test.paycom.uz; links go to test.paycom.uz
Click service_id, merchant_id, secret_key none: Click issues test keys
Uzum service_id, login, password none: Uzum issues test keys
Paynet service_id (optional), login, password none: Paynet issues test keys
Octo shop_id, secret, unique_key (from Octo support, signs notifications) sends test: true to Octo

Callbacks

Payme, Uzum, Paynet and Octo post JSON, Click posts form fields. Set the URLs in each provider's merchant dashboard.

An order becomes paid only here: Payable::markPaidVia() is called once, inside atomic(). The buyer coming back from a payment page pays nothing.

Checkout links: Payme\Checkout::url($merchantId, 'order_id', $number, $tiyin, $returnUrl, test: false), Click\Checkout::url($serviceId, $merchantId, $amount, $number, $returnUrl), Uzum\Checkout::url($serviceId, 'order_id', $number, $tiyin, $returnUrl), Paynet\Checkout::url($merchant, $number, $tiyin). For Octo, (new Octo\Payments($store, new Octo\Client($octoKeys)))->start($order, $returnUrl, $notifyUrl) asks Octo for the page; the default description is Russian ("Заказ №") and so is the page - change them with $options (description, language). Octo fiscalises a basket only for goods its manager has registered for the shop: then pass ['basket' => Octo\Basket::fromReceipt($order->fiscalDetail(), $tin)].

Payme Subscribe API: saved cards

The buyer saves a card once; then the shop charges it itself (subscriptions, monthly invoices, one-tap payments).

Before you start: ask Payme to enable the Subscribe API (and holds, if needed) for the cashbox, and connect the Merchant API of the same cashbox (Payme\Merchant). While paying a receipt Payme calls CheckPerformTransaction, CreateTransaction and PerformTransaction for the receipt's account: the order becomes paid there, never from the answer of charge(). The keys are those of the Merchant API.

Saving a card happens in the browser, so the card number never reaches your server: the card form calls cards.create, cards.get_verify_code and cards.verify on checkout.paycom.uz/api with X-Auth: <cashbox id> (Payme\Subscribe::frontAuth($keys)), the owner types the SMS code, and only the token comes to your server.

Other methods: createReceipt(), receiptFor(), payReceipt(), sendReceipt() (Payme texts the buyer a payment link), cancelReceipt() (drop an unpaid receipt, refund a paid one, release a hold), confirmHold() (take held money; pass hold: true when creating and paying), checkReceipt() → ReceiptState, getReceipt(), receipts($from, $to), and the card methods createCard(), sendVerifyCode(), verifyCard(), removeCard() (call the first three from a server only if you are PCI DSS certified). In Payme's sandbox the SMS code of every test card is 666666 (Subscribe::TEST_CODE).

Testing without the providers

Testing\InMemoryTransactions keeps transactions in memory, and Sandbox\Emulator sends a provider's calls in the same order and signed with your keys:

The same goes for Emulator::click(), uzum(), paynet() and octo(). Testing\FakeOcto is Octo's API in memory, and Testing\FakePaymeSubscribe is the Subscribe API in memory (its callback gets every paid receipt so you can replay the Merchant API calls with the emulator).

Security

Report vulnerabilities as described in SECURITY.md, not in public issues.

Examples

The examples are in the repository (Composer does not install them) and run without installing: php examples/sandbox.php.

Tests: composer install && composer test. Changes: CHANGELOG.md. License: MIT.


All versions of uzpay with dependencies

PHP Build Version
Package Version
Requires php Version ^8.2
ext-mbstring Version *
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package iamtime/uzpay contains the following files

Loading the files please wait ...