DGmike

DGmike

Calma! não entre em pânico! Amanhã (talvez) tem novo post…

  • Alice Andrade
  • Rafael Zamana
Você está aqui: dgmike » Arquivos para pagamento

  • Home
  • Guia Rápido jQuery
  • Códigos prontos
    • PHP: Função __auloload()
    • Classe sqlsimples e sql – PHP
    • Bancos, bancos e mais bancos…
  • PagSeguro
  • Artigos
    • JavaScript (parte 1)
  • Quem é dgmike?

Verifique o retorno automático, sempre!

Posted in pagseguro, php by DGmike
Oct 07 2009
TrackBack Address.

Você já deve ter ouvido falar no Retorno Automático de dados do PagSeguro. Com ele você consegue sincronizar os dados de sua loja com os dados em suas transações no PagSeguro. O que é interessantíssimo pois com ele não precisamos ficar verificando cada e-mail que chega do PagSeguro e atualizando o nosso banco de dados.

** nota: Que fique claro que neste POST falo sobre carrinho próprio

Basicamente, uma aplicação funciona assim: Você monta uma compra e grava-a no seu banco de dados. Tomemos como exemplo duas chupetas doces no valor de R$ 3,40. Isto gerará uma compra no valor de R$ 6,80. Então, com isso montamos um formulário de pagamento que fará um POST para o PagSeguro.

Quando fizer isso, use um código de referencia para essa compra, se você usa auto_increment no seu banco de dados fica a dica para usar esse campo como código único, mas você pode gerar um número único baseado na data/hora atual mais um número aleatório. Em PHP você pode usar o método uniqid para isto.

O seu formulário ficará mais ou menos assim:

1
2
3
4
5
6
...
<input type="hidden" name="referencia" value="codigo_unico_de_compra" />
...
<input type="hidden" name="valor" value="340" />
<input type="hidden" name="quant" value="2" />
<input type="hidden" name="descr" value="chupeta doce" />

O que acontece?

Quando o comprador efetuar uma ação na compra, se você configurar e ativar uma URL de retorno automático no seu painel do PagSeguro, você receberá todos os dados da compra, inclusive o status da compra. A URL que você configurar como retorno automático é a mesma para a qual o usuário será redirecionado após o termino da transação no PagSeguro, seja ela emissão de boleto, pagamento via cartão de crédito ou débito ou mesmo transação entre contar PagSeguro.

Assim, você pode usar o código de referencia para saber a qual compra você vai atualizar. Mas, se é a mesma URL, como eu sei quem é o retorno automático? O retorno automático é um POST, a volta do usuário é GET. Um código bem simples em PHP para atualizar se assemelha bastante a este:

1
2
3
4
5
6
7
<?php
if ($_POST) {
  $compras = new Compras;
  $compras->get($_POST['Referencia']);
  $compras->set('status', $_POST['StatusTransacao']);
  die('Esta mensagem somente sera vista pelo robo do PagSeguro.');
}

Simples, né?! Mas o mundo não é perfeito, ainda mais na internet, então devemos nos prevenir de crackers (hackers malvados =P ). Imagine se eu efetuo uma compra e não pago. Então crio um formulário apontando para a URL de retorno à qual fui redirecionado com o StatusTransacao como Aprovado? Sim caro leitor, a pessoa efetua a compra sem pagar.

Pensando nisso, o PagSeguro fez um robôzinho onde você pode verificar se quem mandou o POST realmente foi ele. Funciona assim: Ao receber o POST, envie um POST para o robô e leia a saída. É como se você escrevesse um formulário direcionado para a URL de verificação de POST do PagSeguro e visse a página, ela deve aparecer como um arquivo de texto escrito VERIFICADO ou FALSO, caso os dados não batam com os dados contidos no PagSeguro.

Mas, para que a segurança seja maior, você deve enviar junto com todos os dados do PagSeguro os campos “Comando” com o valor “Verificar” e o campo “Token” com o código gerado no painel de controle do PagSeguro. Se você não enviar esses valores, o PagSeguro retornará FALSO, afinal, ele também verifica se você é você usando esse token que só você e o PagSeguro conhecem.

Em PHP você pode usar cURL para verificar esse POST, o código não é tão complicado de implementar assim. Apenas deve verificar que a URL do robô é https e que você está enviando um POST, então flags especiais devem ser usadas. Se você quiser, também pode usar a biblioteca PHP para PagSeguro desenvolvida pela visie que já faz essa verificação para você, apenas precisando que você faça a sua função como se não precisasse verificar nada.

A grosso modo, podemos alterar o nosso código para o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
define('TOKEN','código gerado no painel de controle do PagSeguro'); # Aqui vai seu Token
include('retorno.php'); # Incluindo o arquivo da biblioteca

