---
title: "Laravel MPP: монетизація API для AI-агентів через HTTP 402"
url: https://laravelukraine.com/blog/laravel-mpp-monetizaciia-api-dlia-ai-agentiv-cerez-http-402
date: 2026-07-08
source: https://laravel-news.com/laravel-mpp-charge-ai-agents-for-api-access-with-402-payment-required?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+laravelnews
---

# Laravel MPP: монетизація API для AI-агентів через HTTP 402

Laravel MPP - це middleware, що реалізує Machine Payments Protocol (MPP) і дозволяє стягувати плату з AI-агентів за доступ до захищених маршрутів. При запиті без оплати сервер повертає HTTP-відповідь `402 Payment Required` з підписаним викликом. Агент, здатний платити, виконує виклик через підтримуваний платіжний метод і повторює запит.

## Основні можливості

Пакет пропонує низку функцій для гнучкої монетизації API:

- **Два платіжні методи** - Stripe Shared Payment Tokens (SPTs) та Tempo pathUSD
- **Поіменна або лічильникова тарифікація** - оплата за кожен запит або одноразовий платіж з багаторазовим доступом
- **HMAC-підписані виклики** - агенти отримують підписаний виклик `402` для оплати та повторної спроби
- **Лічильникові сесії** - атомарні балансові рахунки з перевіркою області дії, що зберігаються в кеші або базі даних
- **Передумови** - іменовані перевірки, які виконуються перед платіжним шлюзом для раннього відхилення непридатних запитів

## Захист маршруту

Для встановлення платного доступу достатньо додати middleware `mpp` до маршруту із зазначенням ціни та валюти. Запит без оплати отримає відповідь `402` з викликом:

```php
Route::get('/resource', MyPaidResource::class)
    ->middleware('mpp:0.50,USD');
```

Також можна оголосити ціноутворення через атрибут `RequiresPayment` на методі контролера і дозволити middleware його зчитувати. Для автоматичного застосування можна ввімкнути `MPP_ATTRIBUTES_ENABLED=true`:

```php
#[RequiresPayment(amount: '5.00', currency: 'USD', grants: 10)]
public function report()
{
    // ...
}
Route::get('/report', ReportController::class)->middleware('mpp');
```

## Лічильникові сесії

Коли платіж визначає `grants` більше одиниці, один платіж покриває кілька звернень. Успішна відповідь включає заголовок `Payment-Session` із залишковим балансом та областю дії:

```
Payment-Session: id="sess_...", remaining="9", scope="report.basic", expiresAt="..."
```

Агент відтворює ідентифікатор сесії в наступних запитах замість повторної оплати:

```bash
curl -si https://your-host/report \
  -H 'Authorization: Payment method="stripe", session="sess_..."'
```

Сесії зберігаються в кеші за замовчуванням або в базі даних для збереження стану:

```
MPP_SESSION_DRIVER=cache      # За замовчуванням
MPP_SESSION_DRIVER=database   # Постійне зберігання; запустіть опубліковані міграції
MPP_SESSION_CACHE_STORE=redis # Опціональне власне сховище кешу
```

## Передумови

Передумови - це іменовані перевірки, які виконуються перед платіжним шлюзом. Вони дозволяють відхилити непридатний запит до того, як агента буде запропоновано платити. Їх реєструють у `config/mpp.php` і прикріплюють до окремих маршрутів або виконують глобально:

```php
// config/mpp.php
'preconditions' => [
    'checks' => [
        'postexists' => [\App\Mpp\Checks\PostExists::class, 'check'],
    ],
    'global' => ['usernotblocked'],
],
```

Перевірка повертає `null` для успішного проходження або `Response` для переривання запиту:

```php
class PostExists
{
    public function check(Request $request, PaymentSpec $spec): ?Response
    {
        return Post::find($request->route('post'))
            ? null
            : response()->json(['error' => 'No such post.'], 404);
    }
}
```

```php
Route::get('/posts/{post}', ShowPost::class)
    ->middleware('mpp:1.00,USD,preconditions=postexists');
```

## Платіжні методи

Пакет постачається з двома платіжними методами. Stripe використовує Shared Payment Tokens (SPTs) і налаштовується через ключі Stripe та попередню версію API:

```
STRIPE_SECRET_KEY=sk_test_...
STRIPE_NETWORK_ID=profile_...
STRIPE_API_VERSION=2026-05-27.preview
```

Tempo здійснює розрахунки в pathUSD он-чейн. Його можна вибрати для окремого маршруту через параметр `method=tempo`:

```php
Route::get('/paid', fn () => response()->json(['data' => 'paid']))
    ->middleware('mpp:0.01,USD,method=tempo,scope=paid');
```

Можна приймати кілька платіжних методів на одному маршруті через `methods=stripe|acme`, а також зареєструвати власний метод, реалізувавши інтерфейс `Verifier`. При успішному платежі відповідь містить заголовок `Payment-Receipt` з ідентифікацією методу, суми та посилання.

## Встановлення

Встановлення виконується через Composer з подальшою публікацією конфігурації:

```bash
composer require square1/laravel-mpp
php artisan vendor:publish --tag=mpp-config
```

Для використання лічильникових сесій з драйвером бази даних потрібно опублікувати та виконати міграції:

```bash
php artisan vendor:publish --tag=mpp-migrations
php artisan migrate
```

Важливо зауважити, що MPP та Stripe SPT API все ще перебувають у попередньому перегляді і можуть змінюватися. Остання версія v1.1.0 розповсюджується під ліцензією MIT та доступна на [GitHub](https://github.com/square1-io/laravel-mpp).
