Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mgL_

Retorno automático PagSeguro em ASP/VB

Recommended Posts

Boa tarde pessoal,

 

estou tentando fazer o retorno automático de dados do PagSeguro em ASP, porém, tudo funciona bem, só que na hora de ele me retornar o status da compra, ele me retorna como FALSO. Então li em alguns fóruns e muito disseram que a variável VALUED tem que receber os dados em ISO-8859-1, mas meu arquivo já está neste padrão. Então pensei, será que tem algum jeito de fazer somente esta variável receber em iso-8859-1? Alguém poderia me dar uma luz?

 

Segue abaixo o código da página que estou usando:

 

<%
'Define cabecalhos do documento
Response.ContentType = "text/HTML"
Response.Charset = "ISO-8859-1"

'Token da conta do PagSeguro
Dim TOKEN
TOKEN = "MEUTOKENJAFOIDEFINIDOAKI"

'Timeout do arquivo
timeout = 20  'Timeout em segundos

'Funcao notificationPost
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

'Funcao clearStr
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

if Request.Form.count > 0 then

result = notificationPost()

if Request.Form("TransacaoID") <> empty then
	transacaoID = Request.Form("TransacaoID")
Else
	transacaoID = ""
end If

if result = "VERIFICADO" then
	'O post foi validado pelo PagSeguro.
	'Seleciona a compra efetuada na tabela order do sistema
	sql="SELECT * FROM order WHERE id = " & Request.Form("ProdID_1") & ""
	rs.Open sql

	'Se for VERIFICADO e Status do PagSeguro for COMPLETO
	if Request.Form("StatusTransacao") = "Aprovado" Then 

		'Se estiver setado como a ser pago, entao registra como pago
		if rs("state")= "unpay" Then

			'Muda status para Pago e registra data
			'UPDATE (Tabela::order)
			orderPay="UPDATE alpesnetcc.order SET status = 'pay', pay_id = '" & Request.Form("TransacaoID") & "', money = '" & Request.Form("ProdValor_1") & "' WHERE id = " & Request.Form("ProdID_1") & ""
			rs.Open orderPay

			'Registra historico de pagamento no sistema
			'INSERT (Tabela::pay)
			payOrder="INSERT INTO alpesnetcc.pay VALUES ('" & Request.Form("TransacaoID") & "','" & Request.Form("ProdID_1") & "','" & Request.Form("TipoPagamento") & "','" & Request.Form("TipoPagamento") & "','BRL','pagseguro','" & Now & "')"	

			'Grava o Log da operacao
			set file = Server.CreateObject("Scripting.FileSystemObject")
			path = Server.MapPath("logPagSeguro.log.txt")
			set infile = file.OpenTextFile( path ) 
			primeiroBloco = infile.ReadLine
			source = primeiroBloco & ";PAGSEGURO SUCCESSFUL " & transacaoID & " " & result & " " & Now & ""
			infile.close
			set outfile = file.CreateTextFile( path, True )
			outfile.WriteLine( source )
			outfile.Close

		End If

		'Grava o Log da operacao
		set file = Server.CreateObject("Scripting.FileSystemObject")
		path = Server.MapPath("logPagSeguro.log.txt")
		set infile = file.OpenTextFile( path ) 
		primeiroBloco = infile.ReadLine
		source = primeiroBloco & ";PAGSEGURO APPROVED " & Now & ""
		infile.close
		set outfile = file.CreateTextFile( path, True )
		outfile.WriteLine( source )
		outfile.Close

	End IF

	'Grava o Log da operacao
	set file = Server.CreateObject("Scripting.FileSystemObject")
	path = Server.MapPath("logPagSeguro.log.txt")
	set infile = file.OpenTextFile( path ) 
	primeiroBloco = infile.ReadLine
	source = primeiroBloco & ";PAGSEGURO VERIFIED " & Now & ""
	infile.close
	set outfile = file.CreateTextFile( path, True )
	outfile.WriteLine( source )
	outfile.Close

elseif result = "FALSO" then
	'O post não foi validado pelo PagSeguro.
	'Grava o Log da operacao
	set file = Server.CreateObject("Scripting.FileSystemObject")
	path = Server.MapPath("logPagSeguro.log.txt")
	set infile = file.OpenTextFile( path ) 
	primeiroBloco = infile.ReadLine
	source = primeiroBloco & ";PAGSEGURO FALSE " & transacaoID & " " & result & " " & Now & ""
	infile.close
	set outfile = file.CreateTextFile( path, True )
	outfile.WriteLine( source )
	outfile.Close
