Ir para conteúdo

POWERED BY:

Arquivado

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

Good

Retorno automático pagseguro..

Recommended Posts

Alguém aqui sabe como fazer para pegar o status da transação, após ter efetuado a compra, quero exibir se foi cancelado, se está aguardando pagamento, etc..:

 

<?php
// Aqui vai seu Token
define('TOKEN','712CFBD61BB44AE38D699C54D15A1081');

// Incluindo o arquivo da biblioteca
include('retorno.php');

// Função que captura os dados do retorno
function retorno_automatico($VendedorEmail, $TransacaoID,
  $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao,
  $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, 
  $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens){

  switch (strtolower($StatusTransacao)) {
      case "completo":
          $con->query("UPDATE users SET us_data = now(), us_pago = '1' WHERE us_email = '".$CliEmail."' LIMIT 1");
          return "Pagamento completado";
      break;
      case "aguardando pagto":
          $con->query("INSERT INTO teste_resultado (status,data) VALUES ('".$StatusTransacao."','".date("H:i:s d-m-Y")."')");
          return "Aguardando pagamento";
      break;
      case "aprovado":
          $con->query("INSERT INTO teste_resultado (status,data) VALUES ('".$StatusTransacao."','".date("H:i:s d-m-Y")."')");
          return "Pagamento aprovado, aguardando compensação";
      break;
      case "em análise":
          $con->query("INSERT INTO teste_resultado (status,data) VALUES ('".$StatusTransacao."','".date("H:i:s d-m-Y")."')");
          return "Pagamento aprovado, em análise.";
      break;
      case "cancelado":
          $con->query("INSERT INTO teste_resultado (status,data) VALUES ('".$StatusTransacao."','".date("H:i:s d-m-Y")."')");
          return "Pagamento cancelado";
      break;
      default:
          $con->query("INSERT INTO teste_resultado (status,data) VALUES ('".$StatusTransacao."','".date("H:i:s d-m-Y")."')");
      break;
  }

}
?>

 

retorno.php

<?php

if (!defined('TOKEN')) define ('TOKEN', '712CFBD61BB44AE38D699C54D15A1081');

/**
 * RetornoPagSeguro
 *
 * Classe de manipulação para o retorno do post do pagseguro
 *
 * @package PagSeguro
 */
class RetornoPagSeguro {
  /**
   * _preparaDados
   *
   * Prepara os dados vindos do post e converte-os para url, adicionando
   * o token do usuario quando necessario.
   *
   * @internal é usado pela {@see RetornoPAgSeguro::verifica} para gerar os,
   * dados que serão enviados pelo PagSeguro
   *
   * @access private
   *
   * @param array $post         Array contendo os posts do pagseguro
   * @param bool $confirmacao   Controlando a adicao do token no post
   * @return string
   */
  function _preparaDados($post, $confirmacao=true) {
    if ('array' !== gettype($post)) $post=array();
    if ($confirmacao) {
      $post['Comando'] = 'validar';
      $post['Token'] = TOKEN;
    }
    $retorno=array();
    foreach ($post as $key=>$value){
      if('string'!==gettype($value)) $post[$key]='';
      $value=urlencode(stripslashes($value));
      $retorno[]="{$key}={$value}";
    }
    return implode('&', $retorno);
  }

