Integrando PagSeguro com Django

Nesse artigo mostrarei de uma maneira rápida e resumida como integrar o meio de pagamento PagSeguro à uma loja virtual com carrinho próprio. O código é simples e pode ser adaptado para o uso com outros serviços de pagamento como por exemplo o Pagamento Digital.

INTRODUÇÃO

O funcionamento da integração com o PagSeguro é simples:

  1. Preenchimento do form com dados do pedido:
    Uma view do site renderiza um template contendo um form com campos ocultos (input type=”hidden”) preenchidos com dados sobre o pedido.
  2. Envio dos dados à URL do pagseguro:
    O form é submetido via POST para a URL do PagSeguro que recebe os dados do pedido e exibe a tela de escolha da forma de pagamento.
  3. Envio dos dados sobre a transação:
    Após o comprador escolher a forma de pagamento, o robô do PagSeguro envia em segundo plano um POST para a URL de retorno configurada pelo vendedor no site do PagSeguro. Em seguida redireciona o comprador para essa mesma URL de retorno.

A parte mais complicada é no passo 3, onde ocorre a comunicação em segundo plano (invisível ao usuário, não aparece no browser).
O robô do PagSeguro envia um POST para a URL de retorno definida pelo vendedor. Então é preciso verificar nessa URL se houve alguma requisição via POST. Então o método da view envia uma requisição ao PagSeguro, também em segundo plano, contendo os mesmos dados obtidos via POST e um código único (token) definido no painel de configuração da conta no site do PagSeguro. Após verificado a autenticidade da transação, os dados são armazenados no banco de dados para que o cliente possa acompanhar o status do pedido diretamente no seu site.

MÃO NA MASSA

Não será abordado quais campos e tipos de dados que devem ser enviados ao PagSeguro. Essas informações estão bem documentadas no site do mesmo.
No momento apenas será descrito como verificar a autenticidade da transação.

Vamos criar uma app chamada utils. Dentro do diretório dessa app, criamos o arquivo pagamentolib.py.

$ python manage.py startapp utils
$ vim utils/pagamentolib.py

Eis o código do pagamentolib.py:

# -*- coding: utf-8 -*-
 
import sys
import urllib2, urllib
from django.http import HttpResponse
 
 
class Pagamento(object):
 
    def _conectar(self, url, params):
        query_str = urllib.urlencode(params)
        req = urllib2.Request(url, query_str)
        f = urllib2.urlopen(req)
        conteudo = f.read()
        f.close()
        return conteudo
 
    def _enviar(self, url, params):
        retorno = self._conectar(url, params)
        if retorno.lower() == 'verificado':
            return True
        else:
            return False
 
 
class PagSeguro(Pagamento):
    def processar(self, token, params, url='https://pagseguro.uol.com.br/Security/NPI/Default.aspx'):
        if not params:
            return False
        else:
            lista = []
            for key in params.keys():
                lista.append((key,params[key]))
            lista.append(('Comando', 'validar'))
            lista.append(('Token', token))
 
            return self._enviar(url, lista)

Como exemplo, nossa URL de retorno é http://www.seusite.com/concluir/, que chama o método concluir contido na app carrinho

# -*- coding: utf-8 -*-
 
from django.views.generic.simple import direct_to_template
from meuprojeto.utils.pagamentolib import PagSeguro
 
def concluir(request):
    """
    Descricao:
    Armazena os dados do pedido e exibe a tela de pedido concluido.
    Verifica se o robo do PagSeguro enviou os dados do pedido via POST, e
    então armazena no banco de dados.
    Por fim, exibe a tela de pedido concluido com sucesso.
    """
 
    if request.method == 'POST':
        # token gerado no painel de controle do PagSeguro
        token = '12345699CA2AAAF4599EA697BB2F7FFF'
        p = PagSeguro()
        retorno = p.processar(token, request.POST)
 
        if retorno == True:
            try:
                # Cadastra os dados recebidos no banco de dados.
                # Utilize o request.POST.get('nomedocampo') para obter os valores
            except:
                pass
            return HttpResponse('Ok')
        else:
            return HttpResponse('Error')
 
    else:
        # Carrega tela contendo a mensagem de compra realizada
        return direct_to_template(request,'carrinho/concluir.html')

SERVIDOR DE TESTE

No site da Visie (empresa parceira do PagSeguro) está disponível para download uma aplicação feita em python que simula o servidor do PagSeguro. Com esse servidor de testes é possível verificar se a integração está enviando e recebendo os dados corretamente. É um servidor semelhante ao que acompanha o Django.

  1. Faça o download em: http://visie.com.br/pagseguro/pagseguro_testserver_v0.21.zip e Descompacte em qualquer diretório.
  2. Entre no diretório pagseguroMockup, edite o arquivo settings.py e altere o valor da variável retornourl para sua URL de retorno em ambiente de teste. Altere também dentro do arquivo pagseguro.py na linha 77 onde está ‘ProdId’ por ‘ProdID’.
  3. Insira a linha 127.0.0.1 pagseguro.uol.com.br pagseguro no arquivo /etc/hosts. Agora basta executar o comando sudo python PagSeguroServer.py para iniciar o servidor de testes. Ctrl + C para sair.

CONCLUSÃO

O que foi mostrado nesse artigo também serve com base para comunicação com webservices de outros serviços de pagamento on-line. Eu aconselho a quem estiver pensando em desenvolver um e-commerce que utilize algum serviço desse tipo a não se prender em apenas um. Deixem pré-configurado uma segunda alternativa caso venha a ter problemas com a primeira.
Fiquei decepcionado quando não encontrei exemplos em Python no site do PagSeguro. Na minha opinião, se uma empresa disponibiliza um webservice e ganha sobre isso, deveria investir melhor na documentação e principalmente no suporte.

You can leave a response, or trackback from your own site.

2 Responses to “Integrando PagSeguro com Django”

  1. Chrystiano Araújo disse:

    Fala Gustavo…
    Mais uma vez, parabéns pelo post.
    Testarei assim que possível.

    Abraço

  2. Rafael Henter disse:

    Bom Post bem documentado e pratico.

    Parabens.

Leave a Reply

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card