else
	'Erro na integração com o PagSeguro.
	'Grava o Log da operacao
	set file = Server.CreateObject("Scripting.FileSystemObject")
	path = Server.MapPath("logPagSeguro.log.txt")
	set infile = file.OpenTextFile( path ) 
	primeiroBloco = infile.ReadLine
	source = primeiroBloco & ";PAGSEGURO UNVERIFIED " & transacaoID & " " & result & " " & Now & ""
	infile.close
	set outfile = file.CreateTextFile( path, True )
	outfile.WriteLine( source )
	outfile.Close
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.	
'Response.Write("Apenas o Checkout do PagSeguro")

'Grava o Log da operacao
set file = Server.CreateObject("Scripting.FileSystemObject")
path = Server.MapPath("logPagSeguro.log.txt")
set infile = file.OpenTextFile( path ) 
primeiroBloco = infile.ReadLine
source = primeiroBloco & ";PAGSEGURO CHECKOUT " & Now & ""
infile.close
set outfile = file.CreateTextFile( path, True )
outfile.WriteLine( source )
outfile.Close

' Redireciona para o site apos compra
Response.redirect("http://www.compragrande.com.br:8081/minhas_compras")

end if
%>

 

Quando resolvido, podem usar esta classe a vontade .. abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Especifique na chamativa o setRequestHeader mandando o charset em Iso-8859-1

 

xmlHttp.Open "POST", strUrl, False

xmlHttp.setRequestHeader "CharSet", "ISO-8859-1"

xmlHttp.setRequestHeader "User-Agent", "asp httprequest"

xmlHttp.setRequestHeader "content-type", "application/x-www-form-urlencoded"

xmlHttp.setRequestHeader "content-length", Len(data)

xmlHttp.Send(data)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, não entendo quase nada de ASP, pois programo em PHP, poderias me dizer em que parte do meu código eu colocaria este seu?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da uma procurada no code... a parte em negrito é a sugerida... mas coloquei o code abaixo completo para não haver problemas, copie este code e teste, veja se esta funfando.

 

<%
'Define cabecalhos do documento
Response.ContentType = "text/HTML"
Response.Charset = "ISO-8859-1"

'Token da conta do PagSeguro
Dim TOKEN
TOKEN = "MEUTOKENJAFOIDEFINIDOAKI"

'Timeout do arquivo
timeout = 20  'Timeout em segundos

'Funcao notificationPost
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

'Funcao clearStr
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 "CharSet", "ISO-8859-1"
       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

if Request.Form.count > 0 then

       result = notificationPost()

       if Request.Form("TransacaoID") <> empty then
               transacaoID = Request.Form("TransacaoID")
       Else
               transacaoID = ""
       end If

       if result = "VERIFICADO" then
               'O post foi validado pelo PagSeguro.
               'Seleciona a compra efetuada na tabela order do sistema
               sql="SELECT * FROM order WHERE id = " & Request.Form("ProdID_1") & ""
               rs.Open sql

               'Se for VERIFICADO e Status do PagSeguro for COMPLETO
               if Request.Form("StatusTransacao") = "Aprovado" Then 

                       'Se estiver setado como a ser pago, entao registra como pago
                       if rs("state")= "unpay" Then

                               'Muda status para Pago e registra data
                               'UPDATE (Tabela::order)
                               orderPay="UPDATE alpesnetcc.order SET status = 'pay', pay_id = '" & Request.Form("TransacaoID") & "', money = '" & Request.Form("ProdValor_1") & "' WHERE id = " & Request.Form("ProdID_1") & ""
                               rs.Open orderPay

                               'Registra historico de pagamento no sistema
                               'INSERT (Tabela::pay)
                               payOrder="INSERT INTO alpesnetcc.pay VALUES ('" & Request.Form("TransacaoID") & "','" & Request.Form("ProdID_1") & "','" & Request.Form("TipoPagamento") & "','" & Request.Form("TipoPagamento") & "','BRL','pagseguro','" & Now & "')" 

                               'Grava o Log da operacao
                               set file = Server.CreateObject("Scripting.FileSystemObject")
                               path = Server.MapPath("logPagSeguro.log.txt")
                               set infile = file.OpenTextFile( path ) 
                               primeiroBloco = infile.ReadLine
                               source = primeiroBloco & ";PAGSEGURO SUCCESSFUL " & transacaoID & " " & result & " " & Now & ""
                               infile.close
                               set outfile = file.CreateTextFile( path, True )
                               outfile.WriteLine( source )
                               outfile.Close

                       End If

                       'Grava o Log da operacao
                       set file = Server.CreateObject("Scripting.FileSystemObject")
                       path = Server.MapPath("logPagSeguro.log.txt")
                       set infile = file.OpenTextFile( path ) 
                       primeiroBloco = infile.ReadLine
                       source = primeiroBloco & ";PAGSEGURO APPROVED " & Now & ""
                       infile.close
                       set outfile = file.CreateTextFile( path, True )
                       outfile.WriteLine( source )
                       outfile.Close

               End IF

               'Grava o Log da operacao
               set file = Server.CreateObject("Scripting.FileSystemObject")
               path = Server.MapPath("logPagSeguro.log.txt")
               set infile = file.OpenTextFile( path ) 
               primeiroBloco = infile.ReadLine
               source = primeiroBloco & ";PAGSEGURO VERIFIED " & Now & ""
               infile.close
               set outfile = file.CreateTextFile( path, True )
               outfile.WriteLine( source )
               outfile.Close

       elseif result = "FALSO" then
               'O post não foi validado pelo PagSeguro.
               'Grava o Log da operacao
               set file = Server.CreateObject("Scripting.FileSystemObject")
               path = Server.MapPath("logPagSeguro.log.txt")
               set infile = file.OpenTextFile( path ) 
               primeiroBloco = infile.ReadLine
               source = primeiroBloco & ";PAGSEGURO FALSE " & transacaoID & " " & result & " " & Now & ""
               infile.close
               set outfile = file.CreateTextFile( path, True )
               outfile.WriteLine( source )
               outfile.Close
       else
               'Erro na integração com o PagSeguro.
               'Grava o Log da operacao
               set file = Server.CreateObject("Scripting.FileSystemObject")
               path = Server.MapPath("logPagSeguro.log.txt")
               set infile = file.OpenTextFile( path ) 
               primeiroBloco = infile.ReadLine
               source = primeiroBloco & ";PAGSEGURO UNVERIFIED " & transacaoID & " " & result & " " & Now & ""
               infile.close
               set outfile = file.CreateTextFile( path, True )
               outfile.WriteLine( source )
               outfile.Close
       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.     
       'Response.Write("Apenas o Checkout do PagSeguro")

       'Grava o Log da operacao
       set file = Server.CreateObject("Scripting.FileSystemObject")
       path = Server.MapPath("logPagSeguro.log.txt")
       set infile = file.OpenTextFile( path ) 
       primeiroBloco = infile.ReadLine
       source = primeiroBloco & ";PAGSEGURO CHECKOUT " & Now & ""
       infile.close
       set outfile = file.CreateTextFile( path, True )
       outfile.WriteLine( source )
       outfile.Close

       ' Redireciona para o site apos compra
       Response.redirect("http://www.compragrande.com.br:8081/minhas_compras")

