Files
OpenCart4/README.md
T

164 lines
28 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🌟 Платёжный модуль PayAnyWay для [OpenCart](https://www.opencart.com/) v4.x
![openCart](https://img.shields.io/badge/openCart-4.x-0070C0?logo=php&logoColor=white)
![PHP](https://img.shields.io/badge/PHP-8.0%2B-purple)
![License](https://img.shields.io/badge/License-MIT-green)
> **📦 Версия модуля: 1.0.3**
> **ℹ️ Совместимость версий OpenCart:**
> 4.0.2.0, 4.0.2.1, 4.0.2.2, 4.0.2.3, 4.1.0.0, 4.1.0.1, 4.1.0.2, 4.1.0.3, 4.1.0.4
> **ℹ️ Совместимость версий OpenCart "Русская сборка":**
> 4.0.2.1, 4.0.2.2, 4.0.2.3, 4.1.0.0, 4.1.0.4
> **ℹ️ Примечание по валюте**
> Данный модуль работает **только с валютой RUB (Российский рубль)**.
> Перед активацией модуля убедитесь, что на сайте в качестве базовой валюты установлен RUB, либо у пользователя выбран счёт в RUB. Использование других валют не поддерживается.
## 🏗️ Структура модуля
```
├── admin
│ ├── controller/payment/payanyway.php
│ ├── language/{en-gb,ru-ru}/payment/payanyway.php
│ ├── view/image/payment/payanyway.png
│ └── view/template/payment/payanyway.twig
├── catalog
│ ├── controller/payment/
│ │ ├── callback.php — Check URL и Pay URL
│ │ └── payanyway.php — форма оплаты, возврат покупателя
│ ├── controller/startup/payanyway.php — приём Check/Pay URL методом POST, сброс оплаченного заказа из сессии
│ ├── language/{en-gb,ru-ru}/payment/payanyway.php
│ ├── library/payanyway/traits/payanyway.php
│ ├── model/payment/payanyway.php — блокировка заказа
│ └── view/template/payment/payanyway.twig
├── install.json
└── README.md
```
## 🚀 Установка и настройка модуля
1. 📥 [Скачайте архив модуля](https://git.pub.moneta.ru/CMS/openCart4/releases) и переименуйте в `payanyway.ocmod.zip`.
2. 📂 Загрузите расширение через панель управления интернет-магазином.
В разделе **"Модули / Расширения"** выберите подраздел **"Установка расширений"**. Нажмите **"Загрузить"** и выберите скачанный архив `payanyway.ocmod.zip`.
В списке установленных расширений найдите **PayAnyWay** и нажмите **"Установить"**.
3. ⚙️ В подразделе **"Модули / Расширения"** выберите тип расширения **"Оплата"**.
В списке способов оплаты найдите **PayAnyWay** и нажмите:
- **«Установить»** — для установки модуля
- **«Редактировать»** — для перехода к настройкам
4. ✏️ Заполните соответствующие поля в настройках способа оплаты:
| Поле | Описание |
|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Статус** | Включите или выключите модуль оплаты |
| **Номер счёта** | Ваш номер расширенного счёта в системе [MONETA.RU](https://moneta.ru/), только цифры |
| **Код проверки целостности данных** | Код проверки целостности данных, указанный в настройках расширенного счёта в системе [MONETA.RU](https://moneta.ru/). Сохранённый код в форме не показывается: оставьте поле пустым, чтобы не менять его |
| **Сервер платежей** | `Боевой` / `Демо` (демо-площадка MONETA.RU) |
| **Тестовый режим** | Имитация оплаты без реального списания средств. Должен совпадать с настройкой счёта в MONETA.RU |
| **Фискализация чеков** | Включайте, только если к счёту подключён кассовый сервис [kassa.payanyway.ru](https://kassa.payanyway.ru/) |
| **Email для чеков** | Обязателен при фискализации. Подставляется в чек, только если у покупателя нет ни e-mail, ни телефона (ФИО покупателя в чеке остаётся) |
| **НДС** | Ставка НДС всех позиций чека |
| **Признак способа расчёта** | Для товаров, доставки и сборов. Обычно `Полный расчёт`. Проданные подарочные сертификаты всегда идут авансом |
| **Признак предмета расчёта** | Для товаров. Доставка и сборы всегда идут услугой, подарочные сертификаты — платежом |
| **Валюта платежа** | `RUB` |
| **Статусы заказа** | Выберите соответствующие статусы заказа из списка |
| **Обрабатываемый** | Укажите статус заказа, который выставляется при его создании |
| **Успешный** | Укажите статус заказа, который выставляется при успешной оплате |
| **Неуспешный** | Укажите статус заказа, который выставляется при ошибке оплаты |
| **Отменённые** | Заказ в этих статусах не оплачивается: на проверочный запрос и уведомление об оплате модуль отвечает отказом (деньги за такую оплату возвращаются в личном кабинете MONETA.RU, номер операции — в журнале ошибок). Статусы Обрабатываемого, Успешного и Неуспешного заказа выбрать нельзя. По умолчанию `Canceled`, `Canceled Reversal`, `Voided` |
| **URL для уведомлений** | Адрес Check URL и Pay URL для настроек счёта MONETA.RU, кнопка «Скопировать» |
| **Регион отображения** | Географическая зона, в которой будет отображаться способ оплаты |
| **Порядок сортировки** | Определяет порядок отображения платежного метода в списке методов оплаты при оформлении заказа. Чем меньше число, тем выше позиция в списке |
Сумма позиций чека всегда равна сумме оплаты: налоги OpenCart входят в цену товаров, скидки (купоны, подарочные сертификаты, бонусные баллы) распределяются по товарам, доставка и сборы идут отдельными позициями.
> ℹ️ Сумма платёжной формы записывается в номер транзакции (`MNT_TRANSACTION_ID`, например `42_1500000_20261022120000UTC`; время — UTC). Если после показа формы сумма заказа изменилась, оплата по старой форме отклоняется: покупателю нужно заново открыть оплату заказа.
> ⚠️ **После обновления модуля** откройте настройки PayAnyWay, проверьте новые поля (фискализация после обновления включена) и нажмите **«Сохранить»**. Пока при включённой фискализации не задан «Email для чеков», над формой настроек показывается предупреждение.
## 🔄 Обновление модуля
OpenCart 4 не устанавливает расширение поверх уже установленного: загрузка нового архива в **«Установка расширений»** заканчивается ошибкой «Расширение уже установлено» (Extension already installed) или «Файл уже существует» (File already exist), а установка — ошибкой «Путь payanyway/ уже существует» (Path payanyway/ already exists). Обновить модуль можно одним из двух способов.
### Способ 1. Замена файлов — настройки сохраняются (рекомендуется)
Нужен доступ к файлам сайта (FTP, SSH или файловый менеджер хостинга).
1. Распакуйте архив новой версии.
2. Скопируйте из него `admin/`, `catalog/`, `install.json` и `README.md` в каталог `extension/payanyway/` в корне OpenCart с заменой файлов.
3. Откройте настройки PayAnyWay (**«Модули / Расширения» → «Оплата» → PayAnyWay → «Редактировать»**), проверьте новые поля и нажмите **«Сохранить»**.
В списке **«Установка расширений»** останется прежний номер версии — на работу модуля это не влияет.
### Способ 2. Переустановка через панель управления — настройки удаляются
При удалении способа оплаты OpenCart стирает все настройки модуля. Заранее перепишите их; код проверки целостности в форме не показывается — возьмите его в настройках расширенного счёта в личном кабинете MONETA.RU.
1. **«Модули / Расширения» → «Оплата»** → PayAnyWay → **«Деинсталлировать»** (Uninstall).
2. **«Модули / Расширения» → «Установка расширений»** → PayAnyWay → **«Деинсталлировать»** (Uninstall, удаляет файлы модуля), затем **«Удалить»** (Delete, кнопка с корзиной — удаляет архив и строку из списка).
3. Загрузите архив новой версии, переименованный в `payanyway.ocmod.zip`, и нажмите **«Установить»**.
4. **«Модули / Расширения» → «Оплата»** → PayAnyWay → **«Установить»**, затем **«Редактировать»**: заполните настройки и нажмите **«Сохранить»**.
> ⚠️ Если на шаге 3 появляется «Путь payanyway/ уже существует», файлы прежней версии остались на сервере (например, строку удалили корзиной, не нажав перед этим «Деинсталлировать»). Удалите каталог `extension/payanyway/` через FTP или файловый менеджер и снова нажмите **«Установить»**.
---
## 🔧 Инструкция по настройке счета PayAnyWay
1. 📝 [Зарегистрируйтесь](https://payanyway.ru/partnerRegistration.htm) в платёжной системе PayAnyWay и заполните все необходимые данные. Дождитесь проверки аккаунта и создайте **расширенный счет**.
2. ⚙️ Заполните настройки расширенного счета (раздел **«Мой счет» → «Управление счетами» → «Редактировать счет»**):
| Параметр | Значение |
|------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Тестовый режим** | `Нет` |
| **Check URL** | `https://your_site_name/index.php?route=extension/payanyway/payment/callback` |
| **Pay URL** | `https://your_site_name/index.php?route=extension/payanyway/payment/callback` |
| **HTTP method<sup>\*</sup>** | `GET` или `POST` (требуется настройка) |
| **Можно переопределять настройки в URL** | `Да` |
| **Подпись формы оплаты обязательна** | `Да` |
| **Код проверки целостности данных** | `ваш_код` (произвольный набор символов) |
| **Success URL** | Оставить пустым |
| **Fail URL** | Оставить пустым |
| **InProgress URL** | Необязательное поле. URL страницы магазина, куда должен попасть покупатель после успешного запроса на авторизацию средств, до подтверждения списания и зачисления средств. Поддерживается ограниченным количеством методов оплаты. Переход пользователя произойдет независимо от получения магазином средств и отчета о проведенной оплате |
| **Return URL** | Оставить пустым |
> ⚠️ **Важно!** Для кириллического домена PayURL и CheckURL должны быть указаны в кодировке [Punycode](https://2ip.ru/punycode/).
### <sup>\*</sup> 📨 Уведомления методом POST
При **HTTP method** = `POST` MONETA.RU переносит параметры из адреса Check URL / Pay URL в тело запроса, в том числе `route=extension/payanyway/payment/callback`. Штатный OpenCart 4 ищет маршрут только в адресе и без доработки отвечает главной страницей, а платёжная форма показывает «Код ошибки: 302».
Модуль решает это собственным startup-контроллером витрины `payanyway_post_route`: маршрут колбэка (и только его) берётся из тела запроса. Ядро OpenCart не изменяется, модификации обновлять не нужно.
1. Startup регистрируется автоматически при установке способа оплаты PayAnyWay (**«Модули / Расширения» → «Оплата» → «Установить»**).
2. Если модуль обновлён поверх старой версии без переустановки, откройте настройки PayAnyWay и нажмите **«Сохранить»**: startup зарегистрируется при сохранении.
3. Если startup не зарегистрирован или выключен, над формой настроек будет жёлтое предупреждение. Проверить вручную можно в **«Модули / Расширения» → «Startup»** (Extensions → Startup): строка `payanyway_post_route` должна быть включена.
Если включить startup не удаётся, выберите в настройках счёта **HTTP method** = `GET`: при GET уведомления доходят и без него. Но startup нужен и для оформления следующего заказа (см. ниже про `SameSite`), поэтому лучше держать его включённым.
> ⚠️ **Важно!** Если после возврата с сайта MONETA.RU покупатель оказывается разлогинен, дело в атрибуте `SameSite` cookie сессии. В OpenCart 4 по умолчанию стоит `Strict`: с ним браузер не отправляет cookie, когда покупатель переходит на магазин с другого сайта, и OpenCart открывает новую пустую сессию. Старая сессия при этом сохраняет оплаченный заказ: без startup `payanyway_post_route` следующий заказ в том же браузере не создаётся, и платёжная форма открывает уже оплаченный. Startup снимает оплаченный или отменённый заказ из сессии на странице оформления, и OpenCart заводит новый.
> 1. Откройте **«Система» → «Настройки»** (System → Settings) и отредактируйте магазин.
> 2. На вкладке **«Сервер»** (Server) в поле **«Сессионный файл Cookie»** (Session Samesite Cookie) выберите `Lax` и сохраните.
>
> `Lax` достаточно: покупатель возвращается с MONETA.RU обычным переходом по ссылке, и cookie при таком переходе отправляется, а в остальных запросах с чужих сайтов — нет, поэтому защита от подделки запросов (CSRF) сохраняется. Значение `None` не выбирайте: cookie будет уходить при любых запросах с чужих сайтов, а браузеры принимают `SameSite=None` только для сайтов на HTTPS.
---
## 📚 Полезные ресурсы OpenCart
* [OpenCart](https://www.opencart.com/)
* [Документация](https://docs.opencart.com/)
* [Релизы](https://github.com/opencart/opencart/releases)
## 📚 Полезные ресурсы OpenCart "Русская сборка"
* [Русская сборка OpenCart](https://opencart-russia.ru/)
* [Документация и FAQ](https://forum.opencart-russia.ru/forums/wiki/)
* [Форум поддержки](https://forum.opencart-russia.ru/)
---
**✅ Модуль настроен, приятных платежей!** 💰🎉