Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
<?php
$retorno_token = 'SEU_TOKEN';
define(TOKEN, $retorno_token);
class createLog{
private $name = 'ps/ps.txt';
private $type = 'ab';
public $log;
function setType($type = '') {
$this -> type = $type;
}
function setFileName($name = ''){
$this -> name = $name;
}
public function setLog($log){
$tx = $log."#";
$ar = array("'" => "", "=" => "=", ">" => "", ")" => "", "array (" => "", "array ( " => "", " " => "", "\n" => "");
$st = strtr($tx, $ar);
$lr = preg_replace("/,#/",";\n",$st);
$aw = str_replace("#","",$lr);
$rl = preg_replace("/,([a-zA-Z])/",";\n$1",$aw);
$this -> log = $rl;
if($log != ""){
return TRUE;
}else{
return FALSE;
}
}
public function createlog(){
$f = fopen ($this -> name, $this -> type);
fwrite($f, $this -> log);
fclose($f);
}
}
$log = new createLog();
$log -> setLog(var_export($_POST, true));
$log -> createlog();
sleep(3);
$arquivo = fopen ("ps/ps.txt", "r+");
$num_linhas = 0;
while (!feof ($arquivo)) {
if ($linha = fgets($arquivo)){
$num_linhas++;
$Trata_Dados = preg_replace("/(\w+) = (\w+)/", "$2", $linha);
$array = array("@" => "", "." => "", "," => "", "/" => "", ":" => "", " = " => " ", " " => "", ";" => "");
$strtr = strtr($linha, $array);
$Trata_Dados2 = preg_replace("/(\w+) (\w+)/", "$1", $strtr);
$Retira_Espaco = str_replace(' ', '', $Trata_Dados2);
$Conta_Caracteres = strlen($Trata_Dados);
$Retira_Virgula_Final = substr($Trata_Dados, 0, ($Conta_Caracteres-2));
$Retira_Anotacao = str_replace('Anotacao = ', '', $Retira_Virgula_Final);
$Retira_Espaco2 = str_replace(' ', '+', $Retira_Anotacao);
$Recebe_Info = $Recebe_Info.$Retira_Espaco.'='.$Retira_Espaco2."&";
if($num_linhas == 3){
$Referencia = $Retira_Virgula_Final;
}
if($num_linhas == 10){
$StatusTransacao = $Retira_Virgula_Final;
}
}
}
$Retira_Espaco3 = str_replace('
', '', $Recebe_Info);
$Tempo = 20;
$PostData = 'Comando=validar&Token='.TOKEN.'&'.$Retira_Espaco3;
function Envia_Url($Data, $Tmp){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $Data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $Tmp);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
return $result;
}
$Verifica = Envia_Url($PostData, $Tempo);
sleep(3);
fclose ($arquivo);
if($Verifica == "VERIFICADO"){
if(($Referencia != "") || ($StatusTransacao != "")){
$est = str_replace(' ', '', $StatusTransacao);
$est2 = str_replace('á', 'a', $est);
//Aqui você pode colocar o que você quiser que seje alterado conforme resposta do PagSeguro ou deixar assim.
$arr = array("Completo" => "Completo", "AguardandoPagto" => "AguardandoPagto", "Aprovado" => "Aprovado", "EmAnalise" => "EmAnalise", "Cancelado" => "Cancelado");
$str = strtr($est2, $arr);
$conexao = mysql_connect("localhost", "ADMINISTRADOR", "SENHA") or die ("Erro ao Conectar no Banco de Dados");
mysql_select_db("BANCO_DE_DADOS", $conexao);
//$pesquisa = mysql_query("select * from TABELA")or exit(mysql_error());
//while($dados = mysql_fetch_array($pesquisa)){
INSIRA AQUI AS OPÇÕES PARA INSERÇÃO NO BANDO DE DADOS
exe: mysq_query("INSERT INTO etc...");
//}
//mysql_close($conexao);
echo"Seu Pedido foi Concretizado!";
}else{
echo'Seu Pedido não pode ser enviado, por favor tente Novamente.';
}
sleep(3);
$arquivo2 = fopen ("ps/ps.txt", "w");
fclose($arquivo2);
}else{
echo'Erro no PagSeguro.';
}
?>
Esse Script funcionou perfeitamente comigo espero que Ajude, qualquer dúvida estamos aew!
Aprimorei Novamente o Código, agora está mais Fácil de Entender com Menas Variaveis e com funções mais Dinamicas:
<?php
$retorno_token = 'Seu_TOKEN';
define(TOKEN, $retorno_token);
class createLog{
private $name = 'ps.txt';
private $type = 'ab';
public $log;
function setType($type = '') {
$this -> type = $type;
}
function setFileName($name = ''){
$this -> name = $name;
}
public function setLog($log){
// Array Contendo os Caracteres que serão Substituidos ou Removidos.
$Array_Subst = array(">" => "", ")" => "", "array (" => "", "array ( " => "", " " => "", "\n" => "");
// Substituimos e/ou Removemos os Caracteres.
$Substitui = strtr($log, $Array_Subst);
// Substituimos ',' por ' = '
$Formatacao_Log = preg_replace("/','/","' = '",$Substitui);
// Substituimos ', por '
$Formatacao_Log2 = preg_replace("/',/","'",$Formatacao_Log);
// Substituimos ' = ' por '='
$Formatacao_Log3 = preg_replace("/' = '/","'='",$Formatacao_Log2);
// Guardamos essas Informações
$this -> log = $Formatacao_Log3;
if($log != ""){
return TRUE;
}else{
return FALSE;
}
}
public function createlog(){
$f = fopen ($this -> name, $this -> type);
fwrite($f, $this -> log);
fclose($f);
}
}
// Chamamos a Função que Guarda os Arquivos no Log
$log = new createLog();
$log -> setLog(var_export($_POST, true));
$log -> createlog();
// Abrimos o Arquivo.
$arquivo = fopen ("ps.txt", "r+");
// Pegamos os Dados do Log e armazenamos em uma Variavel
if ($Linha = fgets($arquivo, 102400)){
// Criamos um Array com os Dados do Log
$Cria_Array = explode("=", $Linha);
// Contamos quantos Valores o Array tem.
$Contador = count($Cria_Array);
// Definimos uma Variavel que Recebera todas as Informações.
$Dados_Url;
// Fazemos um Loop de acordo com a Quantidade de Valores do Array.
for($i=0; $i<$Contador; $i++){
// Verificamos se $i é Par ou Impar
$Par = ($i % 2);
// Se $i for Par entra nessa Condição.
if($Par == 0){
// Retiramos os Espaços e as Aspas Simples da String.
$Info_PagSeguro = str_replace(" ", "", str_replace("'", "", $Cria_Array[$i]));
// Guardamos os Dados em uma Variavel.
$Dados_Url .= $Info_PagSeguro."=";
// Se $i for Impar entra nessa Condição.
}else{
// Retiramos as Aspas Simples da String.
$Retira_Aspas = str_replace("'", "", $Cria_Array[$i]);
// Substituimos os Espaços por +
$Info_Cliente = str_replace(' ', '+', $Retira_Aspas);
// Guardamos os Dados em uma Variavel.
$Dados_Url .= $Info_Cliente."&";
}
}
}
// Definimos o Tempo de Envio das Informações ao PagSeguro.
$Tempo = 20;
// Juntamos TODOS os Dados que serão Enviados ao PagSeguro.
$Dados_Url_Completo ='Comando=validar&Token='.TOKEN.'&'.$Dados_Url;
function Envia_Url($Data, $Tmp){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $Data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $Tmp);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
// Retornamos a Resposta do PagSeguro.
return $result;
}
// Fechamos o Arquivo.
fclose ($arquivo);
// Guardamos a Resposta do PagSeguro em uma Variavel.
$Verificacao = Envia_Url($Dados_Url_Completo, $Tempo);
if($Verificacao == "VERIFICADO"){
echo"Seu Pedido foi Concretizado!";
}else{
echo"Seu Pedido não foi Concretizado!";
}
// Limpamos o Log.
$arquivo2 = fopen("ps.txt", "w");
fclose($arquivo2);
?>
Qualquer Dúvida estarei a Disposição!
Ótima contribuição !!
Muito Obrigado Vinicius Ianni ^^
Este modelo funciona para o retorno automatico ou para a API nova de notificações de status etc?
>
Este modelo funciona para o retorno automatico ou para a API nova de notificações de status etc?
Então para a api nova não, mas se quizer eu posto o script que fiz para essa nova API!
Usando a API de notificação... Agora a sua tarefa é apenas gravar isso no banco de dados.
Se puder irá ajudar muito! Pois usavamos o pagseguro do método antigo e queria utilizar a nova API :D
>
>
Este modelo funciona para o retorno automatico ou para a API nova de notificações de status etc?
Então para a api nova não, mas se quizer eu posto o script que fiz para essa nova API!
Não conseguiu utilizar o tutorial que eu passei?
>
Usando a API de notificação... Agora a sua tarefa é apenas gravar isso no banco de dados.
No meu sistema, quando a pessoa clica no botão para pagar, atualiza no DB como 'Aguardando Pgto', nesse código da API de notificação, pra eu atualizar o status da pessoa quando estiver pago, é só botar abaixo do:
<?php
if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction'){
//Todo resto do código iremos inserir aqui.
$email = "seuemail@dominio.com.br";
$token = "95112EE828D94278BD394E91C4388F20";
$url = "https://ws.pagseguro.uol.com.br/v2/transactions/notifications/" . $_POST['notificationCode'] . "?email=" . $email . "&token=" . $token;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$transaction= curl_exec($curl);
curl_close($curl);
if($transaction == 'Unauthorized'){
//Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção
mail("email@email.com","Unauthorized Retorno PagSeguro","Deu erro na hora do retorno do PagSeguro, Unauthorized!");
exit;//Mantenha essa linha
}
$transaction = simplexml_load_string($transaction);
$status = $transaction -> status;
if ($status == 'CANCELLED')
{
//atualiza db
}
else if ($status == 'PAID')
{
//atualiza db
}
else if ($status == 'WAITING_PAYMENT')
{
//atualiza db
}
else if ($status == 'IN_ANALYSIS')
{
//atualiza db
}
else if ($status == 'AVAILABLE')
{
//atualiza db
}
}
Pode ser assim?
Cara de onde você tirou esses status?
CANCELLED, PAID, WAITING_PAYMENT...?
No post que eu lhe enviei ele não mostra nada referente a isso. nem na documentação do PagSeguro sobre a API de notificação...
O status chega como numérico. Tem o exemplo do XML que chega em: http://sounoob.com.br/2011/09/06/recebendo-notificacoes-do-pagseguro-usando-php-sem-utilizar-a-biblioteca-oficial/
Você chegou a dar uma olhada na documentação da API?
Tirando isso acho que o resto aparentemente está correto.
Ao invés de ficar escrevendo código e postar aqui perguntando se está correto, dar uma testada ai, e ver o que está chegando, isso vai fazer você pensar um pouco sobre a logica, e talvez você consiga resolver o problema ainda sem gastar muito tempo/esforço.
>
Cara de onde você tirou esses status?
CANCELLED, PAID, WAITING_PAYMENT...?
No post que eu lhe enviei ele não mostra nada referente a isso. nem na documentação do PagSeguro sobre a API de notificação...
O status chega como numérico. Tem o exemplo do XML que chega em: http://sounoob.com.br/2011/09/06/recebendo-notificacoes-do-pagseguro-usando-php-sem-utilizar-a-biblioteca-oficial/
Você chegou a dar uma olhada na documentação da API?
Tirando isso acho que o resto aparentemente está correto.
Ao invés de ficar escrevendo código e postar aqui perguntando se está correto, dar uma testada ai, e ver o que está chegando, isso vai fazer você pensar um pouco sobre a logica, e talvez você consiga resolver o problema ainda sem gastar muito tempo/esforço.
Vi isso nas strings de utilização da biblioteca do pagseguro em si, mas dai precisaria puxar o getTypeFromValue() da biblioteca... vou testar utilizando a numeração dos status e depois dou um retorno aqui. valeu.
o.O nossa amanhã eu posto meu script do retorno da nova API!
>
>
Cara de onde você tirou esses status?
CANCELLED, PAID, WAITING_PAYMENT...?
No post que eu lhe enviei ele não mostra nada referente a isso. nem na documentação do PagSeguro sobre a API de notificação...
O status chega como numérico. Tem o exemplo do XML que chega em: http://sounoob.com.br/2011/09/06/recebendo-notificacoes-do-pagseguro-usando-php-sem-utilizar-a-biblioteca-oficial/
Você chegou a dar uma olhada na documentação da API?
Tirando isso acho que o resto aparentemente está correto.
Ao invés de ficar escrevendo código e postar aqui perguntando se está correto, dar uma testada ai, e ver o que está chegando, isso vai fazer você pensar um pouco sobre a logica, e talvez você consiga resolver o problema ainda sem gastar muito tempo/esforço.
Vi isso nas strings de utilização da biblioteca do pagseguro em si, mas dai precisaria puxar o getTypeFromValue() da biblioteca... vou testar utilizando a numeração dos status e depois dou um retorno aqui. valeu.
Valeu! To tentando fazer funcionar o que o Senartes passou acima, mas aguardo para dar uma olhada no teu código Gaw ;)
>
o.O nossa amanhã eu posto meu script do retorno da nova API!
>
>
Cara de onde você tirou esses status?
CANCELLED, PAID, WAITING_PAYMENT...?
No post que eu lhe enviei ele não mostra nada referente a isso. nem na documentação do PagSeguro sobre a API de notificação...
O status chega como numérico. Tem o exemplo do XML que chega em: http://sounoob.com.br/2011/09/06/recebendo-notificacoes-do-pagseguro-usando-php-sem-utilizar-a-biblioteca-oficial/
Você chegou a dar uma olhada na documentação da API?
Tirando isso acho que o resto aparentemente está correto.
Ao invés de ficar escrevendo código e postar aqui perguntando se está correto, dar uma testada ai, e ver o que está chegando, isso vai fazer você pensar um pouco sobre a logica, e talvez você consiga resolver o problema ainda sem gastar muito tempo/esforço.
Vi isso nas strings de utilização da biblioteca do pagseguro em si, mas dai precisaria puxar o getTypeFromValue() da biblioteca... vou testar utilizando a numeração dos status e depois dou um retorno aqui. valeu.
Eis a Criancinha:
<?php header('Content-Type: text/html; charset=ISO-8859-1'); ?>
<?php
class RetornoPagSeguro {
private $name = 'log.txt';
private $type = 'ab';
public $log;
private $timeout = 20; // Timeout em segundos
function setTipo($type = '') {
$this->type = $type;
}
function setArquivoNome($name = '') {
$this->name = $name;
}
public function setLog($log) {
// Guardamos essas Informações
$this->log = $log;
}
public function criaLog() {
$f = fopen($this->name, $this->type);
fwrite($f, $this->log);
fclose($f);
}
public function pegaArray() {
$pegaArray = file_get_contents("log.txt");
return $pegaArray;
}
public function verify($data) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
return $result;
}
public function getUrlRetornar($str_retorno, $token, $tipo) {
$str_retorno = str_replace("array", "", $str_retorno);
$str_retorno = str_replace("(", "", $str_retorno);
$str_retorno = str_replace(")", "", $str_retorno);
$str_retorno = str_replace(" ", "", $str_retorno);
$str_retorno = str_replace("\n", "", $str_retorno);
$array = explode("','", $str_retorno);
$arr = array();
foreach ($array as $value) {
$var1 = explode("=>", $value);
$chave = trim(str_replace("'", "", $var1[0]));
$valor = trim(str_replace("'", "", $var1[1]));
$arr["$chave"] = $valor;
}
$url = "Comando=validar&Token=$token&";
foreach ($arr as $key => $value) {
if ($key <> "notificationCode" && $key <> "notificationType") {
$url .= "$key=$value&";
}
}
$url = trim(str_replace("notificationCode&", "", $url));
$pos = strrpos($url, ",");
$url = substr($url, 0, $pos);
$url = str_replace(" ", "+", $url);
if ($tipo == 1) {
return $url;
} else {
return $arr;
}
}
}
$npi = new RetornoPagSeguro();
$npi->setLog(var_export($_POST, true));
$npi->criaLog();
$array = $npi->pegaArray();
$url_retornar = $npi->getUrlRetornar($array, "SEU_TOKEN", 1);
$result = $npi->verify($url_retornar);
$conexao = mysql_connect('localhost', 'TABELA', 'SENHA');
mysql_select_db('BANCO');
$array_retorno = $npi->getUrlRetornar($array, "SEU_TOKEN", 0);
sleep(1);
if ($result == "VERIFICADO") {
$Verifica = substr($array_retorno['ProdDescricao_1'], 0, -3);
$TransacaoID = $array_retorno['TransacaoID'];
$VendedorEmail = $array_retorno['VendedorEmail'];
if ($Verifica == 'Paket Gebot') {
$Referencia = $array_retorno['ProdDescricao_1']; $Referencia = "";
}
$TipoFrete = $array_retorno['TipoFrete'];
$ValorFrete = $array_retorno['ValorFrete'];
$Extras = $array_retorno['Extras'];
$Anotacao = $array_retorno['Anotacao'];
$TipoPagamento = $array_retorno['TipoPagamento'];
$StatusTransacao = $array_retorno['StatusTransacao'];
$CliNome = $array_retorno['CliNome'];
$CliEmail = $array_retorno['CliEmail'];
$CliEndereco = $array_retorno['CliEndereco'];
$CliNumero = $array_retorno['CliNumero'];
$CliComplemento = $array_retorno['CliComplemento'];
$CliBairro = $array_retorno['CliBairro'];
$CliCidade = $array_retorno['CliCidade'];
$CliEstado = $array_retorno['CliEstado'];
$CliCEP = $array_retorno['CliCEP'];
$CliTelefone = $array_retorno['CliTelefone'];
$ProdDescricao = $array_retorno['ProdDescricao_1'];
$NumItens = $array_retorno['NumItens'];
mysql_query("INSERT into PagSeguroTransacoes SETData=now();");
echo"<center>Seu Pedido foi Confirmado, aguarde alguns segundos para que possamos concluir sua compra!</center>";
echo"<form action='concluido.php' name='finaliza' method='post'><input type='hidden' name='Valida' value='ok'>";
sleep(5);
foreach ($array_retorno as $key => $value) {
if ($key <> "notificationCode" && $key <> "notificationType") {
echo"<input type='hidden' name='" . $key . "' value='" . $value . "'>";
}
}
echo"</form>";
echo"<script> document.finaliza.submit(); </script>";
} else {
echo"<form action='concluido.php' name='finaliza2' method='post'>
<input type='hidden' name='Valida' value='ok'>";
foreach ($array_retorno as $key => $value) {
if ($key <> "notificationCode" && $key <> "notificationType") {
echo"<input type='hidden' name='" . $key . "' value='" . $value . "'>";
}
}
echo"</form>";
echo"<script> document.finaliza2.submit(); </script>";
}
?>
Concluido.php:
<?php
class RetornoPagSeguro {
private $name = 'log.txt';
public $log;
function setArquivoNome($name = '') {
$this->name = $name;
}
public function limpaLog() {
$g = fopen($this->name, "w");
fclose($g);
}
}
$npi = new RetornoPagSeguro();
$npi->limpaLog();
$conexao = mysql_connect('localhost', 'TABELA', 'SENHA');
mysql_select_db('BANCO');
ALTERA DB AQUI
?>
Como tu tá utilizando a API nova com a URL antiga?
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
não teria que utilizar a nova:
https://ws.pagseguro.uol.com.br/v2/transactions/notifications/
fiquei na dúvida
Enfim, o código que o senartes passou rolou depois de algumas mudanças, Valeu pela ajuda dos 2 :D
Código errado, falha minha ¬¬ que bom que você solucionou seu problema ;D
Pessoal o sistema da API muda completamente o jeito de manipular os dados...
Prestem atenção nisso...
Essa solução postada acima não está meio... suja não? Objeto desnecessário, converter post em string, gravar em um arquivo de texto, ler o arquivo de texto, converter string em array ( o post recebido já era um array ) converte cada indide do array em variavel,... Acho que isso vai consumir muita memoria desnecessariamente...
>
Enfim, o código que o senartes passou rolou depois de algumas mudanças, Valeu pela ajuda dos 2 :D
Quais mudanças você faz? posta ai, talvez alguém que esteja pesquisando precise dessa alteração...
posso até solicitar alteração no blog...
Qual relação o link que você enviou tem a ver com esse tópico? é algum complemento de resposta de alguém? é uma solução?
Ao meu ver é um problema, se é um problema sobre a mesma coisa porque não posta direto aqui?
Tente não criar tópicos desnecessários.
Eis o Código comentado e sem algumas funções desnecessárias:
<?php
// Digite seu TOKEN aqui
// Classe que salva um Log das Informações Recebidas.
class createLog{
// Local do Arquivo de Texto.
private $name = 'ps/ps.txt';
// Metodo de Aberturea desse Arquivo.
// Salvamos as Informações no Arquivo.
// Chamamos a Função que Salva os Dados no Arquivo TXT
// Damos um tempo para o script executar a Gravação
sleep(3);
// Abrimos o Arquivo com as informações Salvas e Tratadas.
$arquivo = fopen ("ps/ps.txt", "r+");
// Quantidade de Linha do Arquivo
$num_linhas = 0;
while (!feof ($arquivo)) {
// Enquanto existir uma Linha no Arquivo execute as Funções
if ($linha = fgets($arquivo)){
// Contador de Linhas
// String contendo a URL de Retorno para o PagSeguro.
$PostData = 'Comando=validar&Token='.TOKEN.'&'.$Retira_Espaco3;
// Enviamos esses Dados para o PagSeguro
Qualquer tipo de Dúvidas sobre o Script estarei a disposição!