Good 4 Denunciar post Postado Julho 8, 2010 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
brcontainer 16 Denunciar post Postado Julho 9, 2010 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
Good 4 Denunciar post Postado Julho 10, 2010 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
brcontainer 16 Denunciar post Postado Julho 10, 2010 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 queaguardando 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
Good 4 Denunciar post Postado Julho 12, 2010 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
brcontainer 16 Denunciar post Postado Julho 13, 2010 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
Good 4 Denunciar post Postado Julho 14, 2010 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
brcontainer 16 Denunciar post Postado Julho 19, 2010 Bem na verdade pelo que vi das suas QUERYS SQL elas só fazem parte do que deveria, teria como por a estrutura SQL? Não quero o conteudo somente a estrutura ok? Atenciosamente Silverfox Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Julho 23, 2010 É 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
brcontainer 16 Denunciar post Postado Julho 23, 2010 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
Good 4 Denunciar post Postado Julho 23, 2010 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
brcontainer 16 Denunciar post Postado Julho 24, 2010 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 Atenciosamente Silverfox Compartilhar este post Link para o post Compartilhar em outros sites
Good 4 Denunciar post Postado Julho 24, 2010 aah.. entendi vlw Compartilhar este post Link para o post Compartilhar em outros sites