Документация / Настройка платежей — и один шаг, который незаметно теряет деньги

Настройка платежей — и один шаг, который незаметно теряет деньги

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

Шаг, который стоит денег, если его пропустить

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

Так что покупка завершается тем, что провайдер вызывает ваш сервер — вебхук — и ничем иным.

Если этот вызов так и не приходит:

  • деньги покупателя доходят до вас,
  • его лицензия так и не выпускается,
  • заказ висит в «pending»,
  • и нигде ничто не говорит, почему.

Это не редкий краевой случай. На индонезийских способах это обычный путь.

Откуда каждый провайдер берёт свой URL

Провайдер URL вебхука Кто задаёт
Xendit https://yourdomain/webhooks/xendit вы, вручную, один раз
PayPal (нет) не нужен — завершается на возврате

PayPal завершается, когда покупатель возвращается, так что ему вообще не нужен вебхук. Xendit — тот, кому нужны вы — см. ниже.

Xendit — тот, кому нужны вы. Его коллбэк «invoice paid» действует на весь аккаунт, а не на отдельный счёт, так что он задаётся один раз в собственном дашборде Xendit.

Xendit, клик за кликом

  1. Войдите на dashboard.xendit.co.
  2. Settings → Developers → Webhooks.
  3. Под Invoices paid вставьте URL, который ваша страница администратора показывает для Xendit (https://yourdomain/webhooks/xendit).
  4. Сохраните и скопируйте токен верификации вебхука, показанный на той же странице.
  5. Поместите этот токен в .env вашего сервера как XENDIT_CALLBACK_TOKEN, рядом с XENDIT_SECRET_KEY.
  6. Перезапустите сайт, чтобы новые значения были прочитаны.

Обе половины обязательны. URL без токена означает, что доставки приходят и отклоняются; токен без URL означает, что вообще ничего не приходит.

Доказательство, что это действительно работает

Не доверяйте «я вставил». Откройте Admin → Settings → Payment webhooks. Он сообщает, что по-настоящему дошло до вашего сервера:

Что он говорит Что это значит Что делать
Never received Ничего никогда не приходило от этого провайдера URL отсутствует или неверен в дашборде провайдера
Not matching Доставки приходят, но не называют ни одного вашего заказа URL указывает на вас из другого аккаунта провайдера, чем использует магазин
Working Хотя бы одна доставка совпала с реальным заказом Ничего — всё подключено

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

Проверьте это от и до, прежде чем принимать настоящие деньги. У дашборда Xendit есть кнопка «test webhook» на той же странице; используйте её, затем перезагрузите карточку администратора. Если она всё ещё говорит Never received, значит, URL неверен — проверьте на опечатку, отсутствующий https:// или конечный слэш.

Сами учётные данные

Есть два способа их задать. Оба держат секрет вне поля зрения — ни один никогда не показывает сохранённое значение.

Со страницы администратора (рекомендуется)

Admin → Settings → Payment gateway credentials. Введите PayPal Client ID + Secret (и переключатель sandbox/live) и Xendit Secret Key + Callback token. Они хранятся зашифрованными на сервере; поля работают только на запись, так что после сохранения они больше никогда не показываются — страница отображает лишь Configured / Not set. Оставьте поле пустым, чтобы не менять его; используйте Remove stored credentials, чтобы очистить одно из них.

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

php artisan store:secrets-key      # writes STORE_SECRETS_KEY to .env — then BACK IT UP off the server
php artisan config:clear

Потеря STORE_SECRETS_KEY делает сохранённые учётные данные нечитаемыми (вам просто придётся ввести их заново).

Или из .env (альтернатива)

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

# Xendit
XENDIT_SECRET_KEY=...
XENDIT_CALLBACK_TOKEN=...     # from Settings → Developers → Webhooks

# PayPal
PAYPAL_CLIENT_ID=...
PAYPAL_SECRET=...
PAYPAL_ENV=sandbox           # or: live

Шлюз без учётных данных просто выключен — больше нечего включать.

Если ваш сервер за прокси или файрволом

Путь вебхука — это публичный, сервер-к-серверу URL. У него нет входа, по необходимости — провайдер не может войти как вы. Вместо этого он защищён собственной подписью или токеном провайдера, авторитетным перечитыванием статуса платежа напрямую у провайдера и ограничением частоты.

Это значит, что POST /webhooks/* должен быть достижим из публичного интернета. Если вы его заблокируете или поместите весь сайт за IP-allow-list, асинхронные платежи перестанут исполняться — с ровно тем же тихим симптомом, что и при так и не настроенном URL.