<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GustavoHenrique.net &#187; Webservices</title>
	<atom:link href="http://blog.gustavohenrique.net/tag/webservices/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gustavohenrique.net</link>
	<description>Tecnologia e Software Livre</description>
	<lastBuildDate>Wed, 25 Jan 2012 10:34:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Integrando PagSeguro com Django</title>
		<link>http://blog.gustavohenrique.net/2009/07/integrando-pagseguro-com-django/</link>
		<comments>http://blog.gustavohenrique.net/2009/07/integrando-pagseguro-com-django/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 16:57:09 +0000</pubDate>
		<dc:creator>gustavohenrique</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[PagSeguro]]></category>
		<category><![CDATA[urllib]]></category>
		<category><![CDATA[Webservices]]></category>

		<guid isPermaLink="false">http://www.gustavohenrique.net/brogui/?p=113</guid>
		<description><![CDATA[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: [...]]]></description>
			<content:encoded><![CDATA[<p>Nesse artigo mostrarei de uma maneira rápida e resumida como integrar o meio de pagamento <a href="http://www.pagseguro.com.br" target="_blank">PagSeguro</a> à 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 <a href="http://www.pagamentodigital.com.br" target="_blank">Pagamento Digital</a>.<br />
<span id="more-113"></span></p>
<h2>INTRODUÇÃO</h2>
<p>O funcionamento da integração com o PagSeguro é simples:</p>
<ol>
<li>Preenchimento do form com dados do pedido:<br />
      Uma view do site renderiza um template contendo um form com campos ocultos (input type=&#8221;hidden&#8221;) preenchidos com dados sobre o pedido.
  </li>
<li>Envio dos dados à URL do pagseguro:<br />
      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.
  </li>
<li>Envio dos dados sobre a transação:<br />
      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.
  </li>
</ol>
<p>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).<br />
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.</p>
<h2>MÃO NA MASSA</h2>
<p>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.<br />
No momento apenas será descrito como verificar a autenticidade da transação.</p>
<p>Vamos criar uma app chamada utils. Dentro do diretório dessa app, criamos o arquivo pagamentolib.py.</p>
<pre>
$ python manage.py startapp utils
$ vim utils/pagamentolib.py
</pre>
<p>Eis o código do pagamentolib.py:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>, <span style="color: #dc143c;">urllib</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponse
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Pagamento<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _conectar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, url, params<span style="color: black;">&#41;</span>:
        query_str = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span>params<span style="color: black;">&#41;</span>
        req = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>url, query_str<span style="color: black;">&#41;</span>
        f = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>req<span style="color: black;">&#41;</span>
        conteudo = f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> conteudo
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _enviar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, url, params<span style="color: black;">&#41;</span>:
        retorno = <span style="color: #008000;">self</span>._conectar<span style="color: black;">&#40;</span>url, params<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> retorno.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'verificado'</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PagSeguro<span style="color: black;">&#40;</span>Pagamento<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> processar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">token</span>, params, url=<span style="color: #483d8b;">'https://pagseguro.uol.com.br/Security/NPI/Default.aspx'</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> params:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            lista = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> key <span style="color: #ff7700;font-weight:bold;">in</span> params.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                lista.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>key,params<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            lista.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Comando'</span>, <span style="color: #483d8b;">'validar'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            lista.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Token'</span>, <span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._enviar<span style="color: black;">&#40;</span>url, lista<span style="color: black;">&#41;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">views</span>.<span style="color: black;">generic</span>.<span style="color: black;">simple</span> <span style="color: #ff7700;font-weight:bold;">import</span> direct_to_template
<span style="color: #ff7700;font-weight:bold;">from</span> meuprojeto.<span style="color: black;">utils</span>.<span style="color: black;">pagamentolib</span> <span style="color: #ff7700;font-weight:bold;">import</span> PagSeguro
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> concluir<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    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.
    &quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> request.<span style="color: black;">method</span> == <span style="color: #483d8b;">'POST'</span>:
        <span style="color: #808080; font-style: italic;"># token gerado no painel de controle do PagSeguro</span>
        <span style="color: #dc143c;">token</span> = <span style="color: #483d8b;">'12345699CA2AAAF4599EA697BB2F7FFF'</span>
        p = PagSeguro<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        retorno = p.<span style="color: black;">processar</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">token</span>, request.<span style="color: black;">POST</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> retorno == <span style="color: #008000;">True</span>:
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                <span style="color: #808080; font-style: italic;"># Cadastra os dados recebidos no banco de dados.</span>
                <span style="color: #808080; font-style: italic;"># Utilize o request.POST.get('nomedocampo') para obter os valores</span>
            <span style="color: #ff7700;font-weight:bold;">except</span>:
                <span style="color: #ff7700;font-weight:bold;">pass</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponse<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Ok'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponse<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Error'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #808080; font-style: italic;"># Carrega tela contendo a mensagem de compra realizada</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> direct_to_template<span style="color: black;">&#40;</span>request,<span style="color: #483d8b;">'carrinho/concluir.html'</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>SERVIDOR DE TESTE</h2>
<p>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.</p>
<ol>
<li>
Faça o download em: <a href="http://visie.com.br/pagseguro/pagseguro_testserver_v0.21.zip" target="_blank">http://visie.com.br/pagseguro/pagseguro_testserver_v0.21.zip</a> e Descompacte em qualquer diretório.
</li>
<li>
Entre no diretório <code>pagseguroMockup</code>, edite o arquivo <code>settings.py</code> e altere o valor da variável <code>retornourl</code> para sua URL de retorno em ambiente de teste. Altere também dentro do arquivo <code>pagseguro.py</code> na linha 77 onde está &#8216;ProdId&#8217; por &#8216;ProdID&#8217;.
</li>
<li>
Insira a linha <code>127.0.0.1	pagseguro.uol.com.br	pagseguro</code> no arquivo <code>/etc/hosts</code>. Agora basta executar o comando <code>sudo python PagSeguroServer.py</code> para iniciar o servidor de testes. Ctrl + C para sair.
</li>
</ol>
<h2>CONCLUSÃO</h2>
<p>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.<br />
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.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gustavohenrique.net/2009/07/integrando-pagseguro-com-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