  /**
   * _tipoEnvio
   *
   * Checa qual será a conexao de acordo com a versao do PHP
   * preferencialmente em CURL ou via socket
   *
   * em CURL o retorno será:
   * <code> array ('curl','https://pagseguro.uol.com.br/Security/NPI/Default.aspx') </code>
   * já em socket o retorno será:
   * <code> array ('fsocket', '/Security/NPI/Default.aspx', $objeto-de-conexao) </code>
   * se não encontrar nenhum nem outro:
   * <code> array ('','') </code>
   *
   * @access private
   * @global string $_retPagSeguroErrNo   Numero de erro do pagseguro
   * @global string $_retPagSeguroErrStr  Texto descritivo do erro do pagseguro
   * @return array                        Array com as configurações
   *
   */
  function _tipoEnvio() {
    //Prefira utilizar a função CURL do PHP
    //Leia mais sobre CURL em: http://us3.php.net/curl
    global $_retPagSeguroErrNo, $_retPagSeguroErrStr;
    if (function_exists('curl_exec'))
      return array('curl', 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');
    elseif ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://pagseguro.uol.com.br', 443, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30)))
      return array('fsocket', '/Security/NPI/Default.aspx', $fp);
    elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30))
      return array('fsocket', '/Security/NPI/Default.aspx', $fp);
    return array ('', '');
  }

  /**
   * not_null
   *
   * Extraido de OScommerce 2.2 com base no original do pagseguro,
   * Checa se o valor e nulo
   *
   * @access public
   *
   * @param mixed $value        Variável a ser checada se é nula
   * @return bool
   */
  function not_null($value) {
    if (is_array($value)) {
      if (sizeof($value) > 0) {
        return true;
      } else {
        return false;
      }
    } else {
      if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) {
        return true;
      } else {
        return false;
      }
    }
  }

  /**
   * verifica
   *
   * Verifica o tipo de conexão aberta e envia os dados vindos
   * do post
   *
   * @access public
   *
   * @use RetornoPagSeguro::_tipoenvio()
   * @global string $_retPagSeguroErrNo   Numero de erro do pagseguro
   * @global string $_retPagSeguroErrStr  Texto descritivo do erro do pagseguro
   * @param array $post         Array contendo os posts do pagseguro
   * @param bool $tipoEnvio     (opcional) Verifica o tipo de envio do post
   * @return bool
   */
  function verifica($post, $tipoEnvio=false) {
    global $_retPagSeguroErrNo, $_retPagSeguroErrStr;
    if ('array' !== gettype($tipoEnvio))
      $tipoEnvio = RetornoPagSeguro::_tipoEnvio();
    $spost=RetornoPagSeguro::_preparaDados($post);
    if (!in_array($tipoEnvio[0], array('curl', 'fsocket')))
      return false;
    $confirma = false;
    if ($tipoEnvio[0] === 'curl') {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $spost);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HEADER, false);
      curl_setopt($ch, CURLOPT_TIMEOUT, 30);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      $resp = curl_exec($ch);
      if (!RetornoPagSeguro::not_null($resp)) {
        curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]);
        $resp = curl_exec($ch);
      }
      curl_close($ch);
      $confirma = (strcmp ($resp, 'VERIFICADO') == 0);
    } elseif ($tipoEnvio[0] === 'fsocket') {
      if (!$tipoEnvio[2]) {
        die ("{$_retPagSeguroErrStr} ($_retPagSeguroErrNo)");
      } else {
        $cabecalho = "POST {$tipoEnvio[1]} HTTP/1.0\r\n";
        $cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $cabecalho .= "Content-Length: " . strlen($spost) . "\r\n\r\n";
        $resp = '';
        fwrite ($tipoEnvio[2], "{$cabecalho}{$spost}");
        while (!feof($tipoEnvio[2])) {
          $resp = fgets ($tipoEnvio[2], 1024);
          if (strcmp ($resp, 'VERIFICADO') == 0) {
            $confirma = (strcmp ($resp, 'VERIFICADO') == 0);
            $confirma=true;
            break;
          }
        }
        fclose ($tipoEnvio[2]);
      }
    }
    if ($confirma && function_exists('retorno_automatico')) {
      $itens = array (
                'VendedorEmail', 'TransacaoID', 'Referencia', 'TipoFrete',
                'ValorFrete', 'Anotacao', 'DataTransacao', 'TipoPagamento',
                'StatusTransacao', 'CliNome', 'CliEmail', 'CliEndereco',
                'CliNumero', 'CliComplemento', 'CliBairro', 'CliCidade',
                'CliEstado', 'CliCEP', 'CliTelefone', 'NumItens',
              );
      foreach ($itens as $item) {
        if (!isset($post[$item])) $post[$item] = '';
        if ($item=='ValorFrete') $post[$item] = str_replace(',', '.', $post[$item]);
      }
      $produtos = array ();
      for ($i=1;isset($post["ProdID_{$i}"]);$i++) {
        $produtos[] = array (
          'ProdID'          => $post["ProdID_{$i}"],
          'ProdDescricao'   => $post["ProdDescricao_{$i}"],
          'ProdValor'       => (double) (str_replace(',', '.', $post["ProdValor_{$i}"])),
          'ProdQuantidade'  => $post["ProdQuantidade_{$i}"],
          'ProdFrete'       => (double) (str_replace(',', '.', $post["ProdFrete_{$i}"])),
          'ProdExtras'      => (double) (str_replace(',', '.', $post["ProdExtras_{$i}"])),
        );
      }
      retorno_automatico (
        $post['VendedorEmail'], $post['TransacaoID'], $post['Referencia'], $post['TipoFrete'],
        $post['ValorFrete'], $post['Anotacao'], $post['DataTransacao'], $post['TipoPagamento'],
        $post['StatusTransacao'], $post['CliNome'], $post['CliEmail'], $post['CliEndereco'],
        $post['CliNumero'], $post['CliComplemento'], $post['CliBairro'], $post['CliCidade'],
        $post['CliEstado'], $post['CliCEP'], $post['CliTelefone'], $produtos, $post['NumItens']
      );
    }
    return $confirma;
  }
}

