Este final de semana precisei implementar um sistema web com PagSeguro usando ASP. Acontece que a biblioteca atual, desenvolvida por um colega da visie, não possui um feedback em log para saber o que está acontecendo no servidor. Portando, o usuário fica sem saber se realmente o código que ele implementou está funcionando com o PagSeguro.
Chegou até mim um report de erro sobre a linha 55 do arquivo de retorno automático do PagSeguro para ASP:
55 | if Request.Form.count > 0 then |
Dizendo que o problema era que Request.Form.Count sempre dava zero. Tive uma idéia do que era, mas como sou programador, precisei fazer testes e comprovar minha teoria. Bom, mão à obra!
Como sou usuário de linux assíduo e não estava com vontade nenhuma de formatar meu notebook apenas para fazer testes, precisei procurar um hosting de ASP gratuito. Me deparei com o somee.com e criei minha conta onde comecei a escrever algumas linhas de html. O formulário do Carrinho Próprio para ser mais exato.
Logo logo chegou a hora de experimentar o retorno automático. Bom, não conheço a fundo a sintaxe da linguagem ASP, procurei saber o que estava acontecendo com base na biblioteca PagSeguro desenvolvida pela Visie. Percebi que seria difícil pois a mesma não gravava log do que acontecia. Então fui procurar como fazer para escrever um arquivo de texto na linguagem. Após alguns minutos fazendo pesquisa na internet me deparei com uma função que adaptei para meu caso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <% function WriteToFile(Contents, Append) on error resume next if Append = true then iMode = 8 else iMode = 2 end if ' A proxima linha é referente ao local do arquivo de log, altere aqui FileName = "D:\caminho\para\o\meu\log.txt" set oFs = server.createobject("Scripting.FileSystemObject") set oTextFile = oFs.OpenTextFile(FileName, iMode, True) oTextFile.Write Contents & vbCrLF oTextFile.Close set oTextFile = nothing set oFS = nothing end function %> |
Depois, apenas fiz um include e alterei um pouco a biblioteca, afim de gravar no log a informação necessária:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | <% ' Primeiro, fiz o include do arquivo do gravalog.asp %> <!--#include file="gravalog.asp"--> <% response.ContentType = "text/HTML" response.Charset = "ISO-8859-1" ' Log para informar que alguém chegou na página, seja usuário ou robo do PagSeguro WriteToFile "Chegou ate a url de retorno.asp", True Dim TOKEN 'TOKEN = "cole aqui o token do vendedor" timeout = 20 'Timeout em segundos function notificationPost() postdata = "Comando=validar&Token=" & TOKEN For each x In Request.Form valued = clearStr(request.Form(x)) postdata = postdata & "&" & x & "=" & valued Next notificationPost = verify(postdata) end Function function clearStr(str) str = replace(str, "'","\'") clearStr = str end function function verify(data) strUrl = "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml" Set xmlHttp = Server.Createobject("MSXML2.ServerXMLHTTP") xmlHttp.Open "POST", strUrl, False xmlHttp.setRequestHeader "User-Agent", "asp httprequest" xmlHttp.setRequestHeader "content-type", "application/x-www-form-urlencoded" xmlHttp.setRequestHeader "content-length", Len(data) xmlHttp.Send(data) retorno = xmlHttp.responseText xmlHttp.abort() set xmlHttp = Nothing verify = retorno end function ' Nesta área, mandei gravar os dados de GET para saber o que está acontecendo WriteToFile "Dados recebidos:", True WriteToFile "GET", True WriteToFile Request.Querystring, True ' Agora, gravando os dados que chegaram via POST postdata = "" For each x In Request.Form valued = clearStr(request.Form(x)) postdata = postdata & "&" & x & "=" & valued Next WriteToFile "POST", True WriteToFile "Total de fields: " & Request.Form.Count, True WriteToFile postdata, True if Request.Form.count > 0 then result = notificationPost() if Request.Form("TransacaoID") <> empty then transacaoID = Request.Form("TransacaoID") Else transacaoID = "" end If ' Agora ficou fácil, se chegou via POST, o script irá verificar se ele veio do PagSeguro ' e gravará no log VERIFICADO ou FALSO WriteToFile result, True WriteToFile "", True WriteToFile "---", True WriteToFile "", True if result = "VERIFICADO" then 'O post foi validado pelo PagSeguro. elseif result = "FALSO" then 'O post não foi validado pelo PagSeguro. else 'Erro na integração com o PagSeguro. end if else ' POST não recebido, indica que a requisição é o retorno do Checkout PagSeguro. ' No término do checkout o usuário é redirecionado para este bloco. %> <h3>Obrigado por efetuar a compra.</h3> <% end if %> |
O retorno que eu peguei no arquivo de log foi uma informação que até então eu já esperava. A biblioteca está correta então o problema era outro… Veja o log na íntegra, com o POST do PagSeguro e o retorno do usuário à página, após efetuar o pagamento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Chegou ate a url de retorno.asp Dados recebidos: GET POST Total de fields: 34 &VendedorEmail=mike@visie.com.br&CliNumero=apto 030&CliBairro=Santana&NumItens=2&ProdExtras_1=0,00&ProdExtras_2=0,00&TransacaoID=D5AE7B12E7F4485D8F3B8AA634A46AF6&CliCidade=SAO PAULO&Referencia=NUMALUCO&TipoFrete=FR&ProdID_1=1&Extras=0,00&ProdID_2=2&ValorFrete=0,00&Anotacao=&ProdQuantidade_1=2&ProdQuantidade_2=2&DataTransacao=04/09/2010 21:37:38&CliEstado=SP&CliTelefone=12 21010900&TipoPagamento=Boleto&StatusTransacao=Aguardando Pagto&CliNome=Angelo dos Santos&CliComplemento=garagem 200&CliCEP=02021030&ProdDescricao_1=Carrinho&ProdValor_1=2,70&ProdFrete_1=0,00&ProdDescricao_2=Boneca&ProdValor_2=14,30&ProdFrete_2=0,00&CliEmail=angelo@santos.com.br&CliEndereco=RUA ALUISIO AZEVEDO&Parcelas=1 VERIFICADO --- Chegou ate a url de retorno.asp Dados recebidos: GET POST Total de fields: 0 Chegou ate a url de retorno.asp Dados recebidos: GET POST Total de fields: 0 |
O que consegui ver com os dados recolhidos é que o atributo Request.Form.count só é válido para dados que chegam via POST, caso o usuário chege até a página através do método GET, ou seja, o usuário escrever a url “meusite.com.br/retorno.asp” no browser a variável Request.Form.count sempre será zero. Então, podemos concluir que o report na verdade eram testes equivocados do desenvolvedor que não estava conseguindo entender o que acontece no retorno automático de dados do PagSeguro. Que na verdade os testes devem ser feitos online e em segundo plano.
Em minhas palestras, deixo em claro que o robô de NPI envia um POST em segundo plano. Mas realmente este não é um conceito fácil de aprender. Para quem está começando a desenvolver com o retorno automático do PagSeguro sempre aconselho a ler os tutoriais do próprio PagSeugro, da Visie e minha área separada neste blog sobre PagSeguro. Bem, fica a dica para os desenvolvedores em ASP. SEMPRE GRAVE LOG!
Ps.: Vou fazer um fork da versão desenvolvida pela visie e enviar para eles a alteração com a gravação de logs assim que possível