function retorno_automatico ( $VendedorEmail, $TransacaoID, 
  $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao,
  $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, 
  $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) {
    # E aqui, o nosso código
    $compras = new Compras;
    $compras->get($_POST['Referencia']);
    $compras->set('status', $_POST['StatusTransacao']);
    die('Esta mensagem somente sera vista pelo robo do PagSeguro.');
}

Ok, nosso mundo mudou bastante, colocamos proteção para o nosso cracker e ele vai ter um pouco mais de trabalho. Mas ainda temos um problema, quer dizer, uma solução… que gerou um problema: firebug.

Como todos nós estamos carecas de saber, o formulário que enviamos ao PagSeguro é um html normal que pode ser alterado de diversas formas, inclusive alterar os valores. Então, imaginemos o seguinte ambiente: você tem uma loja onde o usuário compra uma máquina de lavar por R$ 1.200,00. Para aproveitar mais ainda, ele compra três máquinas. Então ele chega no checkout e altera o formulário final para 5000, ou seja, R$ 50,00. Então ele pagará muito mais barato pela máquina, certo? Certo!

Certo?! Como assim?

Sim, ele vai pagar mais barato, porque burlou o sistema, cabe a você ter tino e devolver o dinheiro do infeliz. Mas calma! Você não precisa verificar todas as contas na mão para saber se a pessoa está burlando o sistema. Basta você conferir o valor do POST de retorno com o valor da compra.

Lembra que gravamos a compra no banco antes de enviar o comprador para o PagSeguro usando um código único? Coloque também o valor total da compra. Quando você receber o POST do retorno automático, verifique o valor da compra pois se a pessoa alterar o valor do input com a firebug (ou similar) o sistema saberá que não é válido. Veja como fica o nosso código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
define('TOKEN','código gerado no painel de controle do PagSeguro'); # Aqui vai seu Token
include('retorno.php'); # Incluindo o arquivo da biblioteca

function retorno_automatico ( $VendedorEmail, $TransacaoID, 
  $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao,
  $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, 
  $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) {
    # E aqui, o nosso código
    $total = 0;
    foreach ($produtos as $produto) {
      $total += ($produto['ProdValor'] * $produto['ProdQuantidade']) + $produto['ProdFrete'] + $produto['ProdExtras'];
    }
    if ($total == $compras->total) {
      $compras = new Compras;
      $compras->get($Referencia);
      $compras->set('status', $StatusTransacao);
    }
    die('Esta mensagem somente sera vista pelo robo do PagSeguro.');
}

Simples assim! Apenas pegamos todos os produtos e somamos o produto de seus valores pelas suas respectivas quantidades, aliado aos valores extras e de frete. Quanto mais campos você verificar no retorno automático, melhor. Mas não exagere pois poderá falhar em alguns casos. Por exemplo você pode enviar um e-mail para o PagSeguro e a pessoa decidir pagar com outra conta (da esposa ou da empresa, por exemplo).

4 Comments »
Tagged as: explicação, pagamento, pagseguro, php, Programação, retorno automático, segurança, tutoriais, Tutorial

PHP+PagSeguro = Loja virtual de downloads

Posted in Programação, Tecnologia, Trabalho, Tutorial, jQuery, javascript, pagseguro, php, sql by DGmike
Apr 20 2009
TrackBack Address.

Voltamos a um assunto que interessa muitas pessoas: ganhar dinheiro. Talvez você não tenha nada físico para vender, mas você provavelmente tem talento (não, chocolate não) e sabe escrever um bom livro ou mesmo fazer ótimas fotografias[bb]. Você pode não saber, mas dá pra ganhar dinheiro com esse seu talento. Por que você não começa a vender arquivos para download? Sim! Por que não?! Comece a explorar o seu lado criativo e faça de seus dons uma forma de fazer lucros.

Crie uma loja virtual. Você pode começar com uma loja poderosa como o Magento ou mesmo uma coisa mais simples como OsCommerce, Joomla o mesmo WordPress. Mas, se você é programador como eu e prefere escrever seu próprio código ou mesmo entender como o sistema de sua loja (ou loja de seus clientes) funcionará, farei uma série de artigos para demonstrar como é simples criar uma loja virtual[bb] cujos produtos não são nada além de links para download.

Loja virtual com PagSeguro? Agora ficou fácil!

Loja virtual com PagSeguro? Agora ficou fácil!

