PagSeguro UOL

Olá, pessoal,

Alguém já fez a integração do PagSeguro do UOL com o Yii?

Poderia compartilhar a experiência, problemas encontrados e melhor solução adotada? Optou por carrinho próprio ou carrinho PagSeguro?

Grato,

:)

Abraços!

Junior,

Usei no site de jogo de um cliente, com retorno automático!

Qual a sua nescessidade?

Obrigado por responder, Newerton

Tenho várias dúvidas que ficaria muito grato se pudesse me orientar no que já experimentou.

O site que estou desenvolvendo é esse: http://www.ofertagora.com.br

Neste site cada fornecedor terá sua conta no PagSeguro (vários tokens - sem problemas).

Estive pesquisando em fóruns e comunidades e vi que muita gente tem problemas com o retorno automático principalmente no que diz respeito ao PagSeguro não conseguir enviar para uma URL com query string. No exemplo do próprio PagSeguro, eles informam uma url com query string…isso é estranho e confuso. Ele faz tanto uma chamada GET como uma POST para a mesma URL certo? Como fica isso? Se eu quero mostrar alguns dados do pedido ao cliente por exemplo: seu pedido de número XXX foi inserido com sucesso, Fulano de tal.

Também, queria saber do se a opção foi pelo carrinho próprio ou do PagSeguro, pois li em alguns fóruns pessoas que optaram pelo carrinho do PagSeguro e não estavam recebendo o retorno automático mesmo depois de configurar na conta.

Outro ponto é o frete. Os correios mudaram o cálculo de PAC, mas no cálculo do PagSeguro a gente só tem por peso e fixo. Como fica o PAC neste caso?

Estive pensando em criar um módulo para PagSeguro, de repente até compartilhar nas extensões pra facilitar a vida de quem precisar utilizar com Yii.

De antemão, muito obrigado pelo compartilhamento de informações.

Um abraço!

:)

Estou trabalhando com essa integração no momento. Quando tiver algo pronto eu publico em extensões.

Junior,

Desculpe a demora, vou explica resumidamente o que eu fiz.

E um site de venda de créditos pro jogo, e cada item vai pro pagseguro, como se fosse doação, so que no <form> do pagseguro, tem um <input hidden/> com o código de referencia, só tem esse item que pode ser manipulado na hora de ir pro pagseguro, e quando o pagseguro retornar os dados, esse código de referência vem junto.

Sobre as opções de Frete deixei pro PagSeguro.

Vou postar abaixo o código de retorno que usei.

RetornoController.php




class RetornoController extends Controller {


