TenshiNet 0 Denunciar post Postado Maio 6, 2011 Pessoal, Boa Noite. Estou criando uma rifa online e o método de pagamento para a mesma é nosso querido sistema PAGSeguro. Como grande parte de programadores como eu, iniciantes, tive meus problemas com a implantação do retorno automático. Garimpando a net afora e aqui neste Fórum, consegui fazer funcionar ao menos o log, e concluí que estou recebendo o post normalmente do PagSeguro. O problema que estou tendo é o seguinte: preciso acessar um item de dentro do array $produtos ( ProdID ) para que possa excluí-lo do BD. Logo, minha dúvida é a seguinte: Como faço para verificar o valor do item dentro do array e atribuí-lo em uma variável? Por exemplo: $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}"])), ); Acima está o array $produtos. Como faço para verificar qual o valor do ProdID? Desde já agradeço a atenção dispensada. Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Maio 6, 2011 O ideal é na hora de enviar para o PagSeguro o pedido, gravar o mesmo no banco de dados, para quando os posts de retorno chegar, você usa o campo referencia ( informado no formulário na hora do envio para tela do checkout ) e altera apenas o status daquele pedido gravado anteriormente... Compartilhar este post Link para o post Compartilhar em outros sites
TenshiNet 0 Denunciar post Postado Maio 6, 2011 Realmente caro amigo senartes. Obrigado pela atenção. O ideal seria gravar em BD o pedido, mas isso para o caso de eu vender produtos físicos. Neste caso, especificamente, quero apenas retirar o número do BD para que ninguém possa comprar igual, afinal é só um campo na tabela. Consegui alguma coisa com while list, mas ainda não consegui apagar do BD. Provavelmente é a sintaxe ou lógica que ainda estou me embaraçando. Segue parte do código: function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens ) { if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){ while (list($chave, $valor) = each ($produtos)) { for($i=0;$chave=="ProdID_{$i}";$i++){ mysql_query("DELETE * FROM tabela WHERE campo = $valor"); } } } elseif ($StatusTransacao == "Cancelado"){ while (list($chave, $valor) = each ($produtos)) { for($i=0;$chave=="ProdID_{$i}";$i++){ $tab = mysql_query("SELECT * FROM tabela WHERE campo = $valor"); $tab = mysql_affected_rows(); if($tab==0){ mysql_query("INSERT INTO tabela (campo) VALUES ('$valor')"); } } } } } Gostaria de saber onde estou me equivocando. Desde já agradeço a atenção. Compartilhar este post Link para o post Compartilhar em outros sites
TenshiNet 0 Denunciar post Postado Maio 7, 2011 Pessoal, modifiquei meu código de forma a ficar mais segura a inserção e remoção do BD. Mas ainda tem alguma coisa falhando, e tenho certeza absoluta que é na parte de recuperar o valor do ProdID no array $produtos, pois testei todas as outras sintaxes em separado e funcionaram. Só não consegui ainda puxar este maldito valor do ProdID depois do POST. Segue o código: function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens ) { require_once('conecta.php'); if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){ $deleta = $produtos['ProdID']; $pergunta = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"'); $pergunta = mysql_affected_rows(); if ($pergunta <> 0){ mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"'); } } if ($StatusTransacao == "Cancelado"){ $insere = $produtos['ProdID']; $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $tab = mysql_affected_rows(); if($tab==0){ mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } } Recebo o log de retorno completo. Mas na opção do array, ele imprime a chave assim: ProdID_x = 12345 Alguem teria alguma forma de puxar este valor? Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Maio 9, 2011 if ($StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" OR $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise"){ $deleta = $produtos['ProdID']; $pergunta = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"'); $pergunta = mysql_affected_rows(); if ($pergunta <> 0){ mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"'); } } 1 - Nesse trecho do codigo pude notar o $StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" Sempre que for completo é porque já foi aprovado 14 dias antes. Ou seja não utilize os dois, utilize somente o aprovado, quando quiser verificar se o cliente pagou utilize apenas o Aprovado 2 - $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise" Esses dois status sempre são os iniciais, toda compra passa por eles, claro que pode acontecer de cair um Aprovado também no caso de cartão de credito ( dependendo da situação do cliente com o banco ). Resumindo se você está utilizando "Aguardando Pagto", "Em Análise" e "Aprovado", Logo toda transação irá cair nessa etapa, no minimo uma vez... Sendo assim, eu aconselho você utilizar essa linha mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"'); Na pagina onde você envia a transação para o PagSeguro, porque? se sempre ele irá executar isso na primeira etapa, é melhor que seja executado quando envia para o PagSeguroa opinião ) 3 - if ($StatusTransacao == "Cancelado"){ $insere = $produtos['ProdID']; $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $tab = mysql_affected_rows(); if($tab==0){ mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } Se eu não me engano, dentro de $produtos deverá ter um array com varios "ProdID", logo acho que você deveria percorrer esse array e eliminar cada "ProdID". Exemplo if ($StatusTransacao == "Cancelado"){ foreach ($produtos as $produto) { $insere = $produto['ProdID']; $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $tab = mysql_affected_rows(); if($tab==0) mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } Verifique se com isso funciona o que você precisa... Compartilhar este post Link para o post Compartilhar em outros sites
TenshiNet 0 Denunciar post Postado Maio 10, 2011 Caro amigo Senartes. Fico agradecido pela atenção dispensada. Tem sido de muita ajuda. 1 - Nesse trecho do codigo pude notar o $StatusTransacao == "Aprovado" OR $StatusTransacao == "Completo" Sempre que for completo é porque já foi aprovado 14 dias antes. Ou seja não utilize os dois, utilize somente o aprovado, quando quiser verificar se o cliente pagou utilize apenas o Aprovado 2 - $StatusTransacao == "Aguardando Pagto" OR $StatusTransacao == "Em Análise" Esses dois status sempre são os iniciais, toda compra passa por eles, claro que pode acontecer de cair um Aprovado também no caso de cartão de credito ( dependendo da situação do cliente com o banco ). Resumindo se você está utilizando "Aguardando Pagto", "Em Análise" e "Aprovado", Logo toda transação irá cair nessa etapa, no minimo uma vez... Sendo assim, eu aconselho você utilizar essa linha mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"'); Na pagina onde você envia a transação para o PagSeguro, porque? se sempre ele irá executar isso na primeira etapa, é melhor que seja executado quando envia para o PagSeguroa opinião ) Referente a esta parte, realmente não tinha parado pra analisar. Faz todo o sentido. 3 - if ($StatusTransacao == "Cancelado"){ $insere = $produtos['ProdID']; $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $tab = mysql_affected_rows(); if($tab==0){ mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } Se eu não me engano, dentro de $produtos deverá ter um array com varios "ProdID", logo acho que você deveria percorrer esse array e eliminar cada "ProdID". Exemplo if ($StatusTransacao == "Cancelado"){ foreach ($produtos as $produto) { $insere = $produto['ProdID']; $tab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $tab = mysql_affected_rows(); if($tab==0) mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } Quanto a esta outra parte, analisei com calma sua sugestão e terminei por deixar da seguinte forma: <?php if (isset($_POST)) { $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias fclose($f); } function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens ) { require_once('conexao.php'); if ($StatusTransacao == "Cancelado"){ foreach ($produtos as $produto){ $insere = $produto['ProdID']; $intab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$insere.'"'); $intab = mysql_affected_rows(); if($intab==0){ mysql_query('INSERT INTO tabela (campo) VALUES ("'.$insere.'")'); } } } else { foreach ($produtos as $produto){ $deleta = $produto['ProdID']; $outtab = mysql_query('SELECT * FROM tabela WHERE campo = "'.$deleta.'"'); $outtab = mysql_affected_rows(); if ($outtab <> 0){ mysql_query('DELETE FROM tabela WHERE campo = "'.$deleta.'"'); } } } } require_once("retorno.php"); ?> Como todo tipo de transação faria com que eu retirasse o valor do BD, o único que deveria verificar é o Status de Cancelado, para que eu pudesse retornar meu produto para o BD. Sendo assim, qualquer status diferente de cancelado retira meu produto do estoque. Assim, o código ficou menor, mais limpo e mais objetivo. Agradeço a força e as dicas passadas. Um grande abraço. Compartilhar este post Link para o post Compartilhar em outros sites