Para você conseguir acompanhar este “curso” você deve entender um pouco dos seguintes assuntos:

  • PagSeguro: Vamos usar esta ferramenta de pagamento online para que nossos clientes se sintam seguros ao comprar em sua loja, então você já pode criar sua conta para podermos fazer a nossa loja virtual
  • PHP: Não precisa ser um expert, mas saber conceitos básicos de banco de dados e orientação a objetos já dão um gás
  • MySQL: Vamos trabalhar com a dobradinha mais conhecida da Web. Não usaremos o MySQL ao extremo mas iremos fazer um join ou outro
  • Ânimo: muitas vezes você irá errar. Podem ser erros básicos como não colocar um ponto-e-virgula/ no seu script, então não desanime e continue em frente

Ok, com os requisitos em mãos vamos por a mão na massa. A começar pela estruturação do nosso banco de dados.

O banco de dados

Vamos precisar basicamente de duas tabelas para organizar os produtos: categorias, produtos. Elas são descritas pelas seguintes queries:

CREATE TABLE `categoria` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `slug` VARCHAR(45) NOT NULL,
  `titulo` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`id`)
);
 
CREATE TABLE `produto` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `categoria_id` INTEGER UNSIGNED NOT NULL,
  `slug` VARCHAR(45) NOT NULL,
  `titulo` VARCHAR(100) NOT NULL,
  `descricao` TEXT NOT NULL,
  `valor` FLOAT NOT NULL,
  `url` VARCHAR(32) NOT NULL,
  `imagem` CHAR(32) NOT NULL,
  PRIMARY KEY (`id`)
);

Usaremos os campos “slug” tanto de categoria quanto de produto para a url na loja virtual ficar mais fácil de enteder, é o que chamamos de URLs amigáveis. Repare também que temos “categoria_id” na tabela de produto, é nela que vamos basear a nossa organização, um produto deve ter uma categoria e uma categoria pode ter diversos produtos. Os campos de url e imagem da tabela de produtos conterá o endereço do arquivo físico (o arquivo que o usuário fará o download) e a imagem que aparecerá na loja virtual respectivamente. Eles receberão uma criptografia para a segurança de sua loja, usarei md5 como criptografia.

Muito bem, não vamos nos prender a criação de usuários no nosso sistema. Por quê?! Porque você realmete não precisa disso na sua loja. Se um usuário compra de sua loja ele terá os seus dados no PagSeguro, afinal, ele vai pagar por lá não é mesmo? Então para quê ter dados repetidos no seu sistema? Não vamos fazer também um sistema de login, tenho em mente que você é um programador experto e já sabe fazer isso de olhos fechados. Vamos colocar um sistema de login no nosso sistema sim, claro, mas com um usuário único e uma senha única. Isso para não perdermos o foco da loja virtual.

A outra tabela que iremos precisar é a tabela de compra, nela teremos a compra de cada usuário, assim poderemos reenviar um e-mail ao usuário com os links para onde ele pode efetuar o download dos produtos que ele comprou. Esta tabela também serve para sabermos que o produto foi enviado ao cliente, digo, a data de envio do e-mail. Essa tabela é regida pelo seguinte SQL.

CREATE TABLE `compra` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(100),
  `produtos` TEXT NOT NULL,
  `transacao_id` VARCHAR(45),
  `status` VARCHAR(45) NOT NULL,
  `data_confirmacao` DATETIME NOT NULL,
  PRIMARY KEY (`id`)
);

Veja que produtos é um campo do tipo do tipo TEXT, nele vamos gravar os ids contidos na tabela produto, separados por virgula. Os campos transacao_id, status e data_confirmacao serão completados ao receber o retorno do PagSeguro.

Com isso já temos as tabelas básicas necessárias para a criação de nossa loja virtual. Fique ligado para a próxima parte dessa série onde vamos montar uma loja virtual voltada para downloads.

  • Campo DataTransacao no retorno do PagSeguro
  • Palestra PagSeguro na Impacta
  • Verifique o retorno automático, sempre!
  • [PagSeguro] O campo status
  • O PagSeguro mudou a URL de retorno automático, e agora?

7 Comments »
Tagged as: criatividade, dinheiro, ecommerce, joomla, loja virtual, magento, mysql, oscommerce, pagamento, pagseguro, php, talento, visie, wordpress

Campo DataTransacao no retorno do PagSeguro

Posted in Dia-a-dia, pagseguro by DGmike
Apr 03 2009
TrackBack Address.

Algumas vezes algumas pessoas me perguntam sobre o campo DataTransacao quando trabalhamos com boletos? Qual data vem nesse campo? A data em que o boleto foi emitido? A data em que o status foi alterado? Ou a data em que o POST foi enviado para você. (se quiser uma explicação sobre o que é esse tal de POST ou como funciona o PagSeguro, aconselho a ler meu artigo escrito no forum do iMasters)

No PagSeguro, o Boleto você pode gerar boletos para seus clientes de forma segura, mas atente para a data de compensação desse boleto. Nem você nem seu cliente querem erros nessas datas

