sexta-feira, 3 de junho de 2011

Carrinho de Compras - Parte 2.1 (Integração com PagSeguro do UOL - Retorno Automático)

Como eu tinha prometido vamos continuar com a série "Carrinho de Compras", quem não viu o primeiro post Carrinho de Compras - Parte 1 e Parte 2 recomendo dar uma olhada apenas para ter uma idéiade como nosso carrinho funciona e em que ponto estamos.

Ontem finalizamos o envio de dados para o PagSeguro do UOL e hoje (que rufem os tambores), vamos falar do Retorno Automático do PagSeguro.

Para isso, precisamos primeiro saber como ele funciona e definir nossa URL DE RETORNO e o TOKEN. Esse procedimento, tenta evitar dores de cabeça de pessoas comprando sem estar na sua loja. Como vimos ontem, o pagseguro, só pede um form com submit sem nenhum tipo de validação.

A validação acontece, quando o PagSeguro gera a "pergunta", que no caso chamamos de Retorno Automático. Uma observação, nesse caso seus testes devem ser online, pois vamos usar a session da sua aplicação para verificar e validar dos dados a serem confirmados com a URL de Retorno.

Para este processo vamos criar um novo componente e vamos chama-lo de PagSeguroRetorno.cfc. Este compoennte será usado na nossa página de retorno, e irá disparar ações de confirmação dos dados da compra.

PagSeguroRetorno.cfc
   1: <cfset Variable.COMMAND = "validar">
   2: <cfset Variables.VALIDATOR_URL = "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml">
   3: <cfset Variables.TOKEN = "SEU_TOKEN" />
   4: <cfset Variables.dsEmail = "EMAIL_CADASTRADO_PAGSEGURO" />
   5: <cfset Variables.result = structNew()>
Iniciamos o processo com nossas váriaveis que serão manipuladas pelo componente.

setReturn
   1: <cffunction name="setReturn" access="public" returntype="void" output="false">
   2:     <cfargument name="data" type="struct" required="true">
   3:     <cfset var arrForm = listToArray(arguments.data.FieldNames)>
   4:     <cfloop array="#arrForm#" index="currentItem">
   5:         <cfset Variables.result["#currentItem#"] = arguments.data[currentItem]>
   6:     </cfloop>
   7: </cffunction>
Criamos um método setReturn, que será responsável por receber o retorno do PagSeguro e manipular este resultado de acordo com nossa necessidade. Nesse momento, apenas nos preocupamos com guardar a informação. Para evitar um monte de linhas, realizamos um loop sobre a estrutura de dados recebida, guardando os dados na estrutura result.

confirm
   1: <cffunction name="confirm" access="public" returntype="void" output="false">
   2:     <cfhttp url="#VALIDATOR_URL#" method="get" resolveurl="false" charset="iso-8859-1">
   3:         <cfhttpparam name="Comando" type="url" value="#Variables.COMMAND#">
   4:         <cfhttpparam name="Token" type="url" value="#Variables.TOKEN#">
   5:         
   6:         <cfloop collection="variables.result" item="currentItem">
   7:             <cfhttpparam name="#currentItem#" type="url" value="#variables.result[currentItem]#">
   8:         </cfloop>
   9:     </cfhttp>
  10:     <cfswitch expression="#trim(cfhttp.FileContent)#">
  11:         <cfcase value="VERIFICADO">
  12:         <!--- Verifique se a TransacaoID não foi previamente processada --->
  13:         <!--- Verifique se o email recebido (VendedorEmail) é o seu email --->
  14:         <!--- Verifique se o valor do pagamento está correto --->
  15:         <!--- Processe o pagamento salvando os dados em seu banco de dados --->
  16:             <cfset FileWrite("#getDirectoryFromPath(expandPath('*.*'))#FORM_TRUE#DateFormat(Now(), 'yyyy-mm-dd-hh-mm-ss')#.htm", value)>
  17:         </cfcase>
  18:         <cfcase value="FALSO">
  19:             <!--- A Requisição não foi confirmada pelo PagSeguro e pode ser uma compra falsa --->
  20:             <cfset FileWrite("#getDirectoryFromPath(expandPath('*.*'))#FORM_FALSE#DateFormat(Now(), 'yyyy-mm-dd-hh-mm-ss')#.htm", value)>
  21:         </cfcase>
  22:     </cfswitch>
  23: </cffunction>
Finalmente, de posse dos dados, realizamos a confirmação. Para isso, enviamos um post com o comando Validar e nosso Token, junto com os dados da compra.

Lembrando que aqui estamos tratando de um exemplo, no mundo real, antes de informar a validação, verificamos o id da nossa transação no e-commerce e se o carrinho é igual ao que temos no site, para só então verificarmos se os dados conferem com a informação do PagSeguro, guardando as informações adicionais.

retornoPagSeguro.cfm
   1: <cfif structKeyExists(Form, "FieldNames")>
   2:     <cfset objPagSeguroReturn = createObject("component", "PagSeguroRetorno")>
   3:     <cfset objPagSeguroReturn.setReturn(form)>
   4:     <cfset objPagSeguroReturn.confirm()>
   5: </cfif>
Este código, deve ir na sua página de retorno, a mesma que você informou para o PagSeguro. Nesse momento, verificamos se recebemos algum retorno de POST e em seguida, iniciamos nosso componente PagSeguroRetorno.cfc informando o retorno que recebemos e confirmando a transação.

Bom é isso, espero ter ajudado alguém com este tutorial e agora só volto na próxima quarta-feira, falando da integração com Pagamento Digital do Buscapé.

E finalmente, para quem cansou de ler, esta tudo pronto para download no link http://www.flagnet.inf.br/downloads/shoppingCart-part2.1.rar

6 comentários:

  1. Mestre você é o cara, ótimo série, muito útil e ensinou muita coisa legal.
    Abraço.

    ResponderExcluir
  2. Bem didatico o tutorial Rafael, parabens!

    O sistema do pag-seguro tem a mesma estrutura do PayPal, claro, um pouco adaptada ao mercado brasileiro e com alguns termos "aportuguesados" ...

    Grande abraço,

    ResponderExcluir
  3. Tudo ótimo, mais a pergunta não quer calar. Como colocar tudo isso no blogspot.com ??

    Parabéns !!

    katya

    ResponderExcluir
    Respostas
    1. Katya, a única forma de usar o PagSeguro no blogspot é pelo método de HTML e ai todo o processo fica manual. No site do pag seguro tem um tutorial de como montar o HTML para a integração funcionar

      Excluir
  4. Boa tarde Rafael..to precisando de sua ajuda...estou com dificuldade no arquivo de retorno do PagSeguro. Eu passo via Post as informações e consigo efetuar o pagamento. Na tabela tenho um campo tipo bit "Pago" que preciso atualizar para sim. A consulta na query é condicionada pelo valor do "form.reference". O PagSeguro diz que me retorna essas informações em XML, mas não sei como capturar os dados do XML.

    ResponderExcluir