if ($_POST) {
  RetornoPagSeguro::verifica($_POST);
  die();
}


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo a comunicação é totalmente via server, não necessita do navegador os sites se comunicam entre eles, mesmo que seu PC esteja desligado(fui claro amigo?), entendido essa parte me diga você definiu a URL de retorno automatico?

 

Atenciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

defini sim..

 

então talvez, isso explica o pq que tem alguns registros a mais na tabela de test.e.

 

 

se isso é automático, vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

então talvez, isso explica o pq que tem alguns registros a mais na tabela de test.e.

Acho que entendi você colocou no switch para que

aguardando pagto, Aguardando pagamento, aprovado, em análise e cancelado para dar INSERT sendo que o certo seria você indentificar se a TransacaoID (que retorna do pagseguro para cada compra é sempre a mesma) já foi cadastrada se SIM o mysql execulta o UPDATA se não ele execulta o INSERT.

 

Atenciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me dá um exemplo de como fazer isso..

 

 

tipo, depois de inserir os valores.. como eu vou fazer pra verificar? Vai atualizar automaticamente né?

 

me dá um exemplo disso ae.. to perdido aqui..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria algo assim amigo:

$q = mysql_query("SELECT * FROM `teste_resultado` WHERE `idtransacao`='".$TransacaoID."'");
if(mysql_num_rows($q)>0){//Verifica quantas linhas do SQL cotêm a variavel TransacaoID
	//Se houver uma linha, aqui vai o update
} else {
	//Se não houver nada no SQL aqui vai o insert
}

Espero que tenha ajudado =D

Boa sorte

 

Anteciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

então foi do jeito q eu pensei..

 

vlw

 

ainda não tirei minha dúvida não..

 

tipo, como vou atualizar tal registro?

 

Tipo, é só configurar a url de retorno, que já está configurada.. ae vai atualizar todos os registros automaticamente?

 

 

Tipo, tem 10 compras pendentes.. ae quando for confirmado que alguém pagou por exemplo 4 compras.. ae vai atualizar as 4 automaticamente né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem na verdade pelo que vi das suas QUERYS SQL elas só fazem parte do que deveria, teria como por a estrutura SQL? Imagem Postada

Não quero o conteudo somente a estrutura ok?

 

Atenciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

É uma tabela de testes ainda..

 

TABELA: teste_resultado

COLUNAS: id(auto increment),idtransacao,status,data

 

eu ainda num fiz nada, pq é só teste.. eu quero saber se vai atualizar todos os pagamentos..

 

 

tipo, como é isso? Me expliquem como é que funciona essa atualização do status das compras..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem como atualizar todos de uma vez só, deixa eu ver se consigo lhe explicar o sentido do PagSeguro.

 

Quando o cliente faz uma compra ele envia um POST para o servidor pagseguro:

Usuario via POST [Cliente-side] => pagseguro[Server-side]
Ou seja o pagseguro recebe a compra atravez de uma pessoa "REAL" portanto não execulta o retorno automatico e sim somente um retorno simples sem o POST do pagseguro.


Quando a compra é cadastrada o site do pagseguro envia para o seu site (url de retorno) as informações via POST porem não há

interneferencia do cliente, pois neste ponto não é na sua maquina que está rodando e sim somente entre os sites, aqui acontece o retorno automatico que envia o POST (não pode ser capturado por echo ou print pois não está rodando na sua tela e sim somente entre os servidores)

 

pagseguro[Server-side] => seusite.com/urlderetorno.php[Server-side]
ou seja ele roda no "background" e não tem como ser capturado.

 

