Este projeto é uma solução PHP para integrar um sistema de e-commerce com o gateway de pagamento PAGCOMPLETO. Ele automatiza o processamento de pedidos elegíveis, gerencia o status no banco de dados e oferece uma interface web simples para monitoramento e controle.
O principal objetivo deste projeto é demonstrar a capacidade de integrar um sistema de pedidos com um gateway de pagamento externo, o PAGCOMPLETO. A solução foca na automação do processo de verificação e atualização do status de pagamentos de pedidos, garantindo a consistência dos dados e a segurança das operações.
Um cliente acabou de contratar o nosso gateway de pagamento PAGCOMPLETO. A missão será integrar a API para que os pedidos possam ser processados corretamente, seguindo os critérios técnicos definidos.
- Processamento Automático: O sistema pode ser configurado para processar pedidos elegíveis automaticamente (via cron job, por exemplo, embora a funcionalidade de timer não esteja implementada diretamente no código PHP, a arquitetura permite isso).
- Interface Web Simples: Um dashboard intuitivo para monitoramento e controle manual das operações.
- Reset de Banco de Dados: Funcionalidade para restaurar o banco de dados aos seus dados originais, ideal para ambientes de desenvolvimento e teste.
- Validação Rigorosa: Verificação e normalização de dados antes do envio para a API externa.
- Tratamento de Erros: Gestão robusta de falhas e exceções durante a comunicação com a API e operações de banco de dados.
- Modo de Desenvolvimento Seguro: Permite testar toda a lógica de integração sem realizar chamadas reais à API do PAGCOMPLETO, protegendo o ambiente externo.
Este projeto segue uma arquitetura cliente-servidor tradicional, onde o PHP atua como a camada de aplicação, interagindo com um banco de dados PostgreSQL e um servidor web Apache. A comunicação com a API externa é feita via cURL.
- PHP 8.1+: Linguagem de programação backend, com foco no uso de PDO (PHP Data Objects) para interação segura com o banco de dados, prevenindo ataques de SQL Injection.
- PostgreSQL 14+: Sistema de gerenciamento de banco de dados relacional (DBServer), utilizado para armazenar os dados de pedidos, clientes, pagamentos e configurações.
- Apache 2.4+: Servidor web (WebServer) responsável por servir as páginas PHP e gerenciar as requisições HTTP.
- HTML5/CSS3/JavaScript (Bootstrap): Utilizados para a construção da interface de usuário (frontend), garantindo um design responsivo e intuitivo. O Bootstrap é empregado para agilizar o desenvolvimento da UI.
- cURL: Biblioteca utilizada para realizar requisições HTTP de forma programática, sendo a ferramenta escolhida para a comunicação com a API do PAGCOMPLETO.
- PDO com Prepared Statements: Essencial para prevenir SQL Injection, garantindo que os dados inseridos ou consultados no banco de dados sejam tratados de forma segura.
- Validação dos Dados: Implementação de validações para garantir a integridade e o formato correto dos dados antes do processamento.
- Tratativa de Erros: Mecanismos robustos para lidar com exceções e falhas, tanto nas operações de banco de dados quanto na comunicação com a API.
- Logs sem Exposição de Dados Sensíveis: As mensagens de log são projetadas para não expor informações confidenciais, protegendo a privacidade dos dados.
O sistema oferece as seguintes funcionalidades principais:
- Reset do Banco de Dados: Um botão na interface web permite recarregar o banco de dados com os dados originais de teste, facilitando o desenvolvimento e a depuração.
- Dashboard: Uma interface web que lista todos os pedidos do banco de dados, exibindo informações essenciais como ID do pedido, cliente, valor total, forma de pagamento, status e se o pedido é elegível para processamento pelo PAGCOMPLETO.
- Processamento Manual: Um botão na dashboard permite iniciar o processamento de pedidos elegíveis sob demanda, enviando-os para a API do PAGCOMPLETO.
- Sistema de Mensagens: Exibição de mensagens de feedback claras e concisas sobre o status das operações (sucesso, aviso, erro) diretamente na interface.
- Teste de Conexão: Verificação automática da conectividade com o banco de dados na inicialização da dashboard.
Para que um pedido seja considerado elegível para processamento pelo gateway PAGCOMPLETO, ele deve atender aos seguintes critérios:
- Gateway PAGCOMPLETO: Apenas lojas que utilizam o
id_gateway = 1(PAGCOMPLETO). - Cartão de Crédito: Apenas pagamentos realizados via
id_formapagto = 3(Cartão de Crédito). - Aguardando Pagamento: O status do pedido deve ser
id_situacao = 1(Aguardando Pagamento).
Após o processamento pela API, o status do pedido no banco de dados será atualizado conforme o retorno da API (Pagamento Identificado ou Pedido Cancelado).
Este guia detalha os passos para configurar o ambiente necessário e implantar o projeto em um servidor Ubuntu com Apache2 e PostgreSQL.
Certifique-se de ter acesso sudo no seu servidor Ubuntu.
Primeiro, atualize os pacotes do sistema e instale o PostgreSQL, Apache2 e os módulos PHP necessários:
sudo apt update
sudo apt install -y postgresql postgresql-contrib apache2 php libapache2-mod-php php-pgsql php-curl php-jsonCrie o diretório do projeto no Apache e ajuste as permissões:
sudo systemctl start apache2
sudo systemctl enable apache2
sudo mkdir -p /var/www/html/pagcompleto
sudo chown -R $USER:$USER /var/www/html/pagcompletoObservação: $USER deve ser substituído pelo seu usuário no servidor (ex: ubuntu).
Inicie o serviço PostgreSQL e configure o banco de dados e o usuário para o projeto:
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -i -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';"
sudo -i -u postgres psql -c "CREATE DATABASE pagcompleto_db;"
sudo -i -u postgres psql -c "CREATE USER pagcompleto_user WITH ENCRYPTED PASSWORD 'pagcompleto_password';"
sudo -i -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pagcompleto_db TO pagcompleto_user;"
## Conceder permissões adicionais para o usuário do banco de dados
## (Necessário para operações como o reset do banco, que manipulam schemas e tabelas) - Não recomendado!
## A forma como implementei o reset de tabelas requer permissões de superuser. Existem formas mais apropriadas.
sudo -u postgres psql -d pagcompleto_db -c "GRANT USAGE, CREATE ON SCHEMA public TO pagcompleto_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO pagcompleto_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO pagcompleto_user;"-
Copie os arquivos do projeto (config.php, index.php, process.php, reset.php) para o diretório
/var/www/html/pagcompleto/. -
Crie o diretório
sql/dentro de/var/www/html/pagcompleto/e copie todos os arquivos.sqlfornecidos para dentro dele.sudo mkdir -p /var/www/html/pagcompleto/sql # Copie seus arquivos .sql para este diretório # Exemplo: sudo cp /caminho/para/seus/arquivos/*.sql /var/www/html/pagcompleto/sql/
-
Ajuste as permissões dos arquivos PHP:
sudo chown -R www-data:www-data /var/www/html/pagcompleto sudo chmod -R 755 /var/www/html/pagcompleto
Para gerar verbose quanto para o PHP (e demonstrar melhor quaisquer erros com mais detalhes):
Verifique se o php.ini está configurado corretamente para exibir erros durante o desenvolvimento:
sudo nano /etc/php/8.1/apache2/php.ini # ou a versão do seu PHPProcure por:
display_errors = OffE mude para:
display_errors = OnSalve e feche o arquivo, e reinicie o Apache:
sudo systemctl restart apache2O projeto possui uma estrutura de arquivos simples e direta, facilitando a compreensão e manutenção:
pagcompleto/
├── config.php
├── index.php
├── process.php
├── reset.php
└── sql/
├── clientes.sql
├── formas_pagamento.sql
├── gateways.sql
├── lojas_gateway.sql
├── pedido_situacao.sql
├── pedidos.sql
└── pedidos_pagamentos.sql
config.php: Contém as configurações de conexão com o banco de dados, credenciais da API e o modo de desenvolvimento.index.php: A interface web principal (dashboard) que exibe a lista de pedidos e os botões de ação.process.php: Script responsável por buscar pedidos elegíveis, construir o payload da API, enviar a requisição e atualizar o banco de dados.reset.php: Script para resetar o banco de dados, recarregando as tabelas e dados iniciais a partir dos arquivos SQL.sql/: Diretório que contém os scripts SQL para criação das tabelas e inserção dos dados de teste.
Após a instalação e configuração, siga os passos abaixo para interagir com o sistema:
-
Acesse a Dashboard: Abra seu navegador e navegue para
http://seu-servidor-ip-ou-dominio/pagcompleto/. -
Resetar o Banco de Dados: É necessário resetar o Banco antes de processar os dados para de fato observar o funcionamento. Clique no botão "Resetar Banco de Dados" na dashboard. Isso irá:
- Limpar todas as tabelas existentes.
- Recarregar os dados a partir dos arquivos
.sqlna pastasql/. - Você verá uma mensagem de sucesso na tela.
-
Visualizar Pedidos: Após o reset, a dashboard exibirá uma lista de pedidos. Os pedidos elegíveis para processamento (que atendem aos critérios de elegibilidade) serão destacados.
-
Processar Pedidos Elegíveis: Clique no botão "Processar Pedidos Elegíveis" na dashboard. O sistema irá:
- Buscar todos os pedidos que atendem aos critérios de elegibilidade.
- Para cada pedido, simular (em modo de desenvolvimento) ou enviar (em modo de produção) uma requisição para a API do PAGCOMPLETO.
- Atualizar o status do pedido no banco de dados com base na resposta da API.
- Você verá uma mensagem de sucesso ou erro na tela.
-
Modo de Desenvolvimento: Por padrão, o projeto está configurado com
DEVELOPMENT_MODE = truenoconfig.php. Isso significa que as chamadas para a API do PAGCOMPLETO são simuladas, permitindo testar a lógica sem afetar o ambiente real. Para desativar o modo de desenvolvimento e realizar chamadas reais, altereDEVELOPMENT_MODEparafalsenoconfig.php.
- Prevenção de SQL Injection: O uso de PDO (PHP Data Objects) com prepared statements é fundamental para proteger o banco de dados contra ataques de SQL Injection. Isso garante que as consultas SQL sejam construídas de forma segura, separando o código SQL dos dados fornecidos pelo usuário.
- Validação e Sanitização de Entradas: Embora o projeto atual lide principalmente com dados internos do banco, em um cenário real, todas as entradas de usuário (formulários, parâmetros de URL) devem ser rigorosamente validadas e sanitizadas para prevenir ataques como Cross-Site Scripting (XSS) e outros.
- Tratamento de Erros Controlado: Mensagens de erro detalhadas são úteis para depuração, mas não devem ser expostas diretamente ao usuário final em ambiente de produção. O projeto utiliza
error_reporting(E_ALL)eini_set("display_errors", 1)para desenvolvimento, mas isso deve ser desativado em produção (display_errors = Off) para evitar vazamento de informações sensíveis. - Credenciais Seguras: As credenciais de banco de dados e tokens de API são armazenados no
config.php. Para ambientes de produção, é altamente recomendável utilizar variáveis de ambiente ou um sistema de gerenciamento de segredos para armazenar essas informações, evitando que elas fiquem diretamente no código-fonte. - Modo de Desenvolvimento: O
DEVELOPMENT_MODEgarante que nenhuma transação real seja enviada para a API externa durante o desenvolvimento e teste, protegendo o ambiente de produção de dados indesejados ou chamadas acidentais. - Transações de Banco de Dados: As operações de atualização de status de pedidos são encapsuladas em transações de banco de dados. Isso garante a atomicidade das operações: ou todas as alterações são aplicadas com sucesso, ou nenhuma delas é, mantendo a integridade dos dados mesmo em caso de falhas.
Para desenvolvedores que desejam estender ou depurar o projeto, as seguintes dicas são úteis:
- Exibição de Erros: Certifique-se de que
display_errors = Oneerror_reporting = E_ALLestejam configurados no seuphp.ini(e no topo de cada arquivo PHP) durante o desenvolvimento para ver todos os avisos e erros. Lembre-se de desativá-los em produção. - Modo de Desenvolvimento: Mantenha
DEVELOPMENT_MODE = truenoconfig.phppara simular as respostas da API e evitar chamadas reais durante o desenvolvimento. - Logs de Erro: Verifique os logs de erro do Apache (
/var/log/apache2/error.log) e e do módulo PHP para mensagens detalhadas sobre falhas de execução. - Depuração de Banco de Dados: Utilize ferramentas como
psqlou um cliente gráfico (ex: DBeaver) para inspecionar o estado do banco de dados e verificar se as operações estão sendo realizadas corretamente. - Comentários no Código: O código está comentado através para facilitar o entendimento das funcionalidades e decisões.
Desenvolvido em Agosto de 2025 por Henrique Stanke Scandelari como parte de um teste técnico para uma vaga de Programador PHP Júnior.
Godspeed!
6a6139c (Commit Inicial)