No PagSeguro, o Boleto você pode gerar boletos para seus clientes de forma segura, mas atente para a data de compensação desse boleto. Nem você nem seu cliente querem erros nessas datas

Claro que isso é uma preocupação muito grande para quem trabalha com créditos que dependem da data em que a pessoa efetuou o pagamento. Cinco dias corridos de acesso a partir do pagamento por exemplo.

Então fui procurar uma resposta em meu log de dados, eis que me deparo com dois casos e verifiquei a seguinte sequencia de pagamentos via boletos (os IDs das tranações foram alterados para segurança dos clientes):

//-
Thu Apr 2 21:04:17 2009

‘StatusTransacao’: ‘Aguardando Pagto’,
‘DataTransacao’: ‘02/04/2009 21:08:58‘,
‘TipoPagamento’: ‘Boleto’,
‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXA’,

Fri Apr 3 06:27:04 2009

‘StatusTransacao’: ‘Aprovado’,
‘DataTransacao’: ‘02/04/2009 21:08:58‘,
‘TipoPagamento’: ‘Boleto’,
‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXA’,
-//

//-
Thu Apr 2 11:04:38 2009

‘StatusTransacao’: ‘Aguardando Pagto’,
‘DataTransacao’: ‘02/04/2009 11:09:18‘,
‘TipoPagamento’: ‘Boleto’,
‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXB’,

Fri Apr 3 06:02:47 2009

‘StatusTransacao’: ‘Aprovado’,
‘DataTransacao’: ‘02/04/2009 11:09:18‘,
‘TipoPagamento’: ‘Boleto’,
‘TransacaoID’: ‘XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXB’,
-//

Como podemos perceber, o campo “DataTransacao” não é alterado e provavelmente se refere à data em que a compra foi efetuada, logo aconselho a alterar a data do seu banco de dados com a data atual do sistema. Em mysql você pode usar NOW() (faz um “SELECT NOW()” para ver o que estou falando).

Abraços, espero que isso retire a dúvida de uma ou duas pessoas =D

1 Comment »
Tagged as: aplicar, banco de dados, boleto, data, dinheiro, e-commerce, loja, loja virtural, mysql, pagamento, pagseguro, php, postgree, retorno, retorno automático, simples

Categorias

  • Amigos  (16)
  • cases  (4)
  • Cotidiano  (73)
  • CSS  (20)
  • Design  (2)
  • Dia-a-dia  (33)
  • Diversão  (18)
  • eventos  (10)
  • extensions  (11)
  • flash  (4)
  • Games  (1)
  • html  (7)
  • icephp  (4)
  • Ilustração  (6)
  • Imagem  (8)
  • Inspiração  (5)
  • javascript  (36)
    • jQuery  (7)
    • yui  (2)
  • Não categorizado  (26)
  • Navegadores  (19)
    • Chrome  (6)
    • Firefox  (18)
    • Internet Explorer  (6)
  • pagseguro  (12)
  • php  (43)
    • PHP Conference  (3)
  • plugin  (3)
  • Programação  (46)
  • python  (5)
  • Semântica  (16)
  • sql  (9)
  • tableless  (18)
  • Tecnologia  (48)
  • Trabalho  (28)
  • Tutorial  (25)
  • Vetorial  (5)
  • video  (8)
  • video-tutorial  (5)
  • Windows  (4)
  • wordpress  (2)
  • xHTML  (23)

Tags

ajax artigo banco de dados biblioteca blog browser classe CSS data Design Dia-a-dia dinheiro evento eventos Firefox framework google html icephp internet Internet Explorer javascript jQuery loja mysql online opera pagseguro palestra php plugin Programação python retorno automático simples site solução sql tableless Tecnologia Tutorial twitter visie web wordpress

Arquivo

SlideSare

Últimos Posts

  • Vírgula em html5 e css3
  • Youtube e HTML5, agora ficou mais fácil
  • Novo emprego!
  • Até mais e obrigado pela salada
  • Api de teste do meadiciona.com

Tags

ajax artigo banco de dados biblioteca blog browser classe CSS data Design Dia-a-dia dinheiro evento eventos Firefox framework google html icephp internet Internet Explorer javascript jQuery loja mysql online opera pagseguro palestra php plugin Programação python retorno automático simples site solução sql tableless Tecnologia Tutorial twitter visie web wordpress

Conteúdo

  • Artigos
    • JavaScript (parte 1)
  • Códigos prontos
    • Bancos, bancos e mais bancos…
    • Classe sqlsimples e sql – PHP
    • PHP: Função __auloload()
  • Guia Rápido jQuery
  • PagSeguro
  • Quem é dgmike?
PagSeguro Powered by WordPress | “Blend” from Spectacu.la WP Themes Club