Documente Academic
Documente Profesional
Documente Cultură
Todos os direitos reservados. Nenhuma parte deste Material poderá ser reproduzida, mesmo
parcial, sob qualquer meio, seja este físico ou digital, sem a permissão por escrito do autor.
Autor/Editor
Wanderlei Santana
Capa
Wanderlei Santana
Diagramação
Wanderlei Santana
Contato
sans.pds@gmail.com
Data
05/05/2017 23:16
Revisão
20170506130100
Este Livro registra em suas páginas nomes comerciais e marcas registradas de produtos
pertencentes a diversas companhias. O autor apenas utiliza-se destas marcas para fins
editoriais e em benefício das empresas proprietárias da marca, sem qualquer intenção de
infringir seus direitos.
http://sooho.com.br
2
Sistema de Vendas usando Pagseguro
Wanderlei Santana
2017
3
Sistema de Vendas usando Pagseguro
TABELA DE CONTEÚDOS
Sumário
PHP & PAGSEGURO ............................................................................................................................ 3
Vendas usando Pagseguro: Exemplo de sistema em PHP ................................................................ 3
TABELA DE CONTEÚDOS .................................................................................................................... 4
INTRODUÇÃO ............................................................................................................................. 6
Objetivo deste tutorial ...................................................................................................... 6
Resultado Final e Código Fonte ........................................................................................ 7
O que será abordado? ..................................................................................................... 10
O que não será abordado? ............................................................................................. 10
COMO FUNCIONA UM SISTEMA DE VENDAS ......................................................................... 11
Fluxograma de Vendas ao Cliente................................................................................... 11
PLANEJAMENTO E PROCESSOS INICIAIS ................................................................................. 13
O Cliente será capaz de... ................................................................................................ 13
Criando a Estrutura de Pastas ......................................................................................... 14
Criando a Classe Carrinho de Compras .......................................................................... 15
Criando uma Classe para gerenciar Sessões do usuário ............................................... 28
O Banco de Dados ........................................................................................................... 33
Banco de Dados: Tabelas Produtos ................................................................................ 38
Banco de Dados: Tabela Usuários ................................................................................... 40
Banco de Dados: Tabela Vendas ..................................................................................... 41
Banco de Dados: Tabela Itens de Vendas ....................................................................... 41
CRIANDO A PÁGINA DE PRODUTOS ........................................................................................ 41
Fluxograma interno da Página Produtos ........................................................................ 42
Obtendo os Produtos ...................................................................................................... 44
CRIANDO A PÁGINA CARRINHO DE COMPRAS ....................................................................... 49
Fluxograma interno Carrinho de Compras ..................................................................... 50
Atualizando o Carrinho.................................................................................................... 51
A PÁGINA DE CADASTRO DE USUÁRIOS ................................................................................. 55
CRIANDO A PÁGINA FINALIZAR COMPRA ............................................................................... 55
PROCESSOS FINAIS DA VENDA E INTEGRAÇÃO COM O PAGSEGURO DA UOL ..................... 58
Identificando o Cliente .................................................................................................... 58
Gravando informações da Venda no banco de Dados................................................... 60
Gravando informações dos Itens da Venda no banco ................................................... 62
Iniciando transação com Pagseguro: Gerando Arquivo XML ........................................ 62
Rotinas de Auditoria ........................................................................................................ 66
4
Sistema de Vendas usando Pagseguro
5
Sistema de Vendas usando Pagseguro
INTRODUÇÃO
Este é um artigo ensinando como criar um sistema de vendas simples – em código PHP puro.
Ele foi elaborado apenas com intuito de demonstrar como funciona a integração de um sistema
de Vendas com a API do Pagseguro. Informando ao Pagseguro sobre uma venda realizada e
processando as notificações que informam sobre o status dessa venda.
Esse simples sistema permite que um Cliente visualize Produtos em uma página Web, adicione
produtos a um carrinho de compras, acesse a lista dos produtos escolhidos e conclua a compra
sendo direcionado no final para o PAGSEGURO a fim de realizar o pagamento da Compra.
Uma vez que o foco principal é apenas a integração com a API do Pagseguro, tópicos como
“Gerenciamento de Usuário”, “Gerenciamento de Produtos”, “Criação de Dashboard” ou “área
do Cliente” não serão abordados para não tornar o tutorial demasiado extenso.
Decidi criar um pequeno sistema de vendas para acompanhar esse artigo sobre a integração
com o Pagseguro, justo para dar um norte a quem está começando ou precisa de dicas e
informações sobre o funcionamento de um sistema de vendas.
O código foi construído com programação estruturada em vários pontos e não segue as
melhores práticas de desenvolvimento, isso se faz necessário para tornar-se fácil de entender
para pessoas com diferentes níveis de conhecimento técnico em PHP. Também pensando nisso,
são apresentados inúmeros fluxogramas para maximizar a compreensão da lógica empregada
num sistema de vendas.
Importante:
Se o seu intuito é apenas aprender como gerar o arquivo de XML e remeter ao sistema do
Pagseguro, podes então pular para o item “Processos Finais da Venda e Integração com o
6
Sistema de Vendas usando Pagseguro
Pagseguro da UOL”, porém, acompanhando este material por completo você encontrar
informações que podem ser úteis ao seu sistema e que podem agregar valioso conhecimento
ao seu desenvolvimento profissional.
7
Sistema de Vendas usando Pagseguro
Carrinho de Compras
Confirmação de Compra
8
Sistema de Vendas usando Pagseguro
O download do Código fonte não se encontra disponível no momento, mas será disponibilizado
quanto antes.
9
Sistema de Vendas usando Pagseguro
Front-End:
Criação de uma Página de Produtos;
Criação de uma Página para visualização de Carrinho de Compras;
Criação de uma Página para a Verificação de Itens da Compra;
Criação de uma Página de Confirmação de Venda;
Criação de um script para comunicação com o Pagseguro;
Criação de uma Página para Apresentação de Erros;
Criação de um Template para Envio de E-mail de Confirmação de Compra;
Back-End:
Criação de uma Classe PHP para gerenciamento de Sessões;
Criação de uma Classe PHP para gerenciamento de Carrinho de Compras;
Criação de uma Classe PHP para uso de um Banco de Dados Hipotético em JSON
Registro de Logs para Auditoria
Processos para adição de Produtos a um Carrinho de Compras;
Processos para gerenciar Carrinho de Compras;
Processos para realizar a integração com a API do Pagseguro;
Processos para receber notificações do Pagseguro;
Processos para envio de E-mail de confirmação de Compra realizada;
Gerenciamento de Clientes: Será escrito sobre, porém não serão desenvolvidos scripts para o
gerenciamento de clientes. Esse é um processo a parte que demanda tempo, que requer
cuidados e que pode se estender a muitas possibilidades fugindo totalmente do escopo desse
tutorial.
10
Sistema de Vendas usando Pagseguro
No sistema que vamos desenvolver, usaremos informações de um usuário que estão gravadas
em uma tabela feita em JSON – para simular um Cliente Cadastrado em um banco de dados.
11
Sistema de Vendas usando Pagseguro
12
Sistema de Vendas usando Pagseguro
13
Sistema de Vendas usando Pagseguro
A lista acima serve para mostrar que as possibilidades para um cliente em um sistema de
vendas são inúmeras. E a implantação prática apenas das que citei tornaria esse tutorial um
livro de 300 páginas. Note ainda que essas são apenas as funcionalidades do Cliente. Existem
inúmeras outras funcionalidades ligadas ao Sistema. Você deve lembrar sempre que, toda
entidade que “interage” com qualquer sistema que você estiver desenvolvendo e forneça a
Entrada, Processamento ou Saída de Dados é um candidato em potencial para uma lista de
funcionalidades como a supracitada.
Então, comece sempre o planejamento de qualquer software listando todas as ações que as
entidades e o sistema serão capazes de realizar. E posteriormente essas ações vão se tornar
funcionalidades do seu sistema.
14
Sistema de Vendas usando Pagseguro
Quando um cliente entra num site de vendas, visualiza um produto e dá um clique sobre o
botão comprar, informações como: Identificação do Produto, Nome do Produto, Modelo do
Produto e quantidade de Produtos precisam ser armazenadas em algum lugar. Para que quando
o cliente finalize a compra, todas as informações dos produtos que ele escolheu sejam reunidas
em uma página e apresentadas a ele para confirmação e conclusão do Pedido.
Solução
A forma mais usada para resolver esse problema é a criação de um Carrinho de Compras.
Um Carrinho de Compras possibilita ao Cliente registrar os itens que ele quer comprar e
determinar a quantidade de cada item. Além disso, o carrinho (ou Cart) oferece métodos que
permitem listar os produtos já selecionados pelo cliente e calcular automaticamente o valor
total da compra.
Nesse artigo não vamos criar uma classe Carrinho do zero. Afinal, uma das melhores coisas
sobre programação Orientada a Objetos é a possibilidade de reaproveitar código, e um bom
exemplo disso é a classe descrita abaixo – Cart.class.php (carrinho de compras). Essa classe foi
reaproveitada de um excelente framework PHP, o CodeIgniter.
15
Sistema de Vendas usando Pagseguro
Eu realizei alguns poucos ajustes para remover as dependências e desagregar essa classe do
CodeIgniter. Dessa forma, podemos usar ela no nosso sistema com outros códigos que não os
contidos nas livrarias do CodeIgniter.
Abaixo você acompanha todo o código que compõe essa classe, darei um breve resumo sobre
cada um.
A primeira e mais importante função que um Carrinho de compras precisa ter é a capacidade
de receber e gravar informações de um produto. Essas informações são gravadas com o
método insert(). As informações são enviadas por parâmetro e seguem o padrão já
estabelecido pelo Codeigniter, sendo:
- id: Identificação única de um Produto no banco de dados;
- qty: Quantidade de um mesmo produto sendo adicionadas ao carrinho;
- price: Preço unitário do produto sendo adicionado;
- name: Nome ou título do Produto sendo adicionado;
- options: Esse é um campo livre para inclusão de informações extras sobre o produto sendo
adicionado ao carrinho. No caso, vamos adicionar apenas as informações “modelo”,
16
Sistema de Vendas usando Pagseguro
“modelo_title” e “peso”. Porém, você é livre para adicionar qualquer informação extra que
julgar útil.
Cart.class.php
<?php
namespace LIBVENDAS;
require_once 'session.class.php';
/**
* Esta é a Classe Cart reaproveitada da Framework CodeIgniter
* Para mais informações consulte o site do Desenvolvedor.
*
* @fonte: https://www.codeigniter.com
*/
class Cart
{
// These are the regular expression rules that we use to validate
// the product ID and product name
// alpha-numeric, dashes, underscores, or periods
var $product_id_rules = '\.a-z0-9_-';
O comando: namespace LIBVENDAS; é usado para evitar conflito com outra classe que por
ventura possa ter o mesmo nome que Cart, dessa forma, serve para categorizar a Livraria que
estamos desenvolvendo.
require_once 'session.class.php’;
Inclui no sistema a classe responsável por gerenciar sessões. Essa classe vai permitir que o
cliente navegue pelo site sem perder as informações sobre os produtos que ele escolhe
adicionar à compra. Sem essa classe, o objeto Cart iria registrar um produto escolhido pelo
cliente, mas as informações gravadas seriam perdidas assim que o cliente visitasse outra página
do site.
17
Sistema de Vendas usando Pagseguro
Cart.class.php (continuação)
public function __construct($params = array())
{
// Are any config settings being passed manually? If so, set them
$config = array();
if (count($params) > 0)
{
foreach ($params as $key => $val)
{
$config[$key] = $val;
}
}
// Grab the shopping cart array from the session table, if it exists
if ($this->session->get('cart_contents') != null)
{
$this->_cart_contents = $this->session->get('cart_contents');
}
else
{
// No cart exists so we'll set some base values
$this->_cart_contents['cart_total'] = 0;
$this->_cart_contents['total_items'] = 0;
}
O Método construtor da classe Cart recebe alguns parâmetros para a configuração através do
array $params. Porém, não cabe a explicação detalhada dessa funcionalidade aqui, pois não
faremos uso dela. A única alteração importante em relação à classe Original do CodeIgniter que
cabe ser mencionada é a remoção das linhas que fazem chamadas às bibliotecas do
CodeIgniter e a utilização da linha :
O método INSERT
Esse é o método usado no carrinho de compras que permite ao cliente registrar os Produtos e
demais informações sobre o item.
18
Sistema de Vendas usando Pagseguro
Cart.class.php (continuação)
/**
* Insert items into the cart and save it to the session table
*
* @access public
* @param array
* @return bool
*/
function insert($items = array())
{
// Was any cart data passed? No? Bah...
if ( ! is_array($items) OR count($items) == 0){
return FALSE;
}
$save_cart = FALSE;
if (isset($items['id'])){
if (($rowid = $this->_insert($items))){
$save_cart = TRUE;
}
}
else{
foreach ($items as $val){
if (is_array($val) AND isset($val['id'])){
if ($this->_insert($val)){
$save_cart = TRUE;
}
}
}
}
Esse método recebe como parâmetro um Array com as seguintes informações: id:string,
qty:integer, price:decimal, name:string, options:Array.
Veja abaixo um exemplo hipotético de como usar esse método. Note que os campos id, qty,
price e name são padrões, já o campo options pode guardar um Array com qualquer
informação que você desejar. Essa é a mecânica criada pela equipe do CodeIgniter e que se
manterá intacta.
Exemplo de uso:
$_produto = array(
'id' => 1001,
19
Sistema de Vendas usando Pagseguro
'qty' => 2,
'price' => 149.99,
'name' => Celular Nokia 1914,
'options' => array(
'modelo' => ’C3PO’,
'modelo_title' => ’Modelo com visual Retro’,
'peso' => 3000 /* 3Kg */
)
);
Cart.class.php (continuação)
/**
* Insert
*
* @access private
* @param array
* @return bool
*/
function _insert($items = array()){
// Was any cart data passed? No? Bah...
if ( ! is_array($items) OR count($items) == 0){
return FALSE;
}
if ( ! isset($items['id']) OR !
isset($items['qty']) OR ! isset($items['price']) OR !
isset($items['name'])){
return FALSE;
}
20
Sistema de Vendas usando Pagseguro
if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id'])){
return FALSE;
}
if ( ! preg_match("/^[".$this->product_name_rules."]+$/i",
$items['name'])){
return FALSE;
}
$items['price'] =
trim(preg_replace('/([^0-9\.])/i', '', $items['price']));
// Trim any leading zeros
$items['price'] =
trim(preg_replace('/(^[0]+)/i', '', $items['price']));
if ( ! is_numeric($items['price'])){
return FALSE;
}
unset($this->_cart_contents[$rowid]);
$this->_cart_contents[$rowid]['rowid'] = $rowid;
// Woot!
return $rowid;
}
Este método permite que a quantidade de um dado item possa ser alterada.
Tipicamente ele é chamado através do front-end, mais precisamente através da página carrinho
de compras quando um cliente faz alterações na quantidade de itens antes de realizar o
Checkout da compra. O parâmetro passado a esse método precisa conter o ID do Produto e a
quantidade para cada item para o registro funcionar corretamente.
Cart.class.php (continuação)
/*
* @access public
* @param array
* @param string
21
Sistema de Vendas usando Pagseguro
* @return bool
*/
function update($items = array()) {
// Was any cart data passed?
if ( ! is_array($items) OR count($items) == 0) {
return FALSE;
}
$save_cart = FALSE;
if (isset($items['rowid']) AND isset($items['qty'])) {
if ($this->_update($items) == TRUE) {
$save_cart = TRUE;
}
}
Else {
foreach ($items as $val)
{
if (is_array($val) AND
isset($val['rowid']) AND isset($val['qty'])){
if ($this->_update($val) == TRUE)
{
$save_cart = TRUE;
}
}
}
}
return FALSE;
}
Assim como o método privado _insert, o método _update também segue a metodologia
“dividir para conquistar”. É uma abordagem muito comum em programação orientada a
Objetos a divisão de código em peças menores. Isso torna mais fácil manejar os trechos
pequenos e não gerar o problema que a IBM – em seu artigo Build seven good object-oriented
habits in PHP – chama de “Olhar para a Medusa”.
Cart.class.php (continuação)
function _update($items = array())
{
// Without these array indexes there is nothing we can do
if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR !
isset($this->_cart_contents[$items['rowid']]))
22
Sistema de Vendas usando Pagseguro
{
return FALSE;
}
// Is the new quantity different than what is already saved in the cart?
// If it's the same there's nothing to do
if ($this->_cart_contents[$items['rowid']]['qty'] == $items['qty'])
{
return FALSE;
}
// Is the quantity zero? If so we will remove the item from the cart.
// If the quantity is greater than zero we are updating
if ($items['qty'] == 0)
{
unset($this->_cart_contents[$items['rowid']]);
}
else
{
$this->_cart_contents[$items['rowid']]['qty'] = $items['qty'];
}
return TRUE;
}
Cart.class.php (continuação)
/**
* Save the cart array to the session DB
*
* @access private
* @return bool
*/
function _save_cart()
{
// Unset these so our total can be calculated correctly below
unset($this->_cart_contents['total_items']);
unset($this->_cart_contents['cart_total']);
23
Sistema de Vendas usando Pagseguro
// Lets add up the individual prices and set the cart sub-total
$total = 0;
$items = 0;
foreach ($this->_cart_contents as $key => $val)
{
// We make sure the array contains the proper indexes
if ( ! is_array($val) OR ! isset($val['price']) OR !
isset($val['qty']))
{
continue;
}
// Woot!
return TRUE;
}
Os métodos a seguir finalizam a classe Carrinho de Compras. São métodos usados para fazer o
controle do Carrinho ou para obter informações sobre seu estado atual do mesmo.
24
Sistema de Vendas usando Pagseguro
Método total()
Se você tem um carrinho de compras, em algum momento você vai precisar saber o valor total
a ser pago pelas mercadorias dentro dele, e é para isso que serve o método total(). Esse
método retorna um valor decimal com o preço a ser pago pela compra do Cliente.
Cart.class.php (continuação)
/**
* @access public
* @return decimal
*/
function total()
{
return $this->_cart_contents['cart_total'];
}
Cart.class.php (continuação)
/**
* Total Items
*
* Returns the total item count
*
* @access public
* @return integer
*/
function total_items()
{
return $this->_cart_contents['total_items'];
}
25
Sistema de Vendas usando Pagseguro
Cart.class.php (continuação)
/**
* Cart Contents
*
* Returns the entire cart array
*
* @access public
* @return array
*/
function contents()
{
$cart = $this->_cart_contents;
// Remove these so they don't create a problem when showing the cart table
unset($cart['total_items']);
unset($cart['cart_total']);
return $cart;
}
Cart.class.php (continuação)
/**
* Has options
*
* Returns TRUE if the rowid passed to this function correlates to an item
* that has options associated with it.
*
* @access public
* @return array
*/
function has_options($rowid = '')
{
if ( ! isset($this->_cart_contents[$rowid]['options']) OR
count($this->_cart_contents[$rowid]['options']) === 0){
return FALSE;
}
return TRUE;
26
Sistema de Vendas usando Pagseguro
Cart.class.php (continuação)
/**
* Product options
*
* Returns the an array of options, for a particular product row ID
*
* @access public
* @return array
*/
function product_options($rowid = '')
{
if ( ! isset($this->_cart_contents[$rowid]['options'])){
return array();
}
return $this->_cart_contents[$rowid]['options'];
}
Nota: Acima foi usado o padrão americano de normatização, com a vírgula antes do ponto. Eu
decidi não alterar esse código, mas caso queira alterar para o padrão usado no Brasil, basta
mudar conforme abaixo:
Com essa alteração valores armazenados no Cart como 1149.99 se convertidos com essa
função retornarão como 1.149,99
Cart.class.php (continuação)
/**
* Format Number
27
Sistema de Vendas usando Pagseguro
*
* Returns the supplied number with commas and a decimal point.
*
* @access public
* @return integer
*/
function format_number($n = '')
{
if ($n == ''){
return '';
}
Cart.class.php (continuação)
/**
* Destroy the cart
*
* Empties the cart and kills the session
*
* @access public
* @return null
*/
function destroy()
{
unset($this->_cart_contents);
$this->_cart_contents['cart_total'] = 0;
$this->_cart_contents['total_items'] = 0;
$this->session->unset_userdata('cart_contents');
}
28
Sistema de Vendas usando Pagseguro
script estiver sendo processando no Servidor. No momento que a página final é retornada ao
Cliente, todas as variáveis e constantes declaradas em PHP deixam de existir, pois o Servidor
finaliza os processos do interpretador PHP.
Portanto, ao programar sistemas online em PHP, ASPX, Ruby é necessário ter mecanismos que
permitam identificar um Cliente que está fazendo requisições ao Servidor. Também é
importante garantir que uma variável declarada possa existir pelo tempo que quisermos. Essas
habilidades são possíveis graças as Sessões. Elas nos permitem algo chamado Persistência de
Dados.
O Carrinho de Compras construído no artigo anterior seria inútil sem uma sessão, pois sem a
sessão seria impossível identificar um usuário em meio a milhares quando ele retornar ao site
ou faz novas requisições ao servidor.
Portanto, agora vamos criar uma classe bem simples para gerenciar sessões, porém bem
flexível e que vai facilitar muito o trabalho no sistema de vendas online.
Session.class.php
29
Sistema de Vendas usando Pagseguro
<?php
namespace LIBVENDAS;
class Session
{
private static $instance;
private $session_expire_time = null ;
O método Construtor
O método construtor da classe Session é quem realiza todo o trabalho pesado, sendo ele o
responsável por impor as únicas linhas contendo algum tipo de lógica de programação.
Por seguir um modelo Singleton, a primeira linha de código self::$instance =& $this; diz ao
interpretador PHP que, a variável $instance deve receber o objeto atualmente instanciado, em
outras palavras receber a si própria.
session_start() – inicializa nossa sessão, não sendo necessário mais inserir essa chamada em
nenhum outro arquivo.
Session.class.php (continuação)
/**
* Método construtor
*
* @access public
* @param int - tempo máximo para expiração da sessão
*/
public function __construct( $expire_time = null )
{
# Singleton - evita ser instanciado duas vezes
self::$instance =& $this;
$this->setExpiretime( $expire_time );
session_start();
header("Cache-control: private");
30
Sistema de Vendas usando Pagseguro
header( "Cache-control: private" ) – Essa linha de código indica que toda ou parte da
mensagem de resposta do servidor é destinada a um único usuário e não deve ser armazenada
em cache por um serviço de cache compartilhado, como um servidor proxy, por exemplo.
A única lógica empregada nessa classe se encontra na condição IF. Essa condição verifica
primeiro se o programador definiu um tempo de expiração para a sessão dos usuários, caso
positivo, então dentro da condição IF, verificamos se entre o momento da ultima atividade do
usuário no sistema e o momento atual, excedeu-se o tempo determinado na variável
$session_expire_time. Caso não tenha excedido, apenas atualizamos o momento em que o
usuário realizou a ultima atividade no sistema com a função do PHP time() . Já para os casos em
que um usuário está inativo a muito tempo no sistema e o tempo excede o limite, será
chamado o método da classe destroy() que irá limpar todos os dados desse usuário e destruir a
sessão dele.
Session.class.php (continuação)
public static function getInstance( $expire_time = null ){
if(!isset(self::$instance))
self::$instance = new self( $expire_time );
return self::$instance;
}
31
Sistema de Vendas usando Pagseguro
Esse método é bem pequeno como os demais e não contém muita lógica de programação, ele
apenas verifica se o Objeto Session já foi criado, e para caso positivo, retorna-o. O ideal é
instanciar a classe Session através do comando Session::getInstance(); dessa
forma, esse método sempre verificará se a classe Session já foi instanciada e retornará sempre
o mesmo objeto.
Session.class.php (continuação)
public function setExpiretime($__value = null ){
if($__value != null)
$this->session_expire_time = $__value;
}
Note apenas nos métodos acima a presença de __set e __get que são conhecidos no jargão
PHP como métodos mágicos. Esses métodos permitem que você defina e obtenha variáveis das
sessões com comandos como os a seguir:
32
Sistema de Vendas usando Pagseguro
$session = Session::getInstance() ;
$empresa = $session -> empresa ;
$session -> empresa = “ABC Limitada” ;
echo $empresa ;
Session.class.php (continuação)
public function del($name){
unset($_SESSION[trim($name)]);
}
function destroy(){
$_SESSION = array();
session_destroy();
session_regenerate_id();
}
}
O Banco de Dados
O ideal em um software de vendas – ou qualquer outro tipo de software que necessite uma
base de dados – é a criação das tabelas que armazenarão as informações utilizando um Sistema
gerenciador de banco de dados, tal como MySQL, Oracle, SQL Server, etc.
Eu não vou ensinar nessa série de artigos como desenvolver o banco de dados e as tabelas. No
caso vou criar apenas uma simulação de banco de dados. Criando um banco de dados JSON
através de uma classe PHP estática. Farei isso para não prolongar de mais em assuntos que
fogem ao escopo desse documento.
A classe que controla o banco de dados será estática. Ficando presente durante toda a vida útil
do script. Afinal, não precisamos ter mais de 1 objeto gerenciador de base de dados
instanciado. E é melhor assim, pois evita conflito durante gravações. Imagine se dois objetos de
uma classe Database, tentassem abrir um arquivo ao mesmo tempo e gravar informações nele?
33
Sistema de Vendas usando Pagseguro
Database.php
<?php
/**
* Classe Database
* ---------------
*
* Esta é uma implementação simples de um Banco de dados em
* Arquivos de TEXTO. Usado apenas para fins didaticos
* para acompanhar o artigo sobre uso da API do PAGSEGURO.
* Recomendo o uso dessa classe apenas para testes,
* em produção o ideal é a utilização de um SGBD como
* MySQL, SQL Server, ORACLE, etc.
*
* --------------------------
*
* @created 2017.04.22 18:44h
* @autor wanderlei santana <sans.pds@gmail.com>
*/
class Database
{
private static $ext = "" ;
/**
* Retornar o caminho completo para uma tabela no
* servidor Web.
*
* @access private
* @param string $__tablename - nome da Tabela
* @return string
*/
private static function dbfilepath( $__tablename = "tabela_a_carregar" ){
return dirname(__FILE__) .
DIRECTORY_SEPARATOR .
34
Sistema de Vendas usando Pagseguro
/**
* Dado o nome de uma tabela JSON, retorna as informações
* contidas nessa tabela na forma de Array.
*
* @access public
* @param string $__tablename - nome da tabela
* @return Array
*/
public static function get( $__tablename ){
$__filepath = self::dbfilepath( $__tablename );
if(!file_exists($__filepath))
throw new Exception("Arquivo '$__filepath' não existe.", 1);
return json_decode(file_get_contents($__filepath ), true );
}
Na classe acima você pode ver dois métodos inicialmente. O primeiro, dbfilepath( ) serve para
obter o caminho absoluto das nossas tabelas JSON, já o segundo método get( ) é responsável
por retornar em forma de Array todos os dados encontrados dentro de uma tabela de dados
JSON.
Como eu optei por criar um gerenciador de banco de dados JSON, existe uma pequena lógica
empregada no salvamento de dados, que prefiro demonstrar de uma forma visual através de
um diagrama de blocos para ficar bem claro. Em resumo, queremos gravar um Array de dados
dentro de uma tabela, porém, precisamos considerar algumas possibilidades de erros e
evita-las. Por exemplo:
A tabela existe?
A tabela já tem registros?
O usuário definiu um ID que ele quer que seja o INDICE do registro?
O índice definido pelo usuário já existe?
Precisamos tomar cuidado para que ao gravar uma informação, outra já existente
não seja sobrescrita.
Abaixo, exemplo de um diagrama de blocos com a lógica empregada para fazer o salvamento
das informações em um arquivo JSON.
35
Sistema de Vendas usando Pagseguro
36
Sistema de Vendas usando Pagseguro
Database.php( continuação )
public static function save( $__tablename, $_dados = array() ){
$_tabela = Database::get( $__tablename ) ;
if($_tabela == null) $_tabela = array();
$_tabela[$index] = $_dados ;
file_put_contents(
self::dbfilepath( $__tablename ), json_encode($_tabela) );
return $index;
}
Database.php( continuação )
public static function update(
$__tablename,
$__key = 0,
$_dados = array() )
{
$_tabela = Database::get( $__tablename ) ;
if($_tabela == null) return false;
$_registro = (isset($_tabela[$__key]) &&
is_array($_tabela[$__key])) ? $_tabela[$__key] : null;
if($_registro == null) return false;
foreach ($_dados as $key => $value) $_registro[$key] = $value;
$_tabela[$__key] = $_registro ;
return file_put_contents(
self::dbfilepath( $__tablename ), json_encode($_tabela) );
}
37
Sistema de Vendas usando Pagseguro
O método remove() como o próprio nome diz, serve para excluir um registro. Basta passar
como parâmetro o nome da Tabela e o Índice que deve ser removido.
Isso finaliza o banco de dados JSON. Para gravar uma informação nesse nosso banco de dados
hipotético basta proceder da seguinte maneira.
1. Criar um arquivo vazio na pasta database. Ex: database/minha_tabela
2. Emitir os comandos abaixo para manipular a tabela:
# atualiza um registro
$_dados[‘email’] = ‘socrates@outlook.com’ ;
Database::update( ‘minha_tabela’, $__id , $_dados );
# remove um registro
Database::remove( $__id );
38
Sistema de Vendas usando Pagseguro
A estrutura acima é um exemplo e pode lhe dar um norte para criar uma complexa estrutura e
armazenas as informações sobre seus produtos. Eu não vou explica-la nem implanta-la no
sistema, pois não é foco desse material. Mas, sinta-se a vontade para usa-la como quiser.
Agora continuando com o banco de dados hipotético que é foco desse pequeno sistema
exemplo. As tabelas são criadas em JSON. Tudo que precisamos no momento é criar um arquivo
vazio dentro da pasta database. No meu caso, o arquivo se chama produtos e fica localizado
em:
Descrição:Nossa tabela hipotética de Produtos
C:\wamp\www\Pagseguro\database\produtos
39
Sistema de Vendas usando Pagseguro
Arquivo: produtos
As informações acima estão escritas em JSON e referem-se a 3 produtos. Isso bastará para o
nosso teste com o Pagseguro.
{"10001":{"id":10001,"nome":"Wanderlei","sobrenome":"Santana do
Nascimento","email":"sans.pds@gmail.com","cpf":"34208236587","fone":"987554321","fone_
cod":"98","endereco":{"endereco":"Rua
Hipotetica","numero":"4530","bairro":"Pereque","cidade":"Ilhabela","estado":"SP","cep":"1163
0000","referencia":"Proximo ao Mercado Hipotetico"}}}
40
Sistema de Vendas usando Pagseguro
41
Sistema de Vendas usando Pagseguro
Para facilitar o trabalho e reaproveitar código as páginas do Front-End são Divididas em três
partes, sendo: Cabeçalho (frontend_header.php), Conteúdo (produtos.php) e Rodapé
(frontend_footer.php).
C:\wamp\www\Pagseguro\produtos.php
C:\wamp\www\Pagseguro\frontend_header.php
C:\wamp\www\Pagseguro\frontend_footer.php
Frontend_header.php
<!doctype html>
<html lang="pt-br">
<head>
<meta charset="utf-8">
A página header acima guarda informações de CSS a ser inserido, Javascript e configura o
Cabeçalho HTML5 necessário em toda página Web. A demais, esta página cria um Menu
navegacional para que todas as páginas que a incluírem recebam também esse menu.
Frontend_footer.php
</body>
</html>
A página footer não requer muitos detalhes. Por convenção apenas fechamos as tags Body e
HTML. Você pode adicionar informações de Copyright se assim o desejar. Mas para um sistema
de exemplo, isso deve bastar.
42
Sistema de Vendas usando Pagseguro
Acima você pode ver a lógica empregada para processar a página Produtos e abaixo o código
desenvolvido na prática.
43
Sistema de Vendas usando Pagseguro
Produtos.php
<?php
# VERIFICANDO SOLICITAÇÔES
# ------------------------
# Quando o usuário clica no botão adicionar produto ao carrinho,
# essa página é encarregada de processar esse pedido.
# Para isso, ela verifica se a URL atual contém um parâmetro
# chamado "adicionar_ao_carrinho".
# Esse parâmetro, guarda o ID do produto.
# Você pode - e deve - implementar outro mecanismo de processo
# que melhor se enquadre na necessidade do seu sistema.
# No meu caso eu costumo fazer esses processos via jQuery/Ajax.
if( isset($_GET['adicionar_ao_carrinho']) &&
is_numeric($_GET['adicionar_ao_carrinho']) ):
44
Sistema de Vendas usando Pagseguro
endif;
?>
Por fim criamos a parte que apresenta o conteúdo HTML que deve ser retornado ao cliente.
Produtos.php (continuação)
<?php
# Incluindo o cabecalho da pagina html
include 'frontend_header.php'; ?>
<h2>Produtos</h2>
<?php
# ALERTA DO SISTEMA
# -------------------
# Verificando se ha alguma mensagem sobre produto
# adicionado ao carrinho de compras
if(isset($_message) && count($_message) > 0 )
echo
"<div class='sysvendas-alertar-{$_message['success']}'>
{$_message['message']}
</div>";
?>
45
Sistema de Vendas usando Pagseguro
<section class="lista-produtos">
<?php foreach ($_produtos as $_produto): ?>
<div class='produto'>
<div class='produto-imagem'>
<img src='<?=$_produto['img'];?>'>
</div>
<div class='produto-info'>
<h2><?=$_produto['titulo'];?></h2>
<p><?=$_produto['desc'];?></p>
<span>
R$<?=number_format(
$_produto['preco'], 2, ',', '.');?>
</span>
<a
href='?adicionar_ao_carrinho=<?=$_produto['id'];?>&qtd=1'
class='btn-add-carrinho'>
Adicionar ao Carrinho
</a>
</div>
</div>
<?php endforeach;?>
</section>
O Arquivo Style.css
Abaixo deixo o arquivo CSS completo para todo o sistema. Ele será adicionado por inteiro sem
muita explicação por não ser foco deste artigo.
Style.css
body{
font-family: "Source Sans Pro","HelveticaNeue","Helvetica Neue",sans-serif;
color: #666;
padding:10px 20px;
}
div.sysvendas-alertar-1,
div.sysvendas-alertar-0{padding: 10px;margin-bottom: 20px;}
div.sysvendas-alertar-1{background-color: #DFF0D4;color:#2C7635;
border-color: #D6E9C4;
}
div.sysvendas-alertar-0{
background-color: #F2DEDC;
color:#AC260D;
border-color: #EBCCCF;
46
Sistema de Vendas usando Pagseguro
}
a:focus, input:focus{outline: none;}
/* PAGINA: PRODUTOS.PHP */
section.lista-produtos{display:flex;flex-wrap:wrap;}
div.produto{
padding: 2%;
flex-grow: 1;
flex-basis: 16%;
display: block;
border: 3px solid #fff;
}
div.produto:hover{border: 3px solid #eee;}
div.produto-imagem img {max-width: 100%;}
div.produto-info {margin-top: auto;}
div.produto-info h2{
font-size: 17px;
line-height: 1.375;
}
div.produto-info p{font-size: 14px;}
div.produto-info span{
font-size: 18px;
display: block;
margin: 10px 0px;
}
div.produto-info a.btn-add-carrinho:link,
div.produto-info a.btn-add-carrinho:visited{
background-color: #7AB55C;
color:#fff;
text-decoration: none;
padding: 10px 20px;
display: block;
text-align: center;
border-radius: 3px;
}
div.produto-info a.btn-add-carrinho:hover{background-color: #6DAA4D;}
ul.menu-top-opcoes{list-style: none;margin:0;padding: 0;background-color:
#EDEFF0;font-size: 14px;}
ul.menu-top-opcoes li{display: inline;}
ul.menu-top-opcoes li a:link,
ul.menu-top-opcoes li a:visited{
text-decoration: none;
padding: 10px;
line-height: 36px;
color:#444444;
}
ul.menu-top-opcoes li a:hover{background-color: #7AB55C;color:#fff;}
/* PAGINA: CARRINHO.PHP */
table, th, td {border: 1px solid #D9D9D9; border-collapse: collapse;}
table.table-sysvendas-cart{
width: 100%;
background-color: #F2F2F2;
}
table.table-sysvendas-cart thead tr th{
background-color: #D9D9D9;
line-height: 36px;
font-size: 14px;
47
Sistema de Vendas usando Pagseguro
}
table.table-sysvendas-cart tbody tr{border-bottom: 1px solid #999999;}
table.table-sysvendas-cart tbody tr td{line-height: 30px;padding: 10px 20px;}
table.table-sysvendas-cart tbody tr td:last-child{text-align: center;}
table.table-sysvendas-cart tbody tr td a{text-decoration: none;color:#0077CF;}
table.table-sysvendas-cart tbody tr td a:hover{text-decoration: underline;}
table.table-sysvendas-cart tfoot{background-color: #D9D9D9;}
table.table-sysvendas-cart tfoot tr td{padding: 10px 20px;color:#000;}
table.table-sysvendas-cart tfoot tr td input{
border:none;
color:#0066CC;
font-size: 18px;
background-color: #D9D9D9;
cursor: pointer;
}
table.table-sysvendas-cart tfoot tr td input:hover{color:#FF4C00;}
div.div-fechar-pedido{text-align: center;}
input.btn-fc-enabled, input.btn-fc-disabled{
border:none;
padding: 15px 50px;
color:#fff;
text-transform: uppercase;
}
input.btn-fc-enabled{background-color: #559911;cursor: pointer;}
input.btn-fc-enabled:hover{background-color: #6FC717;}
input.btn-fc-disabled{background-color: #ccc;}
/* PAGINA: FINALIZAR_COMPRA.PHP */
h1{text-decoration: underline;}
table.sysv-confirmar-pedido{width: 100%;}
table.sysv-confirmar-pedido tr th{font-weight: bold;text-align: left;padding:10px;}
table.sysv-confirmar-pedido tr td{padding:10px;}
input.cartend{
background-color: #559911;
color:#fff;
border:none;
cursor: pointer;
padding: 15px 50px;
text-transform: uppercase;
}
input.cartend:hover{
background-color: #6FC717;
}
a.link-setar-forma-envio:link,a.link-setar-forma-envio:visited{
background-color: #7AB55C;
color:#fff;
text-decoration: none;
padding: 10px 20px;
width:200px;
text-align: center;
border-radius: 3px;
}
td.td-destaque{background-color: #F3F3F3;}
48
Sistema de Vendas usando Pagseguro
49
Sistema de Vendas usando Pagseguro
50
Sistema de Vendas usando Pagseguro
Carrinho.php
<?php
# INICIALIZANDO SESSAO
# --------------------
# vamos fazer uso do objeto que manipula
# sessao. Logo, pegamos sua instancia que
# ja foi criada anteriormente pela classe
# Cart.
$session = LIBVENDAS\Session::getInstance();
51
Sistema de Vendas usando Pagseguro
Carrinho.php (continuação)
<?php include 'frontend_header.php'; ?>
<h2>Carrinho de Compras</h2>
<section class="carrinho">
<?php
$i = 1;
$total_items = $carrinho->total_items();
if( $total_items > 0 ){ ?>
<tbody>
<?php foreach ($carrinho->contents() as $items): ?>
52
Sistema de Vendas usando Pagseguro
<tr>
<td>
<input type="hidden" name="<?=$i;?>[rowid]"
value="<?=$items['rowid'];?>">
<?=$items['name']; ?> -
<?=$items['options']['modelo_title']; ?></td>
<td>
<input type="text" name="<?=$i.'[qty]';?>"
id="qtd" value="<?=$items['qty'];?>"
maxlength="2" size="5"
onkeypress="return event.charCode >= 48 && event.charCode
<= 57">
</td>
<td>
<?=$carrinho->format_number($items['price']); ?></td>
<td>
R$<?=$carrinho->format_number($items['subtotal']);?></td>
<td>
<a class="remove_item"
title="Excluir este item do carrinho de compras?"
href="?remover=<?=$items['rowid'];?>">remover</a>
</td>
</tr>
<?php $i++; endforeach; ?>
</tbody>
<tfoot>
<tr>
<td>
<input type="button" class="retcart"
value="continuar comprando"
onclick="javascript:window.location ='produtos.php';" />
</td>
<td>
<input type="submit" class="upcart" name=""
value="Atualizar Carrinho">
</td>
<td colspan="3">
<b>Total dos produtos:</b> R$<strong>
<?php
echo number_format( $carrinho->total(), 2, ',', '.' );
?>
</strong></td>
</tr>
</tfoot>
</table>
</form>
</div><!-- // tabela carrinho -->
<br>
<hr>
<div>
<h3> Escolha uma Forma de Envio </h3>
<p>
Escolha abaixo uma das formas de envio da mercadoria oferecido.
Essa informação será enviada ao Pagseguro para o devido calculo
53
Sistema de Vendas usando Pagseguro
de taxa de envio.
Você também pode retirar sua compra diretamente em nossa loja.
</p>
<?php
# verificando se ja setou a forma de envio
$_tmp = $session->dados_envio ;
".((isset($_tmp)&&$_tmp['forma_envio']==$value)?'checked':'').">{$value}
<br>";
?>
<p>
<strong>Nota:</strong>
O valor de envio será Calculado por Pagseguro no ato
do pagamento dos produtos.<br>
<strong>Nota:</strong> Selecione "<strong>Não especificado</strong>"
se quiser deicidir durante o pagamento no Pagseguro.<br>
</p>
</div>
<?php
# seta o botao de continuar
$__enabled = (isset( $_tmp )&&count($_tmp) > 0 ) ? 'enabled' : 'disabled' ;
?>
<br><hr><br>
<div class="div-fechar-pedido">
<input type="button" value="Finalizar Compra"
id="fechar_pedido" class="btn-fc-<?=$__enabled;?>"
onclick="javascript:window.location ='finalizar_compra.php';"
<?=$__enabled;?> />
</div>
<br>
<?php } ?>
</section>
54
Sistema de Vendas usando Pagseguro
Finalizar_compra.php
<?php
require_once 'classes/LIBVENDAS/Cart.class.php';
$carrinho = new LIBVENDAS\Cart;
$session = LIBVENDAS\Session::getInstance();
# DADOS DO CLIENTE
# ----------------
# Uma vez que o foco deste codigo é demonstrar
# o uso da API do Pagseguro., não foi implementado
# um sistema de cadastro e login de usuários.
# Portanto, aqui eu uso um usuário hipotetico e
# estatico para preencher os dados que devem ser
# enviados ao Pagseguro.
# Em seu Código, você deve obter os dados do Cliente
# que esta realizando a compra aqui via SGBD.
require_once 'database/database.php' ;
$_tabela = Database::get( 'usuarios' ) ;
# convertemos array para um objeto afim de ficar mais intuitivo manipular os dados.
$cliente = json_decode(json_encode( $cliente ),FALSE) ;
55
Sistema de Vendas usando Pagseguro
?>
Finalizar_compra.php (continuação)
<?php include 'frontend_header.php'; ?>
<h2>Finalizar Compra</h2>
<?php
# verificando se temos uma compra em andamento
# para este cliente.
$total_items = $carrinho->total_items();
( $total_items > 0 ) or die(
"Você ainda não adicionou produtos ao carrinho de compras." ); ?>
<table class="sysv-confirmar-pedido">
<thead>
<tr>
<th>Pedido</th>
<th>Qtd.</th>
<th>Preço</th>
<th>Sub-Total</th>
</tr>
</thead>
<tbody>
<?php foreach ($carrinho->contents() as $items): ?>
<tr>
<td>
<?php echo $items['name'] . " - " .
$items['options']['modelo_title']; ?>
</td>
<td><?=$items['qty']; ?></td>
<td><?php echo $carrinho->format_number($items['price']); ?></td>
<td>
R$<?php echo $carrinho->format_number($items['subtotal']);?>
</td>
</tr>
<?php endforeach; ?>
56
Sistema de Vendas usando Pagseguro
</tbody>
<tfoot>
<tr>
<td colspan="5"><h3>Detalhes da Venda </h3></td>
</tr>
<tr>
<td colspan="3"><strong>Valor dos produtos:</strong></td>
<td>
R$<?php echo $carrinho->format_number($carrinho->total()); ?>
</td>
</tr>
<tr>
<td colspan="3"><strong>Frete:</strong></td>
<td><b>Será calculado pelo Pagseguro</b></td>
</tr>
<tr>
<td colspan="3"><strong>Valor Total:</strong></td>
<td class="td-destaque"><b>R$
<?php echo $carrinho->format_number($carrinho->total()); ?>
+ Frete</b>
</td>
</tr>
<tr>
<td colspan="3"><strong>Forma de Envio:</strong></td>
<td class="td-destaque"><b><?=$__forma_de_envio;?></b></td>
</tr>
</tfoot>
</table>
<br>
<h1>Dados do Cliente</h1>
<?php
echo $cliente->nome . " " . $cliente->sobrenome . "<br>";
echo $cliente->email;
echo "<br>Documento : $cliente->cpf" ;
echo "<br>" ;
<br><hr /><br>
57
Sistema de Vendas usando Pagseguro
echo "Você não definiu qual a forma de Envio da sua compra. Por favor,
clique no link a seguir e selecione uma das
formas de envio disponíveis.
<a class='link-setar-forma-envio' href='carrinho.php'>
Forma de Envio</a><br><br><hr>";
?>
<p>
Ao clicar em <b>Continuar</b> você será direcionado
ao site do <b>Pagseguro</b> para efetuar o seu pagamento,
e também calcular os custos de envio da sua compra.
</p>
<center>
<input type="submit" class="btn-fc-<?=$__enabled;?>"
name="continuar" id="fechar_pedido"
value="Concluir" <?=$__enabled;?> />
</center>
</form>
<br>
Identificando o Cliente
Se você esta acompanhando esta série de artigos desde o início, então, o arquivo que vamos
criar a seguir deve ser nomeado como concluir_pedidos.php. No meu caso esse arquivo se
localiza em:
58
Sistema de Vendas usando Pagseguro
Se você começou a ler a partir desse artigo, pois só precisa aprender a implantar o Pagseguro
em seu site, então o arquivo que se segue trata-se do arquivo responsável por finalizar a
compra de um cliente e remeter ele ao GATWAY de pagamento.
A primeira coisa logica a ser feita no script é obter as informações que identificam o Cliente, os
dados da compra e iniciam a base de dados. Pois assim, poderemos gravar uma nova venda no
banco de dados e associar ao cliente.
concluir_pedido.php
<?php
# AREA PARA DECLARAÇÃO DE FUNÇÕES UTEIS
# -------------------------------------
# base_url() obtem a URL principal do site
# @return string
function base_url() {
$pathInfo = pathinfo($_SERVER['PHP_SELF']);
$protocolo = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))
=='https://'?'https://':'http://';
return $protocolo.$_SERVER['HTTP_HOST'].$pathInfo['dirname']."/";
}
# INICIALIZANDO SESSAO
# --------------------
$session = LIBVENDAS\Session::getInstance();
# --------------------------------
# [1]. INICIANDO BANCO DE DADOS &
# --------------------------------
# [1.1] IDENTIFICANDO O CLIENTE
# --------------------------
# Obtendo novamente dados hipoteticos de
# um cliente logado no sistema.
# O ideal aqui, e' usar os dados da Sessão para
# identificar o cliente logado e obter todas as
# informações do banco de dados.
# Dados Gerais, endereços e etc.
require_once 'database/database.php' ;
$_tabela_clientes = Database::get( 'usuarios' ) ;
# convertemos array para um objeto afim de ficar mais intuitivo manipular os dados.
$cliente = json_decode(json_encode( $cliente ),FALSE) ;
# --------------------------
# [2]. CLIENTE ESTA LOGADO ?
59
Sistema de Vendas usando Pagseguro
# --------------------------
# Verifique aqui sempre se o usuario esta
# devidamente logado no sistema e tem sessão ativa.
# Caso não estiver, direcionar o cliente para
# a pagina de login ou cadastro.
$idcliente = $cliente -> id ;
if( ! $idcliente ){
# direcionar aqui usuario para a página de Login
exit;
}
A função base_url() existe apenas para pegar o endereço do site e o caminho para o arquivo
que o esta chamando.
Em seguida, requerimos a classe Cart.class.php pois ela gerencia todos os produtos comprados
pelo cliente através da classe de sessão (Session::getInstance()).
Você deve obter as informações do cliente que está realizando a compra em seu site. Como
criei um pequeno site hipotético para apresentar o funcionamento do sistema do Pagseguro,
eu apenas obtenho um cliente qualquer de uma base de dados.
É importante verificar nesse ponto se o cliente está logado. Caso não estiver, então você
precisa redireciona-lo para uma página de login ou de cadastro dentro do seu site.
O Pscode é uma informação gerada pelo sistema do Pagseguro. Quando você envia os dados da
compra do cliente via XML, o Pagseguro retorna outro arquivo XML que contém a resposta a
essa solicitação e o número gerado para identificar a transação. Você deve pegar esse código e
gravá-lo dentro da tabela vendas na coluna pscode.
concluir_pedido.php (continuação)
# ----------------------------------------------
# [3]. GRAVANDO DADOS DA VENDA NO BANCO DE DADOS
60
Sistema de Vendas usando Pagseguro
# ----------------------------------------------
# Você deve ter uma tabela no seu banco de dados que
# guarda todos os dados referentes a venda. Nesse caso,
# o código abaixo visa gerar todos os dados necessarios
# para identificar essa venda no seu sistema.
$x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
ceil(20/strlen($x)))),1,20));
Note no código acima que além do pscode, também existe uma coluna na tabela de vendas
chamada Key. Essa coluna é necessária e serve como referência para identificar a venda
sempre que o Pagseguro envia uma mensagem de alteração no estatus da mesma. No caso eu
criei uma chave alfanumérica de 20 caracteres. Essa referência deve ser enviada ao Pagseguro,
pois no momento que o cliente pagar a compra, o sistema do Pagseguro usa esse código de
referência para informar que essa venda em especifico foi quitada, ou teve seu status alterado.
61
Sistema de Vendas usando Pagseguro
concluir_pedido.php (continuação)
# ----------------------------------------------
# [4]. GRAVANDO ITEMS DA VENDA NO BANCO DE DADOS
# ----------------------------------------------
# Esta é a parte em que você registra todos os itens vendidos
# na sua tabela de itens de venda.
$_produtos = array();
foreach ($carrinho->contents() as $items):
$_produtos[] = $item;
endforeach;
Nesse processo, tudo que fazemos é percorrer todos os produtos que estão no carrinho de
compras do cliente e gravar essas informações no banco de dados para garantir a permanência
das informações. Caso você se esqueça de gravar essas informações no banco de dados, elas
irão se perder com a sessão e possivelmente você não poderá criar um relatório sobre seu
estoque, ou sobre o total de itens vendidos, entre outras coisas.
62
Sistema de Vendas usando Pagseguro
Nota: Aqui eu optei por criar uma Classe PHP vazia (stdClass) por achar mais pratico a
manipulação de dados, porém você pode usar seus dados através de array ou como preferir.
No código abaixo eu uso o e-mail e token hipotético, para fins de teste, trate de alterar essas
informações com os seus dados verdadeiros. Além de alterar também as demais informações
hipotéticas que eu utilizei para fins de exemplo.
concluir_pedido.php (continuação)
# --------------------------------------------------
# [5]. INICIANDO PROCESSO DE TRANSAÇÃO COM PAGSEGURO
# --------------------------------------------------
# Carregando os dados de Configurações
# setando as configuracoes necessarias para integração
$config = new stdClass;
Note acima, na variável $xml, a tag redirectURL. O valor contido nela deve ser algo como:
http://nomedoseusite.com.br/confirmacao.php
63
Sistema de Vendas usando Pagseguro
Esse arquivo será construido logo mais. Trata-se de um arquivo simples HTML que é chamado
pelo Pagseguro quando o cliente pagar a compra. Esse arquivo serve apenas para informar ao
cliente que a compra dele foi realizada com sucesso.
Continuando com a geração do arquivo XML que será enviado ao Pagseguro, definimos agora
no arquivo as informações sobre os itens vendidos (id, titulo, peso, quantidade, peso) e
também as informações sobre o cliente (nome, fone).
concluir_pedido.php (continuação)
# Aqui, informamos ao pagseguro sobre os itens que foram vendidos.
# Enviando apenas algunas informações básicas.
$xml .= "<items>";
foreach( $_produtos as $produto ):
$xml .= "
<item>
<id>{$produto['item_id']}</id>
<description>" . utf8_decode( $produto['title'] ) . " - " . utf8_decode(
$produto['modelo_title'] ) . "</description>
<amount>{$produto['preco']}</amount>
<quantity>{$produto['qtd']}</quantity>
<weight>{$produto['peso']}</weight>
</item>";
endforeach;
$xml .= "</items>";
if(isset($__fone)){
$xml .="<phone>
<areaCode>$__fone_cod</areaCode>
<number>$__fone</number>
</phone>";
}
$xml .= "</sender>";
64
Sistema de Vendas usando Pagseguro
Repare acima a presença da chave que criamos e gravamos no banco de dados – $key – dentro
da tag reference. Como dito anteriormente, ela servirá para identificar a nossa venda no
Pagseguro.
Abaixo, definimos a forma de pagamento e tomamos algumas precauções para validar os dados
que serão enviados ao Pagseguro.
Nota: lembre-se que é muito comum em um site de vendas, o cliente ter a opção de definir o
endereço de entrega e o endereço de cobrança. Se esse for o seu caso, você deve inserir
condições para satisfazer essa opção, informando isso ao Pagseguro.
concluir_pedido.php (continuação)
# setando tipo de envio Sedex(2), pac(1) ou retirada na loja(999), ou nao
especificado(3)
$__cod_envio = $forma_envio['cod_servico'];
Isso conclui a geração do arquivo XML que deve ser enviado ao Pagseguro.
65
Sistema de Vendas usando Pagseguro
Rotinas de Auditoria
Como você está manipulando informações sensíveis e vitais para a realização com sucesso de
uma operação de venda, é ideal que você possa realizar uma auditória para o caso de ocorrer
erros ou o caso de uma anomalia vir a afetar as vendas. Por exemplo, os desenvolvedores do
Pagseguro podem alterar uma mecânica do sistema em algum momento e passar a considerar
o arquivo XML que você envia como sendo inválido. Portanto, grave a todos os processos de
comunicação com o sistema de pagamentos em arquivos de log ou então no banco de dados
que estiveres a usar.
Aqui eu criei uma pasta chamada Logs, que já foi referida anteriormente. E vou gravar nessa
pasta o arquivo XML que acabei de gerar. É muito importante que ninguém tenha acesso a essa
pasta e aos arquivos dela. Se você optar por gravar arquivos de logs em seu servidor, dentro da
pasta crie um arquivo .htaccess com a linha de código:
Deny from all
concluir_pedido.php (continuação)
# AUDITORIA
# ---------
# Existem momentos em que é necessario fazer auditoria
# dos dados enviados ao pagseguro. Portanto, a linha
# abaixo, tem o objetivo de registrar um log da venda
# efetuada.
# [!IMPORTANTE]: Caso opte por fazer o log desse XML
# tenha certeza de armazena-lo num local privado no
# seu servidor para evitar acesso não autorizado.
$__filepath = getcwd() . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR .
strtolower( "ps_{$idvenda}_" );
file_put_contents( $__filepath, $xml ) ;
Após o envio, voltamos a realizar um processo de auditoria, que é gravar em log o resultado do
xml retornado do Pagseguro. O arquivo de log será nomeado como rs_{id_da_venda}_ . Dessa
66
Sistema de Vendas usando Pagseguro
forma, caso ocorra um erro com uma venda em especifico você pode verificar o que informa o
arquivo de log para aquela venda.
concluir_pedido.php (continuação)
# -------------------------------------------
# [6]. FAZENDO REQUISIÇÃO A API DO PAGSEGURO
# -------------------------------------------
# Essa seção do codigo usa a tecnologia CURL
# para fazer um POST dos dados no serviço do Pagseguro.
$curl = curl_init( $config -> url );
# configuurando curl para nao verificar certificados ssl
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
# avisando ao curl para retornar a resposta do pagseguro
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
# informando ao curl o tipo de dado a ser transportado
curl_setopt($curl, CURLOPT_HTTPHEADER,
Array('Content-Type: application/xml; charset=ISO-8859-1'));
# setando o xml a ser transportado pelo CURL
curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
# exeutando o CURL e recebendo resposta do pagseguro
$xml = curl_exec( $curl );
# AUDITORIA
# ---------
# Quando fizermos um post com CURL
# o Pagseguro nos retornará um XML de resposta
# que iremos registrar tambem no servidor.
$__filepath = getcwd() . DIRECTORY_SEPARATOR . 'logs'.
DIRECTORY_SEPARATOR . strtolower( "rs_{$idvenda}_" );
file_put_contents( $__filepath, $xml ) ;
67
Sistema de Vendas usando Pagseguro
Observe no caso acima, que o Pagseguro retornou um xml com uma tag chamada code. O valor
desta tag refere-se ao Pscode que foi citado anteriormente e o qual teve uma coluna criada na
tabela vendas do banco de dados.
Exemplo de Erro. Caso algum parametro seja invalido, o XML devera ser algo como:
<?xml version="1.0" encoding="UTF-8"?>
<errors>
<error>
<code>11004</code>
<message>Currency is required.</message>
</error>
<error>
<code>11005</code>
<message>Currency invalid value: 100</message>
</error>
</errors>
Caso aconteça algum erro no processo de transação com o Pagseguro, o ideal é que o cliente
seja direcionado para uma página informando o erro, ou então, que esse erro seja enviado ao
programador responsável pelo sistema via e-mail.
concluir_pedido.php (continuação)
# VERIFICAÇÃO DE ERRO 01
# ----------------------
# unalthorized indica um erro com token ou email
if($xml == 'Unauthorized'){
# Insira seu código avisando que o sistema está com problemas,
# sugiro enviar um e-mail avisando para alguém fazer a manutenção
# redireciona usuario para uma pagina que indica o erro com a venda
# pode ser interessante desfazer a venda nesse caso
header( 'Location:' . base_url() . 'paginadeerro.php' );
exit; # Matando o processo
}
# fechando o CURL
curl_close( $curl );
68
Sistema de Vendas usando Pagseguro
# VERIFICAÇÃO DE ERRO 02
# ----------------------
if(count($xml->error) > 0){
# Insira seu código avisando que o sistema está com problemas,
# sugiro enviar um e-mail avisando para o desenvolvedor,
# talvez seja útil enviar os códigos de erros.
# carregando dados de configuracao do pagseguro
# redirecionando cliente a pagina de erros
header( 'Location:' . base_url() . "paginadeerro.php?error=" . $xml->error->code
);
exit;//Mantenha essa linha
}
Note acima a presença de um comando header. Ele ira direcionar o cliente para uma página
chamada paginadeerro.php . Essa página deve ser criada para apresentar os possíveis erros que
aconteceram durante a transação com o Pagseguro.
concluir_pedido.php (continuação)
# se nao ocorreu erro guarda codigo de transacao na tabela de vendas
Database::update( "vendas", $idvenda, array( 'pscode' => $xml->code ) );
69
Sistema de Vendas usando Pagseguro
Usaremos a função str_replace do PHP para trocar as hashtags por informações que são
definidas no arquivo concluir_pedido.php .
Não colocarei o código do arquivo Template aqui, por ser extenso e não ser crucial ao
funcionamento da página concluir_pedido. Você pode baixar o arquivo através do link:
http://sooho.com.br/resources/email_template.html
Basta acessar essa página, Segurar a tecla CTRL e pressionar U. Copiar todo o código e salvar.
Abaixo, segue o código responsável por carregar o arquivo de Template, definir as mensagens e
enviar definitivamente o e-mail ao endereço do cliente.
concluir_pedido.php (continuação)
# -----------------------------------------
# [7]. ENVIANDO EMAIL DE SUCESSO NA COMPRA
# -----------------------------------------
# O codigo abaixo visa informar o cliente de
# que a compra dele foi registrada com sucesso.
#
70
Sistema de Vendas usando Pagseguro
$resumo =
"Esse e-mail visa informar que registramos sua compra com sucesso em nosso sistema.
Obrigado por Comprar conosco da {$config->empresa}!";
$conteudo = "- Seu pedido será postado imediatamente após a compensação de pagamento.
<br />
- Para pagamento por Depósito ou Transferência o comprovante deve ser enviado
para <b>{$config->empresa_mail}</b> ou através do seu Painel de Controles.<br /><br
/>
Os produtos são reservados até a data de vencimento do seu pedido.<br /><br />
$nota = "Para acompanhar o andamento de sua compra, você pode utilizar seu
Painel de Controles <a href='".base_url()."cliente/login'>clicando aqui</a>.";
71
Sistema de Vendas usando Pagseguro
if( ! mail( $cliente -> email, $assunto, $tpl, $__headers ,"-r".$config ->
empresa_mail ) ){
$__headers .= "Return-Path: " . $config -> empresa_mail . "\n";
mail($cliente -> email, $assunto, $tpl, $__headers );
}
Caso você venha a usar o código acima descrito para envio de e-mail ao cliente, lembre-se de
alterar as informações para que se adequem as suas necessidades.
concluir_pedido.php (continuação)
# -----------------------------------------------
# [8]. FINALIZANDO PROCESSOS E LIMPANDO RECURSOS
# -----------------------------------------------
# limpando carrinho de compras
$carrinho->destroy();
Isso concluiu a explicação sobre como realizar uma venda com o Pagseguro. Nos próximos
tópicos vamos tratar de alguns assuntos muito importantes como a criação de uma página de
erros e também a página que recebe as notificações do Pagseguro e muda o status de uma
venda.
Será uma página simplória que servirá de base aos seus projetos.
72
Sistema de Vendas usando Pagseguro
paginadeerro.php
<?php
$_status_pagseguro = array(
10001 => 'Email is required.',
10002 => 'Token is required.',
10003 => 'Email invalid value.',
11001 => 'receiverEmail is required.',
11002 => 'receiverEmail invalid length: {0}.',
11003 => 'receiverEmail invalid value.',
11004 => 'Currency is required.',
11005 => 'Currency invalid value: {0}',
11006 => 'redirectURL invalid length: {0}',
11007 => 'redirectURL invalid value: {0}',
11008 => 'reference invalid length: {0}',
11009 => 'senderEmail invalid length: {0}',
11010 => 'senderEmail invalid value: {0}',
11011 => 'senderName invalid length: {0}',
11012 => 'senderName invalid value: {0}',
11013 => 'senderAreaCode invalid value: {0}',
11014 => 'senderPhone invalid value: {0}',
11015 => 'ShippingType is required.',
11016 => 'shippingType invalid type: {0}',
11017 => 'shippingPostalCode invalid Value: {0}',
11018 => 'shippingAddressStreet invalid length: {0}',
11019 => 'shippingAddressNumber invalid length: {0}',
11020 => 'shippingAddressComplement invalid length: {0}',
11021 => 'shippingAddressDistrict invalid length: {0}',
11022 => 'shippingAddressCity invalid length: {0}',
11023 => 'shippingAddressState invalid value: {0}, must
fit the pattern: \w\{2\} (e. g. "SP")',
11024 => 'Itens invalid quantity.',
11025 => 'Item Id is required.',
11026 => 'Item quantity is required.',
11027 => 'Item quantity out of range: {0}',
11028 => 'Item amount is required. (e.g. "12.00")',
11029 => 'Item amount invalid pattern: {0}. Must fit the patern: \d+.\d\{2\}',
11030 => 'Item amount out of range: {0}',
11031 => 'Item shippingCost invalid pattern: {0}.
Must fit the patern: \d+.\d\{2\}',
11032 => 'Item shippingCost out of range: {0}',
11033 => 'Item description is required.',
11034 => 'Item description invalid length: {0}',
11035 => 'Item weight invalid Value: {0}',
11036 => 'Extra amount invalid pattern: {0}. Must fit the patern: -?\d+.\d\{2\}',
11037 => 'Extra amount out of range: {0}',
11038 => 'Invalid receiver for checkout: {0}, verify receiver\'s account status.',
11039 => 'Malformed request XML: {0}.',
11040 => 'maxAge invalid pattern: {0}. Must fit the patern: \d+',
11041 => 'maxAge out of range: {0}',
11042 => 'maxUses invalid pattern: {0}. Must fit the patern: \d+',
11043 => 'maxUses out of range.',
11044 => 'initialDate is required.',
11045 => 'initialDate must be lower than allowed limit.',
73
Sistema de Vendas usando Pagseguro
Esses códigos numéricos se encontram no manual de uso da API do Pagseguro. Aqui eles foram
mantidos em sua versão original em idioma Inglês.
Abaixo finalizamos a página de erros reutilizando os arquivos criados para estruturar o layout de
todo o site. Nessa página o único código PHP existente usa a clausula $_GET para verificar se
existe um código numérico de erros sendo passado através da URL do site.
paginadeerro.php (continuação)
<?php include 'frontend_header.php'; ?>
<br />
<h3>Ocorreu um erro durante o processamento de sua compra com o Pagseguro. </h3><br />
74
Sistema de Vendas usando Pagseguro
confirmacao.php
<?php include 'frontend_header.php'; ?>
<br />
<h2>Confirmação</h2>
<p>
<i>* - Caso não receba mensagens em seu E-mail, verifique em sua caixa de span.</i>
</p>
75
Sistema de Vendas usando Pagseguro
Por exemplo, para uma loja hospedada em http://sualoja.com.br, um endereço que poderia ser
configurado para o envio de notificações é http://sualoja.com.br/notificacao.php.
O PagSeguro envia as notificações para a URL que você configurou usando o protocolo HTTP,
pelo método POST.
76
Sistema de Vendas usando Pagseguro
gera 1 ação –, já quando programamos em Java ou C# uma instrução programada pode gerar N
possibilidades de erro – pois 1 instrução em alto nível gera N ações. Ou como é costume dizer,
1 linha em código C equivale a 50 linhas em código Assembly.
PRIMEIRO: o Pagseguro lhe envia uma notificação com um código alfanumérico. Tal como:
766B9C-AD4B044B04DA-77742F5FA653-E1AB24
Esse código só vai ser útil se você tiver um cadastro no Pagseguro com um e-mail e um token
válido que lhe servem como autenticação. Mesmo que esse número seja enviado
erroneamente a uma pessoa qualquer ou outro site, essa pessoa não teria acesso a nenhuma
informação, pois ele precisaria ter o seu token e o seu e-mail.
SEGUNDO: De posse no código de notificação você deve fazer uma chamada a API do
Pagseguro informando o código que você acabou de receber, além do seu e-mail e o seu token.
O Pagseguro então vai verificar se aquele código esta realmente associado a sua conta e se ele
se refere a uma venda realizada em seu site. Se tudo estiver correto, o Pagseguro retorna um
arquivo XML com as informações referentes àquele código de notificação.
Resolvi por programar de forma estruturada para que o passo a passo fique fácil de entender
para qualquer pessoa em qualquer nível – visto que POO pode ser confusa para alguns.
77
Sistema de Vendas usando Pagseguro
pagseguro_notificacao.php
<?php
# DADOS DE CONFIGURAÇÕES
# ----------------------
# definindo configuração que serão usadas
$config = new stdClass ;
De posse do código de notificação, nosso segundo objetivo é obter mais informações sobre ele.
Faremos isso através de uma função que criaremos logo mais (psn_get_notification). Por
momento basta saber que essa função se conecta ao Pagseguro e retorna as informações sobre
a notificação em forma de um Array.
pagseguro_notificacao.php (continuação)
# 2. BASEADO NO CODIGO RECEBIDO, TENTAMOS OBTER MAIS INFORMAÇÕES
# --------------------------------------------------------------
# fazemos uma chamada ao pagseguro para saber mais informacoes
78
Sistema de Vendas usando Pagseguro
No código acima há também uma função chamada psn_log_message. Essa função serve para
registrar em log todos os eventos importantes para uma possível auditória futura.
pagseguro_notificacao.php (continuação)
# 3. BASEADO NA NOTIFICAÇÃO COMEÇAMOS A FAZER ATUALIZAÇÕES
# --------------------------------------------------------
# efetua ações para avisar o CMS o que esta
# acontecendo quanto ao status da venda
psn_updateStatus(
$_retorno['reference'],/* cod de ref para uso entre sistema e o pagseguro */
$_retorno['code'], /* codigo numerico que indica o status da transacao */
$_retorno['status'] /* descricao texto do status */
);
79
Sistema de Vendas usando Pagseguro
Com base na notificação recebida, são realizados processos para atualizar a venda dentro do
banco de dados. Primeiro, estamos atualizando o status da venda com a função
psn_updateStatus. Essa função grava no banco de dados a informação que informa se essa
venda foi quitada pelo cliente ou se ela foi cancelada. Por padrão, ela fica no status de
“Aguardando Pagamento”.
Se porventura o código retornado pelo Pagseguro no arquivo XML for igual a 7, então isso
indica que o cliente cancelou a compra. Sendo assim, você precisa tomar as medidas
necessárias para o cancelamento da compra dentro do seu sistema. Isso engloba obter as
informações sobre a venda, verificar quais produtos consta nela e retorna-los ao estoque para
que outros clientes possam compra-lo.
No arquivo XML retornado pelo Pagseguro, pode estar presente a informação shippingCost.
Essa informação é importante, pois ela indica se o cliente escolheu um método de envio da sua
compra, PAC, SEDEX, etc. Além de indicar o valor de envio dessa mercadoria.
E por fim, vamos construir as funções auxiliares que realizam o processo mais pesado.
pagseguro_notificacao.php (continuação)
/**
* Função para conexão ao servidor do PagSeguro
* via Curl.
*
* @access public
* @param type $url
* @param string $method GET com padrão
* @param array $data
* @param type $timeout 30
* @param type $charset ISO
* @return xml
*/
function psn_curl_connection(
$url, $method = 'GET', Array $data = null,
$timeout = 30, $charset = 'ISO-8859-1') {
80
Sistema de Vendas usando Pagseguro
} else {
$contentLength = null;
$methodOptions = Array(
CURLOPT_HTTPGET => true
);
}
$options = Array(
CURLOPT_HTTPHEADER => Array(
"Content-Type: application/x-www-form-urlencoded; charset=".$charset,
$contentLength
),
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_CONNECTTIMEOUT => $timeout,
//CURLOPT_TIMEOUT => $timeout
);
$curl = curl_init();
curl_setopt_array($curl, $options);
$resp = curl_exec($curl);
$info = curl_getinfo($curl);// para debug
$error = curl_errno($curl);
$errorMessage = curl_error($curl);
curl_close($curl);
if ($error) {
psn_log_message( $errorMessage );
return false;
} else {
return $resp;
}
}
A função acima foi obtida do próprio Pagseguro, e serve para se conectar ao servidor da UOL
através de uma URL e enviar informações para esse endereço.
pagseguro_notificacao.php (continuação)
/**
* Rece um código de notificação do Pagseguro, conecta-se
* ao servidor do pagseguro e retorna informações extras
* sobre essa notificação.
*
* @access public
* @param string - código de notificação enviado pelo Pagseguro.
* Algo como 766B9C-AD4B044B04DA-77742F5FA653-E1AB24
* @param string - email do cliente cadastrado no pagseguro
* @param string - token do cliente para autenticação
* @return array[code,status,reference,shippingType,shippingCost]
*/
81
Sistema de Vendas usando Pagseguro
function psn_get_notification(
$__notificationCode = null,
$__email = null,
$__token = null ) {
# ex: '
$url =
"https://ws.pagseguro.uol.com.br/v2/transactions/notifications/{$__notificationCode
}?email={$__email}&token={$__token}";
# conecta-se ao pagseguro
$transaction = psn_curl_connection($url);
return $retorno;
}
Psn_get_notification é a função principal e que esta responsável pelo maior número de ações.
Ela recebe como parâmetros o código da notificação, o e-mail e token da sua empresa no
Pagseguro e então cria uma URL que servirá de chamada para a API do Pagseguro. Em seguida,
82
Sistema de Vendas usando Pagseguro
solicita a conexão com o servidor da UOL, obtem os dados retornados na forma de XML e
converte ele para objeto. Por fim, gera e retorna um array com as informações da notificação.
pagseguro_notificacao.php (continuação)
/**
* Função usada para realizar log em arquivo texto
* para uma possivel auditoria.
*
* @param string|array - informação a ser logada
* @param string - error_|notification_ será o inicio do nome
* do arquivo de log gravado. ex: "notification_2007-05_"
* @return bool
*/
function psn_log_message( $__message = null, $__tipo = 'error_' )
{
# validações basicas da entrada recebida
if( is_null($__message) ) return false;
if( is_array($__message) ) $__message = implode(" - ", $__message);
if(!is_string($__message) ) return false;
pagseguro_notificacao.php (continuação)
/**
* Atualiza status de uma venda.
*
* -----------------------------
* Em SQL essa consulta equile a um :
* UPDATE vendas
* SET `status_venda` = '$status_venda',
83
Sistema de Vendas usando Pagseguro
* `status` = '$__notificationCode',
* `active` = 0
* WHERE `key` = '$key' ; ";
*-----------------------------
*
* @param string $key - valor unico que identifica uma venda
* @param int $__notificationCode - codigo numerico do status do pagseguro
* @param string $status_venda - frase do status
* @return bool
*/
function psn_updateStatus( $key = 0, $__notificationCode = 0, $status_venda =
"Aguardando pagamento" ) {
require_once 'database/database.php' ;
$_dados = array(
'status_venda' => $status_venda ,
'status' => $__notificationCode);
Agora entramos nas funções de atualização da base de dados. Elas serão responsáveis por
informar no seu sistema que uma venda teve o status alterado para Paga, Cancelada e etc.
Portanto, tenha cuidado e teste bastante essa função para garantir que não haja falhas.
pagseguro_notificacao.php (continuação)
/**
* Uma vez que o cliente pode escolher a forma de envio
* no ato do pagamento no Pagseguro. Você só sera informado
* sobre qual método o cliente escolheu, quando o Pagseguro
* lhe retornar uma notificação sobre essa escolha.
*
* Essa função serve para atualizar a tabela de vendas,
* e a coluna método de envio para o valor
* que o cliente escolheu.
*
* @param integer - referencia de uma venda
* @param string
* @param string $valor_envio [description]
* @return bool
*/
function psn_updateEnvio( $key = 0, $forma_envio = null, $valor_envio = '0.00' )
{
require_once 'database/database.php' ;
84
Sistema de Vendas usando Pagseguro
E por fim a nossa última função de atualização, psn_updateEnvio. Essa função é chamada
sempre que o status de envio da venda ao cliente muda. Uma vez que o cliente tem a opção de
escolher a forma de envio da mercadoria através do site do Pagseguro, você será notificado
assim que ele escolher uma das formas disponíveis.
Além da informação do tipo de envio, o Pagseguro lhe informa também o preço a ser pago no
serviço de envio. Assim que receber essa informação grave ela na tabela de vendas.
Bom, isso finaliza esse material. Tentei expressar todo processo de transação com o Pagseguro
da maneira mais clara possível. Caso tenha dúvidas ainda, sobre algum dos tópicos entre em
contato e expresse a sua opinião, pois ela é muito importante para o aprimoramento desse
material e de outros que serão escritos futuramente.
Sem mais,
O autor: Wanderlei Santana.
85