    public function actionIndex() {


        $retorno_token = '';


        $PagSeguro = 'Comando=validar';

        $PagSeguro .= '&Token=' . $retorno_token;

        $Cabecalho = "Retorno PagSeguro";


        foreach ($_POST as $key => $value) {

            $value = urlencode(stripslashes($value));

            $PagSeguro .= "&$key=$value";

        }


        if (function_exists('curl_exec')) {

            $curl = true;

        } elseif ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://pagseguro.uol.com.br', 443, $errno, $errstr, 30))) {

            $fsocket = true;

        } elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $errno, $errstr, 30)) {

            $fsocket = true;

        }


        if ($curl == true) {


            $ch = curl_init();


            curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');

            curl_setopt($ch, CURLOPT_POST, true);

            curl_setopt($ch, CURLOPT_POSTFIELDS, $PagSeguro);

            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);


            curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');

            $resp = curl_exec($ch);


            curl_close($ch);

            $confirma = (strcmp($resp, "VERIFICADO") == 0);

        } elseif ($fsocket == true) {

            $Cabecalho = "POST /Security/NPI/Default.aspx HTTP/1.0\r\n";

            $Cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n";

            $Cabecalho .= "Content-Length: " . strlen($PagSeguro) . "\r\n\r\n";


            if ($fp || $errno > 0) {

                fputs($fp, $Cabecalho . $PagSeguro);

                $confirma = false;

                $resp = '';

                while (!feof($fp)) {

                    $res = @fgets($fp, 1024);

                    $resp .= $res;

                    if (strcmp($res, "VERIFICADO") == 0) {

                        $confirma = true;

                        break;

                    }

                }

                fclose($fp);

            } else {

                echo "$errstr ($errno)<br />\n";

            }

        }




        if ($confirma) {


            // Recebendo Dados

            $TransacaoID = $_POST['TransacaoID'];

            $VendedorEmail = $_POST['VendedorEmail'];

            $Referencia = $_POST['Referencia'];

            $TipoFrete = $_POST['TipoFrete'];

            $ValorFrete = $_POST['ValorFrete'];

            $Extras = $_POST['Extras'];

            $Anotacao = $_POST['Anotacao'];

            $TipoPagamento = $_POST['TipoPagamento'];

            $StatusTransacao = $_POST['StatusTransacao'];

            $CliNome = $_POST['CliNome'];

            $CliEmail = $_POST['CliEmail'];

            $CliEndereco = $_POST['CliEndereco'];

            $CliNumero = $_POST['CliNumero'];

            $CliComplemento = $_POST['CliComplemento'];

            $CliBairro = $_POST['CliBairro'];

            $CliCidade = $_POST['CliCidade'];

            $CliEstado = $_POST['CliEstado'];

            $CliCEP = $_POST['CliCEP'];

            $CliTelefone = $_POST['CliTelefone'];

            $NumItens = $_POST['NumItens'];

            $user = explode('_', $_POST['Referencia']);

            $name = $user[0];

            $coddoacao = $user[1];

            $servidor = $user[2];

            

            if ($servidor == 'lowrate') {

                $database = "db2";

            } else if ($servidor == 'highrate') {

                $database = "db3";

            } else {

                $database = "db2";

            }







            if ($TransacaoID <> '') {


                $select = "SELECT TransacaoID FROM pagsegurotransacoes WHERE TransacaoID = '{$TransacaoID}'";

                $countTransacao = Yii::app()->db->createCommand($select)->query()->getRowCount();


                if ($countTransacao == 0) {

                    $insert = "INSERT into pagsegurotransacoes SET TransacaoID='$TransacaoID',

                    VendedorEmail='$VendedorEmail', Referencia='$Referencia',TipoFrete='$TipoFrete',

                    ValorFrete='$ValorFrete', Extras='$Extras',

                    Anotacao='$Anotacao', TipoPagamento='$TipoPagamento',

                    StatusTransacao='$StatusTransacao', CliNome='$CliNome',

                    CliEmail='$CliEmail', CliEndereco='$CliEndereco',

                    CliNumero='$CliNumero', CliComplemento='$CliComplemento',

                    CliBairro='$CliBairro', CliCidade='$CliCidade',

                    CliEstado='$CliEstado', CliCEP='$CliCEP',

                    CliTelefone='$CliTelefone', NumItens='$NumItens',

                    coddoacao = '{$coddoacao}', Data=now();";


                    Yii::app()->db->createCommand($insert)->execute();

                } else if ($countTransacao >= 1) {

                    $update = "UPDATE pagsegurotransacoes SET 

                    TipoPagamento = '{$TipoPagamento}',

                    StatusTransacao = '{$StatusTransacao}'

                    WHERE TransacaoID = '{$TransacaoID}'";

                    Yii::app()->db->createCommand($update)->execute();


                    if ($TipoPagamento == 'Cartão de Crédito') {

                        if ($StatusTransacao == 'Aprovado') {

                            /**

                             * Doação

                             */

                            $userSql = "SELECT * FROM doacao WHERE coddoacao = '{$coddoacao}'";

                            $d = Yii::app()->db->createCommand($userSql)->query()->read();


                            /**

                             * ID do users

                             */

                            $userGame = "SELECT * FROM users WHERE name = '{$name}'";

                            $idUser = Yii::app()->$database->createCommand($userGame)->query()->read();


                            /**

                             * Inserindo o valor para o usuário

                             */

                            $usercash = "call usecash({$idUser["ID"]}, 1, 0, 1, 0, {$d["usecash"]}00, 1, @error);";

                            Yii::app()->$database->createCommand($usercash)->execute();

                        }

                    } else {

                        if ($StatusTransacao == 'Completo') {

                            /**

                             * Doação

                             */

                            $userSql = "SELECT * FROM doacao WHERE coddoacao = '{$coddoacao}'";

                            $d = Yii::app()->db->createCommand($userSql)->query()->read();


                            /**

                             * ID do users

                             */

                            $userGame = "SELECT * FROM users WHERE name = '{$name}'";

                            $idUser = Yii::app()->$database->createCommand($userGame)->query()->read();


                            /**

                             * Inserindo o valor para o usuário

                             */

                            $usercash = "call usecash({$idUser["ID"]}, 1, 0, 1, 0, {$d["usecash"]}00, 1, @error);";

                            Yii::app()->$database->createCommand($usercash)->execute();

                        }

                    }

                }

            }

        }

        $this->render('index');

    }


}



