PHPackages                             payted/payted-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. payted/payted-php

ActiveLibrary[Payment Processing](/categories/payments)

payted/payted-php
=================

Official PHP SDK for Payted Payment Gateway - M-Pesa, Emola &amp; Visa payments in Mozambique

00PHP

Since Feb 2Pushed 3mo agoCompare

[ Source](https://github.com/anselmocossa/payted-php)[ Packagist](https://packagist.org/packages/payted/payted-php)[ RSS](/packages/payted-payted-php/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Payted PHP SDK
==============

[](#payted-php-sdk)

SDK oficial PHP para integração com o gateway de pagamentos Payted - M-Pesa, Emola e Visa em Moçambique.

Instalação
----------

[](#instalação)

```
composer require payted/payted-php
```

Configuração
------------

[](#configuração)

### Uso Directo

[](#uso-directo)

```
use Payted\Payted;

$client = Payted::client('seu-api-token', [
    'base_url' => 'https://pay.ted.co.mz/api', // opcional
    'timeout' => 60, // opcional, em segundos
]);
```

### Laravel

[](#laravel)

O SDK inclui auto-discovery para Laravel. Após instalar, publique a configuração:

```
php artisan vendor:publish --tag=payted-config
```

Configure no seu `.env`:

```
PAYTED_API_TOKEN=seu-api-token
PAYTED_WEBHOOK_SECRET=seu-webhook-secret
PAYTED_APP_ID=1
```

Uso
---

[](#uso)

### Checkout (Redirect)

[](#checkout-redirect)

Para pagamentos onde o cliente é redirecionado para uma página de checkout:

```
use Payted\Payted;

$client = Payted::client('seu-api-token');

$checkout = $client->checkout()->create([
    'app_id' => 1,
    'valor_total' => 500.00,
    'referencia_externa' => 'PEDIDO-123',
    'itens' => [
        [
            'nome' => 'Curso de PHP',
            'quantidade' => 1,
            'preco_unitario' => 500.00,
        ],
    ],
    'return_url' => 'https://meusite.com/sucesso',
    'cancel_url' => 'https://meusite.com/cancelado',
]);

// Redirecionar o cliente
header('Location: ' . $checkout->checkoutUrl);
exit;
```

### Débito Directo (Síncrono)

[](#débito-directo-síncrono)

Para pagamentos sem redirect (ex: POS, subscrições):

```
$debit = $client->debit()->process([
    'app_id' => 1,
    'valor_total' => 100.00,
    'referencia_externa' => 'POS-456',
    'metodo' => 'mpesa', // ou 'emola'
    'numero_cliente' => '841234567',
]);

if ($debit->isPaid()) {
    echo "Pagamento confirmado! ID: " . $debit->transacaoId;
} else {
    echo "Pagamento falhou: " . $debit->erro;
}
```

### Consultar Status

[](#consultar-status)

```
// Por ID do pagamento
$status = $client->debit()->status('TED12345678');

// Por referência externa
$status = $client->debit()->statusByReference('PEDIDO-123');

if ($status->isPaid) {
    echo "Pagamento confirmado!";
} elseif ($status->isPending()) {
    echo "Aguardando confirmação...";
} else {
    echo "Pagamento falhou.";
}
```

### Webhooks

[](#webhooks)

Valide webhooks recebidos do Payted:

```
use Payted\Webhook\WebhookValidator;

$validator = new WebhookValidator('seu-webhook-secret');

try {
    $event = $validator->constructEvent(
        file_get_contents('php://input'),
        $_SERVER['HTTP_X_PAYTED_SIGNATURE']
    );

    if ($event->isPaymentCompleted()) {
        $referenciaExterna = $event->getReferenciaExterna();
        $pagamentoId = $event->getPagamentoId();

        // Processar pagamento confirmado
        // Actualizar pedido no banco de dados
    }

    if ($event->isPaymentFailed()) {
        // Processar falha de pagamento
    }

    http_response_code(200);
    echo json_encode(['received' => true]);

} catch (\Payted\Exceptions\WebhookException $e) {
    http_response_code(400);
    echo json_encode(['error' => $e->getMessage()]);
}
```

Laravel
-------

[](#laravel-1)

### Usando a Facade

[](#usando-a-facade)

```
use Payted\Laravel\PaytedFacade as Payted;

// Checkout
$checkout = Payted::checkout()->create([
    'app_id' => config('payted.app_id'),
    'valor_total' => 500.00,
    'referencia_externa' => 'PEDIDO-123',
]);

return redirect($checkout->checkoutUrl);
```

### Injeção de Dependência

[](#injeção-de-dependência)

```
use Payted\PaytedClient;

class PaymentController extends Controller
{
    public function __construct(
        private PaytedClient $payted
    ) {}

    public function checkout(Request $request)
    {
        $checkout = $this->payted->checkout()->create([
            'app_id' => config('payted.app_id'),
            'valor_total' => $request->total,
            'referencia_externa' => $request->order_id,
        ]);

        return redirect($checkout->checkoutUrl);
    }
}
```

### Webhook Controller

[](#webhook-controller)

```
use Illuminate\Http\Request;
use Payted\Webhook\WebhookValidator;
use Payted\Exceptions\WebhookException;

class WebhookController extends Controller
{
    public function __construct(
        private WebhookValidator $validator
    ) {}

    public function handle(Request $request)
    {
        try {
            $event = $this->validator->constructEvent(
                $request->getContent(),
                $request->header('X-Payted-Signature')
            );

            if ($event->isPaymentCompleted()) {
                // Marcar pedido como pago
                Order::where('reference', $event->getReferenciaExterna())
                    ->update(['status' => 'paid']);
            }

            return response()->json(['received' => true]);

        } catch (WebhookException $e) {
            return response()->json(['error' => $e->getMessage()], 400);
        }
    }
}
```

Transações C2B (com Parceiro)
-----------------------------

[](#transações-c2b-com-parceiro)

Para pagamentos com divisão entre a aplicação e um parceiro:

```
$checkout = $client->checkout()->create([
    'app_id' => 1,
    'valor_total' => 1000.00,
    'referencia_externa' => 'VENDA-789',

    // Dados do parceiro
    'parceiro_nome' => 'Loja do João',
    'parceiro_email' => 'joao@loja.com',
    'parceiro_contacto' => '841234567',
    'parceiro_tipo' => 'comerciante',

    // Divisão de receita
    'percentagem_app' => 10,      // 10% para a plataforma
    'percentagem_parceiro' => 90, // 90% para o parceiro
]);

echo "Tipo: " . $checkout->tipoTransacao; // C2B
echo "Parceiro ID: " . $checkout->parceiroId;
```

Tratamento de Erros
-------------------

[](#tratamento-de-erros)

```
use Payted\Exceptions\AuthenticationException;
use Payted\Exceptions\ValidationException;
use Payted\Exceptions\RateLimitException;
use Payted\Exceptions\ApiException;

try {
    $debit = $client->debit()->process([...]);
} catch (AuthenticationException $e) {
    // Token inválido (401)
    echo "Erro de autenticação: " . $e->getMessage();
} catch (ValidationException $e) {
    // Dados inválidos (422)
    echo "Erros de validação:";
    foreach ($e->getErrors() as $field => $errors) {
        echo "$field: " . implode(', ', $errors);
    }
} catch (RateLimitException $e) {
    // Limite excedido (429)
    echo "Limite excedido. Tente novamente em " . $e->getRetryAfter() . " segundos.";
} catch (ApiException $e) {
    // Erro do servidor
    echo "Erro da API: " . $e->getMessage();
}
```

Métodos de Pagamento
--------------------

[](#métodos-de-pagamento)

MétodoCódigoDescriçãoM-Pesa`mpesa`Pagamento via M-PesaEmola`emola`Pagamento via EmolaVisa`visa`Pagamento via cartão Visa (apenas checkout)Requisitos
----------

[](#requisitos)

- PHP 8.1+
- Guzzle HTTP 7.0+

Suporte
-------

[](#suporte)

- Email:
- Documentação:

Licença
-------

[](#licença)

MIT

###  Health Score

18

—

LowBetter than 8% of packages

Maintenance54

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/42fdcf6b1ab023bad9b074bc4301236ce92838c4d887c5ffc1d9ae06510c7eb8?d=identicon)[anselmocossa](/maintainers/anselmocossa)

---

Top Contributors

[![anselmocossa](https://avatars.githubusercontent.com/u/103646784?v=4)](https://github.com/anselmocossa "anselmocossa (2 commits)")

### Embed Badge

![Health badge](/badges/payted-payted-php/health.svg)

```
[![Health](https://phpackages.com/badges/payted-payted-php/health.svg)](https://phpackages.com/packages/payted-payted-php)
```

###  Alternatives

[omnipay/paypal

PayPal gateway for Omnipay payment processing library

3156.8M53](/packages/omnipay-paypal)[eduardokum/laravel-boleto

Biblioteca com boletos para o laravel

626351.9k2](/packages/eduardokum-laravel-boleto)[tbbc/money-bundle

This is a Symfony bundle that integrates moneyphp/money library (Fowler pattern): https://github.com/moneyphp/money.

1961.9M](/packages/tbbc-money-bundle)[2checkout/2checkout-php

2Checkout PHP Library

83740.3k2](/packages/2checkout-2checkout-php)[smhg/sepa-qr-data

Generate QR code data for SEPA payments

61717.2k5](/packages/smhg-sepa-qr-data)[omnipay/dummy

Dummy driver for the Omnipay payment processing library

271.2M33](/packages/omnipay-dummy)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