a CLASSE RetornoPagSeguro, não serve para pegar os DADOS e sim para validar. O PAGSEGURO envia um post a cada atulização de determinada compra. A cada atualização a CLASSE RetornoPagSeguro valida as informações para ver se elas são REAIS(verdadeiras).

Ao validar você usa a função retorno_automatico para pegar o POST, se acaso o POST não for valido ele não execulta a função retorno_automatico.

 

Bem eu sei que minha explicação não é das melhores, tentei explicar ao maximo que pude amigo, então vou te passar uns links para facilitar:

Entendendo o Retorno:

http://forum.imasters.com.br/index.php?/topic/295416-retorno-automatico-pagseguro/

 

Aprendendo a fazer LOGS para testar:

http://forum.imasters.com.br/index.php?/topic/331291-retorno-automatico-do-pagseguro-implementacao-em-php/page__p__1225830__fromsearch__1entry1225830

 

 

Amigo deixa só "falar" mais uma coisa sobre o código para atualizar, de exemplo que eu fiz:

Essa query possui um WHERE é como se fosse o IF do PHP, porem funciona um pouco diferente:

 

 

SELECT * FROM `teste_resultado` WHERE `idtransacao`='".$TransacaoID."'
Ele verifica se no seu DB já existe uma compra com a idtransacao registrada, cada compra é registrada com uma ID unica.


Aqui ele verifica, se quantas se existe pelo menos uma linha com a idtransacao de determinada compra.

 

if(mysql_num_rows($q)>0){
Se existir você deverá execultar um comando SQL update

 

Se não deverá execultar um INSERT.

 

Atenciosamente Silverfox

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sei disso sobre php e mysql..

 

 

eu só estou perguntando sobre como é que isso atualiza..

 

 

Pq eu to criando um sistema de cadastro de usuários, ae esses usuários irão compras uns planos.. ae eu quero saber como é que funciona essa parte da atualização do status da compra.. se o pagseguro atualiza automaticamente uma compra, ou se atualiza todas as compras..

 

 

 

bom, deixa pra lá.. eu acho que atualiza todas os registros da minha tabela de acordo com que o status da compra for mudando..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por favor leia até o final:

Olha amigo estou tentando lhe ajudar

Eu acho que você não está pegando o que eu estou tentando lhe falar.

É talvez seja eu que não tenha entendido...

Responda na ordem por favor, para que sua duvida fique mais clara:

1 - Sua duvida é REFERENTE exatamente a o que a)pegar o POST? b)Atualizar todos dados do SQL? c)Outro

 

 

Vou deixar claro para mim a sua duvida parece REFERENTE ao SQL, o que você deu a entender é que você quer atualizar todos os pagamentos:

eu quero saber se vai atualizar todos os pagamentos..

Como eu já havia RESPONDIDO:

 

Não tem como atualizar todos de uma vez só, deixa eu ver se consigo lhe explicar o sentido do PagSeguro.

Portanto cada POST que o pagseguro envia é referente a uma determinada compra e não a todas compras, o PagSeguro vai enviar um poste para cada compra paga ou seja se o tres clientes pagaram e o dinheiro foi confirmado você vai receber 3 POSTS diferentes como se abri-se tres páginas diferentes.

 

Cada compra tem uma ID diferente, você deve usar as variaveis:

 

function retorno_automatico($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao,...

$TransacaoID: Se está variavel estiver cadastrada no MySQL, o Comando que você deve usar é o UPDATE

$StatusTransacao: Deve conter o STATUS da "transação".

 

Amigo o problema como eu disse no meu poste anterior é que eu acho que você não entendeu a lógica do PAGSEGURO, se você tiver a paciencia de ler e RELEIA novamente o que eu escrevi anteriormente (meu poste anterior) e leia novamente o link: http://forum.imasters.com.br/index.php?/topic/295416-retorno-automatico-pagseguro/

Garanto que você vai entender a lógica.

 

Amigo se eu não pude lhe ajudar nem com isso significa que não entendi sua duvida, sinto muito se não entendi, fiz o que eu pude por você, e portanto desisto de lhe ajudar e espero que outro membro do forum seja CAPAZ de lhe ajudar, lhe desejo boa sorte e bons negocios Imagem Postada

 

Atenciosamente Silverfox

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.