Como pode ver, o $user = explode(’_’, $_POST[‘Referencia’]); e a Referência que pode ser manipulada, tipo o ID do cliente, para na hora que retornar tu saber onde alterar ou buscar o nome dele, para enviar o e-mail.

Observa o trampo, conectei em 3 banco de dados também hehe

Vou postar o banco de dados.




CREATE TABLE IF NOT EXISTS `pagsegurotransacoes` (

  `TransacaoID` varchar(36) NOT NULL,

  `VendedorEmail` varchar(200) NOT NULL,

  `Referencia` varchar(200) default NULL,

  `TipoFrete` char(2) default NULL,

  `ValorFrete` decimal(10,2) default NULL,

  `Extras` decimal(10,2) default NULL,

  `Anotacao` text,

  `TipoPagamento` varchar(50) NOT NULL,

  `StatusTransacao` varchar(50) NOT NULL,

  `CliNome` varchar(200) NOT NULL,

  `CliEmail` varchar(200) NOT NULL,

  `CliEndereco` varchar(200) NOT NULL,

  `CliNumero` varchar(10) default NULL,

  `CliComplemento` varchar(100) default NULL,

  `CliBairro` varchar(100) NOT NULL,

  `CliCidade` varchar(100) NOT NULL,

  `CliEstado` char(2) NOT NULL,

  `CliCEP` varchar(9) NOT NULL,

  `CliTelefone` varchar(14) default NULL,

  `NumItens` int(11) NOT NULL,

  `Data` datetime NOT NULL,

  `status` tinyint(1) unsigned NOT NULL default '0',

  `coddoacao` int(4) NOT NULL,

  PRIMARY KEY  (`TransacaoID`),

  UNIQUE KEY `TransacaoID` (`TransacaoID`,`StatusTransacao`),

  KEY `Referencia` (`Referencia`),

  KEY `status` (`status`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;



Se precisar de ajuda pra montar, to ae!

To tentando achar o retorno automático do paypal, enviar pra ele eu já fiz, só não achei uma explicação em Portugues dele, e o Manual em Inglês fico até perdido da quantidade de váriavel que tem para manipular.

Bom e isso, vamo mexe o doce com esse Yii hehe

Esqueci de ressaltar.

Tem um PagSeguro Server.

http://code.google.com/p/pagsegurodotnet/

Agora tu pode testar localmente sua aplicação, antes de enviar pro PagSeguro

Cara, sensacional, melhor que isso só dois disso!!

Muito obrigado mesmo!! Suas dicas vão ajudar pra caramba!

Eu estou trocando minha aplicação de servidor porque o UOLHOST pisou na bola comigo, assim que eu terminar vou retomar o PagSeguro…agora já com mais noção do pega…heh

vlws!!

abraços!!

:)

Seria o melhor dos mundos, sem dúvida, para toda a comunidade.

Se eu conseguir progresso antes, posto a solução para vocês também, camaradas!

Abraços!

Oi Newton,

Eu vi que vc usou a ‘ReferenciaTransacao’ pra trafegar dados do Gameserver + PlayerName.

A minha dúvida é:

Vc sab q uma transacao PagSeguro inclui dados do cliente, como nome, telefone, endereco… etc. Então:

1- Porque vc usou o atributo ‘ReferenciaTransacao’ em vez de ‘CliNome’ para setar o PlayerName?

2- Por acaso numa doação o PagSeguro ignora os dados de cliente?

3- Por acaso numa doação o PagSeguro ignora os dados de produto (como id)?

Ola Fabrício!

Primeiramente, é Newerton! hehe

1- Porque vc usou o atributo ‘ReferenciaTransacao’ em vez de ‘CliNome’ para setar o PlayerName?

O site não tem cadastro de Usuário, o unico cadastro e login, email e senha!

2- Por acaso numa doação o PagSeguro ignora os dados de cliente?

Não ignora, posso enviar os dados do cliente, caso ele tenha registro no site.

3- Por acaso numa doação o PagSeguro ignora os dados de produto (como id)?

Quando tu enviar o <form> pro pagseguro, tu tem que enviar o ID do produto.

Obs.: Sobre os dados do cliente e sobre o produto eu já fiz alguns site ENVIANDO os dados, nunca usei o retorno, até por que só esse ano que conseguir trabalhar com retorno por que achei um blog explicando como faz.

Mais se eu não me engano o retorno do pagseguro, retorna alguns dados do cliente sim, mais isso tem o PagSeguro Server, uma aplicação que tu pode testar localmente.

Para galera que futuramente vão trabalhar com PagSeguro, existe uma nova documentação.

API de Integração V2.

https://pagseguro.uol.com.br/v2/guia-de-integracao/index.html

Olhei meio por cima, mais não ache ainda o Sandbox, ou alguma área para teste.

Finalmente fizeram uma API nova, a API do pagseguro sempre foi uma coisa horrenda.

Espero que tenham feito direito dessa vez.

Olá a todos.

Tenho implantado no site de compras coletivas, o modulo PagSeguro.

Se precisarem de alguma coisa, estou a disposição.

O que estou tentando achar é a implantação Cielo no yii.

Se alguem tiver algum material.

Vou postar minha dúvida no forum.

Abraço.

Pior que era feia a API anterior, era o Básico do Básico!

Pelo que vi, agora você pode fazer verificação do Status da Transação, caso dê problema no Retorno Automático.

So falto um Sandbox para teste, eu tenho um aplicativo em .NET PagSeguro Server, que tem como trabalhar com Retorno Automatico com ele, espero que a nova versão deste programa já venha com as funções da nova API, senão lasco.

Cara Parabéns, Muito bom vai me ajudar também :D

Blz Newerton

Como eu ja disse em outro momento estou fazendo uma loja virtual e sou muito leigo nesta area ainda kkk

Me explica uma coisa tenho uma carrinho de compra que apos ele finalizar ele enviar as informaçoes do pagseguro, entao devo criar uma tabela com as informaçoes do pedido separada do retorno?

Ai eu vinculo o pedido com esta tabela de retorno, pois gostaria que o usuario acompanhe-se pelo site.

E quando o pedido for confirmado, queria que altera-se o estoque do produto e caso fosse nao aprovado retorna-se para o estoque.

Pois nesta mesma tabela do pedido quero colocar um campo para que o admim colocase o codigo de rastreio.

Vi que a v2.0 ficou mais facil o envio, o problema é que eu nao sei como poderia testar isso tb.

Desculpa ai Newerton é que sou muito leigo mesmo com o pagseguro entao vc poderia me ajudar no meu raciocinio como faria isso e atravez do seu codigo daria para fazer isso.

Valew brodi

De uma olhada neste link:

http://dourado.net/2011/06/09/retorno-automatico-de-dados-do-pagseguro-em-phpmysql-com-produtos-versao-2-0/

Edson,

Você vai precisar criar uma tabela ‘pagsegurotransacoes’, como postei anteriormente.

Você vai precisa enviar uma váriavel de referência, que quando retornas os dados do retorno automático, você vai pegar essa referência e jogar na tabela pedido, e mudar o status conforme desejar.




<form target="pagseguro" method="post"   

action="https://pagseguro.uol.com.br/v2/checkout/payment.html">  

....

<input type="hidden" name="reference" value="REF1234">

....

</form>



Esse ‘reference’ que vai retornar sempre no retorno automático eu sempre uso o ID do Pedido, ai sei que quando eu receber os dados do pagseguro pelo retorno, vou pegar este $_POST[‘reference’] e atualizar o pedido.

Ai você pode atualizar o estoque, fazer o que quizer com o ‘reference’.

Tenho uma sandbox fake da API v.2, mais não utilizei ainda, serve para testar o retorno automatico localmente:

http://code.google.com/p/sandbox-pagseguro-fake/

O que o pagseguro peca e neste quesito te não ter sandbox. Eu ainda quero testar o Moip, dizem que as taxas são menores e ainda mais tem sandbox.

Rêf.: https://pagseguro.uol.com.br/v2/guia-de-integracao/pagamento-via-html.html

Legal Newerton,

Como funcione este sandbox ele server para testar o envio ou so retorno.

valew

Não sei exatamente como funciona, ainda não testei, mais espero que seja pra envio e retorno.

Mais no link que você postou:

http://dourado.net/2011/06/09/retorno-automatico-de-dados-do-pagseguro-em-phpmysql-com-produtos-versao-2-0/

O dourado mostra no quinto paragrafo que tem um arquivo dele mesmo que serve para testar o retorno automático.

Valew vou testar

Alguem saberia como fazer para configurar no pagseguro a opçao de 5 vez sem juros e mais que isso tem juros.

E como simular isso na pagina do produto.

Valew