Download the PHP package techsolutions-projects/mobile-wallet-sdk without Composer
On this page you can find all versions of the php package techsolutions-projects/mobile-wallet-sdk. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download techsolutions-projects/mobile-wallet-sdk
More information about techsolutions-projects/mobile-wallet-sdk
Files in techsolutions-projects/mobile-wallet-sdk
Package mobile-wallet-sdk
Short Description A Mozambican mobile wallet (M-Pesa, E-Mola, mKesh) integration SDK for Laravel applications.
License MIT
Homepage https://github.com/techsolutions-projects/mobile-wallet-sdk
Informations about the package mobile-wallet-sdk
Mobile Wallet SDK — Documentação Oficial
Pacote: techsolutions-projects/mobile-wallet-sdk
Namespace: Techsolutions\Sdk\MobileWallets
Compatibilidade: PHP 8.2–8.3 · Laravel 11–13
Licença: MIT — Techsolutions Lda
Índice
- Introdução
- Instalação e Configuração
- Arquitectura
- Conceitos Principais
- Utilização Básica
- API Fluente (Transaction Builder)
- Trait Billable
- Facade
- Enumerações
- Códigos de Resposta
- Sistema de Retry
- Eventos
- Webhooks
- WebSockets / Broadcasting
- Dashboard
- Drivers
- Gateways Externos
- Internacionalização
- Testes
- Análise Estática e Qualidade de Código
- Extensão — Criar um Driver Customizado
- Referência de Configuração
- FAQ
1. Introdução
O Mobile Wallet Gateway é um pacote Laravel que permite integrar múltiplas carteiras móveis moçambicanas através de uma única interface consistente.
O objectivo é simplificar a integração com APIs de pagamento como M-Pesa e E-Mola, garantindo ao mesmo tempo robustez, extensibilidade e qualidade de código.
Porquê este pacote?
Integrar directamente com cada provedor de pagamento móvel em Moçambique apresenta desafios:
- O M-Pesa (Vodacom) utiliza uma API REST com autenticação RSA.
- O E-Mola (Movitel) utiliza um WebService SOAP/WSDL — um protocolo completamente diferente.
- Cada provedor tem os seus próprios códigos de resposta, formatos de payload e fluxos de callback.
- Não existe padronização entre eles.
Este pacote resolve estes problemas ao fornecer:
- Uma interface única para todos os provedores.
- Um sistema de drivers que abstrai as diferenças de protocolo.
- Tipagem forte (
declare(strict_types=1)) em todos os ficheiros. - Enumerações para estados, tipos de transacção e códigos de resposta.
- Retry inteligente que distingue erros transitórios de erros terminais.
- Internacionalização completa (PT pré-reforma e EN).
Princípios de design
- Fortemente tipado — Todos os ficheiros utilizam
declare(strict_types=1). Parâmetros, retornos e propriedades são tipados. - Laravel-native — Service Container, Service Provider, Facades, Jobs, Events, Broadcasting, Queues, Eloquent.
- SOLID — Cada classe tem uma única responsabilidade. Os drivers são substituíveis. O sistema é extensível sem modificação.
- Execução lazy — Nenhuma operação é executada até se invocar
begin(),c2b(),b2c(), etc.
2. Instalação e Configuração
Requisitos
- PHP 8.1 ou superior
- Laravel 10, 11, 12 ou 13
- Extensão PHP
ext-openssl(para M-Pesa) - Extensão PHP
ext-soap(para E-Mola)
Instalar via Composer
Publicar ficheiros
Publicar tudo de uma vez:
Ou separadamente:
Executar as migrations
Isto cria duas tabelas:
| Tabela | Descrição |
|---|---|
mws_wallets |
Carteiras registadas (M-Pesa, E-Mola) |
mws_transactions |
Transacções com estado, tentativas, resposta do gateway |
Registar as carteiras
Antes de processar transacções, é necessário inserir as carteiras na base de dados:
Nota: Recomenda-se criar um seeder (
MwgWalletSeeder) para automatizar este processo.
Configuração do ambiente (.env)
3. Arquitectura
O pacote segue uma arquitectura baseada em drivers, inspirada no padrão Manager do Laravel (à semelhança do DatabaseManager, MailManager, FilesystemManager).
Diagrama de camadas
Estrutura do pacote
Fluxo de uma transacção
- O programador invoca
Transaction::onWallet($wallet)->c2b(...). - O
TransactionBuilderacumula configurações (callbacks, canal WebSocket, metadata). - Ao invocar
c2b()/b2c()/begin(), o builder cria um registoTransactionna base de dados com estadoPENDING. - O builder despacha um
ProcessTransactionJob(síncrono ou via fila). - O job resolve o driver correcto via
GatewayManager. - O driver chama a API do provedor (HTTP para M-Pesa, SOAP para E-Mola).
- Com base na resposta:
- Sucesso → marca como
SUCCEEDED, disparaTransactionSucceeded, executa callback. - Falha retentável → agenda retry com backoff exponencial, dispara
TransactionRetried. - Falha terminal → marca como
FAILED, disparaTransactionFailed, executa callback.
- Sucesso → marca como
4. Conceitos Principais
Wallet
Representa um provedor de pagamento registado na base de dados. Cada carteira tem um name que corresponde a um driver.
Campos:
| Campo | Tipo | Descrição |
|---|---|---|
name |
string |
Chave do driver: m-pesa, e-mola |
display_name |
string\|null |
Nome para exibição: "M-Pesa" |
service_provider_code |
string\|null |
Código do provedor (M-Pesa) |
is_active |
bool |
Se a carteira está activa |
metadata |
array\|null |
Dados extra em JSON |
Transaction
Representa uma transacção de pagamento com o seu estado completo.
Campos principais:
| Campo | Tipo | Descrição |
|---|---|---|
uuid |
string |
Identificador único UUID v4 |
mws_wallet_id |
int |
FK para a carteira |
billable_type / billable_id |
string\|int |
Relação polimórfica (o que está a ser pago) |
msisdn |
string |
Número de telefone do cliente |
amount |
float |
Valor da transacção |
transaction_type |
TransactionType |
Tipo: c2b, b2c, b2b, c2c |
status |
TransactionStatus |
Estado actual |
status_code |
string\|null |
Código de resposta do gateway (INS-0, EMOLA-07, EMOLA-GW-1000, etc.) |
max_attempts |
int |
Número máximo de tentativas |
current_attempt |
int |
Tentativa actual |
gateway_transaction_id |
string\|null |
ID da transacção no provedor |
gateway_raw_response |
array\|null |
Resposta bruta do provedor |
streaming_channel |
string\|null |
Canal WebSocket (se configurado) |
metadata |
array\|null |
Dados arbitrários |
GatewayResponse
DTO (Data Transfer Object) imutável que encapsula a resposta de um gateway.
5. Utilização Básica
Transacção C2B (Cliente para Empresa)
O caso mais comum — cobrar um pagamento ao cliente:
Transacção B2C (Empresa para Cliente)
Desembolsar fundos para um cliente:
Formatos de valor aceites
O AmountParser aceita múltiplos formatos:
6. API Fluente (Transaction Builder)
O TransactionBuilder é o coração da API fluente. Todos os métodos de configuração são opcionais e encadeáveis. A transacção só é criada quando se invoca um método terminal (begin(), c2b(), b2c(), etc.).
Exemplo completo
Métodos de configuração
| Método | Descrição | Obrigatório |
|---|---|---|
forBillable(Billable $model) |
Associa um modelo pagável (Invoice, Order) | Não |
toSocket(string $channel) |
Activa broadcasting num canal WebSocket | Não |
onSuccess(Closure $fn) |
Callback para sucesso | Não |
onFail(Closure $fn) |
Callback para falha final | Não |
shouldRetry(Closure $fn) |
Override da lógica de retry | Não |
withMetadata(array $data) |
Anexa dados arbitrários | Não |
Métodos terminais (executam a transacção)
| Método | Tipo | Descrição |
|---|---|---|
c2b(msisdn, amount, attempts) |
Customer → Business | Cobrança ao cliente |
b2c(msisdn, amount, attempts) |
Business → Customer | Desembolso |
b2b(msisdn, amount, attempts) |
Business → Business | Transferência entre empresas |
c2c(msisdn, amount, attempts) |
Customer → Customer | Transferência entre clientes |
customerToBusiness(...) |
Alias de c2b() |
— |
businessToCustomer(...) |
Alias de b2c() |
— |
businessToBusiness(...) |
Alias de b2b() |
— |
customerToCustomer(...) |
Alias de c2c() |
— |
begin(msisdn, amount, attempts, type) |
Genérico | Especificar o tipo como parâmetro |
7. Trait Billable
O trait MwgBillable permite que qualquer modelo Eloquent se torne "pagável" — criando uma ligação directa entre o que está a ser pago e a transacção.
Implementar no modelo
O modelo deve implementar a interface Billable e usar o trait MwgBillable:
Interface Billable
| Método | Retorno | Descrição |
|---|---|---|
getMwgAmount() |
float |
Valor a cobrar |
getMwgDescription() |
string |
Descrição legível |
getMwgReference() |
string |
Referência única |
getMwgMsisdn() |
?string |
Número do cliente (pode ser null) |
Métodos disponibilizados pelo trait
Pagamento directo
Builder fluente com billable
Consultas
Como funciona a ligação polimórfica
Quando se utiliza o trait, as colunas billable_type e billable_id na tabela mws_transactions são preenchidas automaticamente:
Isto permite:
8. Facade
A facade MobileWallet fornece um ponto de acesso estático ao GatewayManager:
A facade está registada como alias MWS no composer.json:
9. Enumerações
Todos os valores discretos do pacote são representados por enumerações PHP 8.1, garantindo segurança de tipo em tempo de compilação.
TransactionStatus
Estados possíveis de uma transacção:
TransactionType
Tipos de transacção suportados:
WalletDriver
Drivers disponíveis com resolução de aliases:
GatewayResponseCode
Detalhado na secção seguinte.
10. Códigos de Resposta
O enum GatewayResponseCode unifica os códigos de resposta de todos os provedores num único enum. Cada caso é prefixado com M_PESA_* ou E_MOLA_*.
Códigos M-Pesa
| Caso do Enum | Valor | Descrição | Retentável? |
|---|---|---|---|
M_PESA_SUCCESS |
INS-0 |
Sucesso | — |
M_PESA_INTERNAL_ERROR |
INS-1 |
Erro interno | ✅ |
M_PESA_INVALID_API_KEY |
INS-2 |
Chave API inválida | ❌ |
M_PESA_INSUFFICIENT_BALANCE |
INS-5 |
Saldo insuficiente | ❌ |
M_PESA_TRANSACTION_CANCELLED |
INS-6 |
Cancelada pelo cliente | ❌ |
M_PESA_TRANSACTION_FAILED |
INS-9 |
Falha no processamento | ✅ |
M_PESA_UNRESOLVED_ACCOUNT |
INS-10 |
MSISDN não registado | ❌ |
M_PESA_INVALID_SHORTCODE |
INS-12 |
Shortcode inválido | ❌ |
M_PESA_INVALID_REFERENCE |
INS-13 |
Referência inválida | ❌ |
M_PESA_INVALID_AMOUNT |
INS-14 |
Valor inválido | ❌ |
M_PESA_DUPLICATE_TRANSACTION |
INS-15 |
Transacção duplicada | ❌ |
M_PESA_INVALID_MSISDN |
INS-16 |
Número inválido | ❌ |
M_PESA_TRANSACTION_TIMEOUT |
INS-22 |
Timeout | ✅ |
M_PESA_LIMIT_EXCEEDED |
INS-23 |
Limite excedido | ❌ |
M_PESA_CUSTOMER_NOT_ACTIVE |
INS-26 |
Conta não activa | ❌ |
M_PESA_THROTTLE_LIMIT |
INS-998 |
Rate limit | ✅ |
M_PESA_SERVER_ERROR |
INS-999 |
Erro do servidor | ✅ |
Códigos E-Mola
Conforme a MOVITEL USSD PUSH API SPECIFICATION v1.5, a E-Mola devolve dois níveis de código de resposta: o nível transacção (<errorCode>, prefixo EMOLA-) e o nível gateway BCCS (<error>, prefixo EMOLA-GW-). Abaixo um subconjunto dos mais relevantes — a tabela completa está em src/Enums/GatewayResponseCode.php.
Nível transacção:
| Caso do Enum | Valor | Descrição | Retentável? |
|---|---|---|---|
E_MOLA_SUCCESS |
EMOLA-0 |
Sucesso | — |
E_MOLA_TRANSACTION_FAILED |
EMOLA-03 |
Transacção falhou | ✅ |
E_MOLA_INVALID_PARTNER |
EMOLA-05 |
Código de parceiro inválido | ❌ |
E_MOLA_INVALID_AMOUNT |
EMOLA-06 |
Valor inválido | ❌ |
E_MOLA_INVALID_MSISDN |
EMOLA-07 |
MSISDN inválido | ❌ |
E_MOLA_PIN_NOT_ENTERED |
EMOLA-11 |
Cliente não introduziu PIN (timeout USSD) | ✅ |
E_MOLA_NO_EMOLA_ACCOUNT |
EMOLA-12 |
Cliente sem conta E-Mola | ❌ |
E_MOLA_DUPLICATE_TRANSID |
EMOLA-14 |
transId já existente |
❌ |
E_MOLA_ISDN_IN_OTHER_PROCESS |
EMOLA-20 |
Número noutro processo | ✅ |
E_MOLA_ALREADY_PROCESSED |
EMOLA-28 |
Transacção já processada | ❌ |
E_MOLA_PROCESSING_ERROR |
EMOLA-99 |
Erro genérico | ✅ |
Nível gateway (BCCS):
| Caso do Enum | Valor | Descrição | Retentável? |
|---|---|---|---|
E_MOLA_GW_USERNAME_INVALID |
EMOLA-GW-1000 |
Username inválido | ❌ |
E_MOLA_GW_TIMEOUT |
EMOLA-GW-2007 |
Timeout ao chamar a API | ✅ |
E_MOLA_GW_SYSTEM_OVERLOADED |
EMOLA-GW-6000 |
Sistema sobrecarregado | ✅ |
E_MOLA_GW_LOGIN_FAILED |
EMOLA-GW-6003 |
Falha de autenticação (credenciais/IP) | ❌ |
E_MOLA_GW_IP_INCORRECT |
EMOLA-GW-8000 |
IP do cliente incorrecto | ❌ |
Transporte (gerados pelo driver):
| Caso do Enum | Valor | Descrição | Retentável? |
|---|---|---|---|
E_MOLA_SOAP_FAULT |
EMOLA-SOAP |
Erro SOAP | ✅ |
E_MOLA_CONNECTION_ERROR |
EMOLA-CONN |
Erro de ligação | ✅ |
Utilização
11. Sistema de Retry
O pacote inclui retry automático com backoff exponencial e decisão inteligente baseada nos códigos de resposta.
Configuração
Comportamento padrão
- Se a resposta é um sucesso → para. Marca como
SUCCEEDED. - Se a resposta é uma falha terminal (ex.:
INS-5saldo insuficiente) → para imediatamente. Marca comoFAILED. Não há razão para re-tentar. - Se a resposta é uma falha retentável (ex.:
INS-22timeout) ecurrent_attempt < max_attempts→ agenda nova tentativa com backoff exponencial. - Se as tentativas se esgotam → marca como
FAILED.
Override via shouldRetry()
12. Eventos
O pacote dispara eventos Laravel em cada ponto do ciclo de vida da transacção:
| Evento | Quando é disparado | Propriedades |
|---|---|---|
TransactionStarted |
Na primeira tentativa | $transaction |
TransactionSucceeded |
Quando a transacção é bem-sucedida | $transaction, $response |
TransactionFailed |
Quando a transacção falha definitivamente | $transaction, $response |
TransactionRetried |
Quando uma nova tentativa é agendada | $transaction, $lastResponse, $attemptNumber |
Registar listeners
Exemplo de listener
13. Webhooks
Os provedores de pagamento enviam notificações assíncronas (callbacks) quando o estado de uma transacção muda. O pacote fornece um endpoint pronto a usar.
Endpoints
| URL | Provedor |
|---|---|
POST /mws/webhook/m-pesa |
M-Pesa (Vodacom) |
POST /mws/webhook/e-mola |
E-Mola (Movitel) |
O prefixo pode ser alterado em config/mobile-wallet.php:
Segurança
Quando MWS_WEBHOOK_SECRET está definido, o middleware VerifyWebhookSignature valida:
- A presença dos cabeçalhos
X-MWS-SignatureeX-MWS-Timestamp. - A tolerância temporal (por defeito 5 minutos).
- A assinatura HMAC-SHA256 do payload.
Configurar no provedor
Ao configurar webhooks no portal M-Pesa ou no acordo E-Mola, forneça:
14. WebSockets / Broadcasting
O pacote suporta notificações em tempo real via Laravel Broadcasting (Echo + Pusher/Soketi/Ably).
Activar
Utilizar
Ouvir no frontend (Laravel Echo)
Payload do broadcast
15. Dashboard
O pacote inclui endpoints JSON para um painel de controlo simples.
Activar
Endpoints
| Método | URL | Descrição |
|---|---|---|
GET |
/mws/dashboard |
Resumo: carteiras, estatísticas, transacções recentes |
GET |
/mws/dashboard/transaction/{uuid} |
Detalhe de uma transacção |
O middleware por defeito é ['web', 'auth'] — configurável em config/mobile-wallet.php.
16. Drivers
M-Pesa (Vodacom Moçambique)
| Propriedade | Valor |
|---|---|
| Protocolo | REST/JSON |
| Autenticação | Bearer token gerado por encriptação RSA |
| Tipos suportados | C2B, B2C, B2B, C2C |
| Portal de developers | developer.mpesa.vm.co.mz |
Endpoints utilizados:
| Tipo | URL |
|---|---|
| C2B | /ipg/v1x/c2bPayment/singleStage/ |
| B2C | /ipg/v1x/b2cPayment/ |
| B2B | /ipg/v1x/b2bPayment/ |
| C2C | /ipg/v1x/c2cPayment/ |
| Query | /ipg/v1x/queryTransactionStatus/ |
E-Mola (Movitel Moçambique)
| Propriedade | Valor |
|---|---|
| Protocolo | SOAP — Viettel BCCS Gateway |
| Endpoint | https://<ip>:<porto>/BCCSGateway/BCCSGateway?wsdl |
| Autenticação | username/password dentro do <Input> + params key e partnerCode (NÃO em SoapHeader) |
| Tipos suportados | C2B, B2C (depende do acordo) |
| Especificação | MOVITEL USSD PUSH API SPECIFICATION v1.5 |
| Documentação | Não pública — obtida via acordo de parceria com a Movitel |
Operações SOAP — uma única operação gwOperation cujo wscode determina a acção:
wscode |
Tipo |
|---|---|
pushUssdMessage |
C2B (cobrança ao cliente) |
pushUssdDisbursementB2C |
B2C (desembolso) |
pushUssdQueryTrans |
Consulta de estado |
queryAccountBalance |
Saldo do parceiro |
queryBeneficiaryName |
Nome do beneficiário |
A resposta tem dois níveis: a tag <error> no <Result> reflecte o estado do gateway BCCS (→ EMOLA-GW-*) e o <errorCode> real da transacção fica dentro do CDATA <original> (→ EMOLA-*). O driver faz o parsing dos dois automaticamente.
Métodos adicionais expostos por EMolaGateway:
Nota importante: A E-Mola não disponibiliza uma API pública para developers. As credenciais (WSDL URL, username, password, key, partner code) são obtidas exclusivamente através de acordo comercial directo com a Movitel. A extensão PHP
ext-soapé necessária para usar este driver directamente.
Sandbox
Driver de simulação para desenvolvimento e testes. Não faz chamadas HTTP/SOAP reais.
17. Gateways Externos
O pacote suporta integração com plataformas intermediárias que já implementaram a comunicação directa com os provedores. Em vez de cada developer obter credenciais directas da Vodacom ou fazer acordo de parceria com a Movitel, pode utilizar um intermediário que abstrai tudo numa API REST simples.
Conceito
O código da tua aplicação não muda — a mesma API fluente funciona independentemente de estar a usar a API directa ou um intermediário. A diferença está apenas na configuração.
Presets disponíveis
| Preset | Plataforma | Descrição |
|---|---|---|
eacacia |
EACACIA / Vitae ERP | Gateway REST unificado para M-Pesa, E-Mola e M-Kesh |
e2payments |
e2Payments / Explicador | Gateway REST com OAuth2 para E-Mola |
custom |
Qualquer | Configuração manual completa de endpoints e mapeamento |
Activar para uma wallet
Para usar a EACACIA em vez da API directa do M-Pesa, basta alterar a configuração:
O código da aplicação continua exactamente igual:
Configuração por preset
EACACIA (Vitae ERP)
O preset eacacia já sabe:
- Que o endpoint C2B para M-Pesa é
/api/eacacia/mpesa/c2b - Que o endpoint C2B para E-Mola é
/api/eacacia/emola/c2b - Que o campo
msisdndeve ser enviado comophone_number - Que o sucesso é
response_code === 'success' - Que o ID da transacção está em
details.reference
e2Payments (Explicador)
Gateway Customizado
Para qualquer API REST que não tenha um preset:
Códigos de resposta de gateways externos
| Código | Constante | Retentável? |
|---|---|---|
EXTERNAL-SUCCESS |
EXTERNAL_SUCCESS |
— |
EXTERNAL-FAIL |
EXTERNAL_FAIL |
❌ |
EXTERNAL-TIMEOUT |
EXTERNAL_TIMEOUT |
✅ |
EXTERNAL-AUTH |
EXTERNAL_AUTH_ERROR |
❌ |
EXTERNAL-PAYLOAD |
EXTERNAL_INVALID_PAYLOAD |
❌ |
EXTERNAL-CONN |
EXTERNAL_CONNECTION_ERROR |
✅ |
Misto: wallet directa + wallet externa
Pode-se ter uma wallet com driver directo e outra com externo no mesmo projecto:
18. Internacionalização
O pacote inclui ficheiros de tradução em Português Europeu (pré-reforma) e Inglês.
Ficheiros de língua
| Ficheiro | Conteúdo |
|---|---|
messages.php |
Mensagens do sistema (transacção iniciada, falhou, etc.) |
statuses.php |
Rótulos dos estados de transacção |
types.php |
Rótulos dos tipos de transacção |
response_codes.php |
Descrições dos códigos de resposta |
errors.php |
Mensagens de erro |
Utilização automática
Os enums utilizam o sistema de tradução automaticamente:
Publicar para customização
Os ficheiros são copiados para lang/vendor/mobile-wallet/.
19. Testes
O pacote inclui testes unitários e de integração utilizando o Orchestra Testbench.
Executar
Cobertura
| Suite | Ficheiro | Cobertura |
|---|---|---|
| Unit | CoreTest.php |
AmountParser, GatewayResponseCode, SandboxGateway, TransactionBuilder, Wallet scopes |
| Feature | FlowTest.php |
Fluxo completo de transacção, retry, callbacks, facade, webhooks, trait Billable |
Testar nos teus projectos
O SandboxGateway é activado automaticamente quando MWS_SANDBOX=true. Nos teus testes:
20. Análise Estática e Qualidade de Código
O pacote inclui configuração para Larastan (PHPStan para Laravel) e Rector.
Larastan (PHPStan nível 8)
Configuração em phpstan.neon — nível 8 (o mais rigoroso).
Rector
Configuração em rector.php — inclui sets de qualidade de código, tipos, early return e dead code.
21. Extensão — Criar um Driver Customizado
Para adicionar suporte a um novo provedor (ex.: mKesh, se a API for disponibilizada no futuro):
1. Criar o driver
2. Registar no GatewayManager
3. Adicionar configuração
4. Registar a wallet na base de dados
22. Referência de Configuração
Todas as opções disponíveis em config/mobile-wallet.php:
| Chave | Tipo | Default | Descrição |
|---|---|---|---|
default |
string |
'm-pesa' |
Carteira padrão |
sandbox |
bool |
true |
Modo sandbox (todas as transacções são simuladas) |
wallets.m-pesa.base_url |
string |
sandbox URL | URL base da API M-Pesa |
wallets.m-pesa.api_key |
string |
'' |
Chave API M-Pesa |
wallets.m-pesa.public_key |
string |
'' |
Chave pública RSA M-Pesa |
wallets.m-pesa.service_provider_code |
string |
'' |
Código do provedor M-Pesa |
wallets.m-pesa.origin |
string |
'*' |
Cabeçalho Origin |
wallets.m-pesa.timeout |
int |
30 |
Timeout HTTP em segundos |
wallets.e-mola.wsdl_url |
string |
'' |
URL do WSDL E-Mola |
wallets.e-mola.username |
string |
'' |
Username SOAP E-Mola |
wallets.e-mola.password |
string |
'' |
Password SOAP E-Mola |
wallets.e-mola.api_key |
string |
'' |
Chave API E-Mola |
wallets.e-mola.partner_code |
string |
'' |
Código de parceiro E-Mola |
wallets.e-mola.language |
string |
'pt' |
Língua das respostas (pt|en) |
wallets.e-mola.ssl_verify_off |
bool |
false |
Desactivar verificação SSL |
retry.max_attempts |
int |
3 |
Tentativas máximas |
retry.backoff_base |
int |
2 |
Base do backoff (segundos) |
retry.backoff_multiplier |
int |
2 |
Multiplicador exponencial |
queue.enabled |
bool |
true |
Processar via fila |
queue.connection |
string\|null |
null |
Ligação da fila |
queue.queue |
string |
'mws' |
Nome da fila |
webhook.prefix |
string |
'mws/webhook' |
Prefixo das rotas de webhook |
webhook.signing_secret |
string |
'' |
Segredo HMAC (vazio = sem verificação) |
webhook.tolerance |
int |
300 |
Tolerância temporal em segundos |
broadcasting.enabled |
bool |
false |
Activar broadcasting WebSocket |
logging.enabled |
bool |
true |
Activar logging |
logging.channel |
string |
'mobile-wallet' |
Canal de log |
dashboard.enabled |
bool |
false |
Activar endpoints do dashboard |
dashboard.prefix |
string |
'mws/dashboard' |
Prefixo das rotas do dashboard |
dashboard.middleware |
array |
['web', 'auth'] |
Middleware do dashboard |
23. FAQ
P: Posso usar sem filas (synchronous)?
Sim. Defina MWS_QUEUE_ENABLED=false no .env. O ProcessTransactionJob será executado sincronicamente via dispatch_sync().
P: Os callbacks onSuccess/onFail funcionam com filas?
Sim. Os closures são serializados usando Illuminate\Queue\SerializableClosure. No entanto, tome cuidado para não capturar objectos complexos ou não serializáveis na closure.
P: A E-Mola suporta B2B e C2C?
Não. A API SOAP da E-Mola suporta oficialmente apenas C2B. O suporte a B2C (desembolso) depende do acordo de parceria com a Movitel. B2B e C2C não são suportados — tentar utilizá-los lançará um GatewayException.
P: Como mudo para produção?
- Defina
MWS_SANDBOX=falseno.env. - Altere
MWS_MPESA_BASE_URLpara a URL de produção:https://api.vm.co.mz. - Use credenciais de produção para M-Pesa e E-Mola.
- Configure
MWS_WEBHOOK_SECRETcom uma chave forte.
P: O pacote cria alguma rota automaticamente?
Sim:
POST /mws/webhook/{wallet}— sempre registada (protegida por middleware).GET /mws/dashboardeGET /mws/dashboard/transaction/{uuid}— apenas quandoMWS_DASHBOARD_ENABLED=true.
P: Posso adicionar novos provedores no futuro?
Sim. Consulte a secção 20. Extensão. O sistema de drivers permite adicionar novos provedores sem alterar o código do pacote.
P: Como funciona o retry inteligente?
O ProcessTransactionJob consulta o GatewayResponseCode enum para determinar se o erro é retentável ou terminal. Erros como "saldo insuficiente" (INS-5) ou "cancelado pelo cliente" (INS-6) são terminais — o pacote para imediatamente em vez de desperdiçar tentativas. Erros como "timeout" (INS-22) ou "erro do servidor" (INS-999) são retentáveis.
P: Como sei qual versão do PHP/Laravel é suportada?
| PHP | Laravel |
|---|---|
| 8.1 | 10, 11 |
| 8.2 | 10, 11, 12 |
| 8.3 | 10, 11, 12, 13 |
Documentação mantida por Techsolutions Lda.
All versions of mobile-wallet-sdk with dependencies
illuminate/support Version ^10.0|^11.0|^12.0
illuminate/database Version ^10.0|^11.0|^12.0
illuminate/queue Version ^10.0|^11.0|^12.0
illuminate/events Version ^10.0|^11.0|^12.0
illuminate/http Version ^10.0|^11.0|^12.0
guzzlehttp/guzzle Version ^7.0