end if
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque não utilizar a biblioteca em .NET?

Lá tem a opção de receber utilizando a API de notificação, o qual seu sistema irá receber muito mais dados que o retorno automático de dados não mostra, sem contar que nunca você irá cair no problema de verificação retornar falso por problemas de encoding.

 

Veja o link: https://pagseguro.uol.com.br/v2/guia-de-integracao/tutorial-da-biblioteca-pagseguro-netframework.html#receber-notificacoes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu digo porque tem algo pronto, e a solução é melhor, afinal API de notificação tem uma serie de vantagens em cima do retorno automático, como por exemplo os campos adicionais que a API envia, não precisa validar os dados porem mantem a mesma segurança....

Enfim, somente uma sugestão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A API do pagseguro não é complexa, por isso não há necessidade de ter funções avançadas, ou sistema de webservice completo para isso, o negócio é simples... enviar a requisição e receber o resultado, por isso nada a ver, daria pra fazer até com javascript se quisesse, nesse caso não há vantagens.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem problemas.

O @mgL_ está(estava) com problemas eu apenas sugerir uma solução pronta criada pelo próprio PagSeguro.

 

Se é fácil montar uma do zero, ou não esse não é o ponto. Acho apenas que se tem algo pronto, devemos utilizar sim, se isso for o oficial melhor ainda.

Imagina se por algum acaso o script que você montou der algum erro no sistema que precise interagir com o PagSeguro, e eles falem que o problema está no seu script, o que o seu cliente irá falar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

API são coisas simples, além disso a do PagSeguro é muito mais simples ainda, pois não requerem requisições avançadas.

 

Uma vez testada e aprovada, eu passo ao cliente... ela não dara problema no futuro, não existe isso, se pegou no teste pegara depois sem problemas com o cliente... não acontece de da um problema depois do tempo.

 

E o pagseguro tb disponibiliza exemplos em asp...

 

http://pagseguro.visie.com.br/linguagem/asp/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me refiro aos casos de erros que não foram previstos que talvez aconteceria, em todo caso...

 

Esse link que você passou nem é do PagSeguro, é da visie http://visie.com.br/

 

E esse é um exemplo sobre o retorno automático, quando eu sugeri utilizar as bibliotecas do PagSeguro eu falei que uma das vantagens é que a biblioteca utilizava a API de notificação ( que é diferente do sistema de retorno automático).

 

Enfim, é apenas um caso de preferencias.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.