Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Post do PagSeguro para classe do Framework sem passar pelo login Bom dia meus caros, Após finalizar uma venda pelo PagSeguro, preciso receber o retorno automático da transação enviado pelo sistema deles, por meio de um POST conforme abaixo: POST http://minha_url_de_retorno HTTP/1.1 Host:pagseguro.uol.com.br Content-Length:85 Content-Type:application/x-www-form-urlencoded notificationCode=766B9C-AD4B044B04DA-77742F5FA653-E1AB24 notificationType=tr...
BJ
Post do PagSeguro para classe do Framework sem passar pelo login  
Fechado
Bom dia meus caros,

Após finalizar uma venda pelo PagSeguro, preciso receber o retorno automático da transação enviado pelo sistema deles, por meio de um POST conforme abaixo:

POST minha_url_de_retorno HTTP/1.1
Host:pagseguro.uol.com.br
Content-Length:85
Content-Type:application/x-www-form-urlencoded
notificationCode=766B9C-AD4B044B04DA-77742F5FA653-E1AB24
notificationType=transaction

O fato é que de dentro do Adianti não consigo receber esse POST, fiz um teste em PHP fora do adianti, pra ter certeza que o post estava sendo enviado, usando o código abaixo:


  1. <?php
  2. if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction')
  3. {
  4.     $email 'email@registradonopagseguro.com';
  5.     $token 'TOKEMGERADOPELOPAGSEGURO';
  6.     $code $_POST['notificationCode'];
  7.     $url 'https://ws.sandbox.pagseguro.uol.com.br/v3/transactions/notifications/'.$code.'?email=' $email '&token=' $token;
  8.     $curl curl_init($url);
  9.     curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
  10.     curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
  11.     $transactionCurl curl_exec($curl);
  12.     curl_close($curl);
  13.     $xml simplexml_load_string($transactionCurl);
  14.     $log fopen($xml->code.'.xml','w+');
  15.     fwrite($log,'reference='.$xml->reference.' | status='.$xml->status.' | date='.$xml->date);
  16.     fclose($log);
  17. }
  18. ?>


e o arquivo 63AE97B2-8F56-4FF3-9DA1-D7E0DBDB45C8.xml foi gerado perfeitamente, com o conteúdo obtido do POST do PagSeguro, conforme abaixo:

reference=22 | status=3 | date=2016-02-16T23:17:40.000-02:00

Conclusão

Depois de 3 meses de muito trabalho, apoiado por essa ferramente fora de série que é o Adianti Framework, estou literalmente trabalhando no último requisito do sistema, e apenas isso me impede finalizar e entregar o sistema ao meu cliente, e nos últimos 4 dias estou batendo cabeça com isso mas não consigo resolver essa parada.

Tenho certeza absoluta que o Adianti Framework, que é uma ferramenta voltada para criação de soluções na área da automação comercial oferece uma solução pra essa situação, eu apenas ainda não a encontrei, me recuso a acreditar que terei que sujeitar ao sistema o uso de uma rotina fora do Framework para fazer isso funcionar, tudo se resume a tratamento de POST externo.

Conto com a ajuda dos amigos mais experientes para me apoiar nessa empreitada.

Agradeço a atenção de todos.

Cordialmente

Beto.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (6)


BJ

Vamos lá pessoal, sei que é um assunto chato e isolado, mas pros feras do adianti isso deve ser brincadeira, tô precisando muito dessa solução.
AM

Beto

Tu podes usar a função simplexml_load_file para importar o XML.
Exemplo

$xml = simplexml_load_file('arquivo.XML');
Foreach ( $xml->children() as $elemento => $valor)
{
Echo "$elemento -> $valor";
}
BJ

Olá Alexsander.

Agradeço o seu retorno e atenção, mas no exemplo, que apresentei, quando eu gero o log consigo extrair informações do xml sem problemas, inclusive esse exemplo funciona normalmente.

Minha necessidade "éra" conseguir fazer isso funcionar dentro no meu sistema, ou seja de dentro do projeto adianti, com as devidas proteções e recursos do Framework, conforme o exemplo abaixo, para de posse dos dados do xml, poder conectar o banco por meio de uma transação e registrar o retorno.

No primeiro exemplo, a url que configurei no PagSeguro foi algo assim, www.meudomino.com.br/pagseguro/retorno.php, e quando uma transação é concluída no pagseguro ele envia um POST para esta url e usando o código do exemplo acima, consigo obter o POST, tratar os dados, fazer a consulta de retorno (curl_exec($curl)) e obter o xml para dai registrar o retorno que está no xml no banco de dados.

No entanto o que eu precisava era que isso acontecesse dentro do meu projeto, usando o Adianti, conforme a ideia do exemplo abaixo:


  1. <?php
  2. class PagSeguroRetorno extends TPage
  3. {
  4.     public function __construct$param )
  5.     {
  6.         parent::__construct();
  7.         
  8.     if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction')
  9.     {
  10.             $email 'email@registradonopagseguro.com';
  11.             $token 'TOKEMGERADOPELOPAGSEGURO';
  12.             $code $_POST['notificationCode'];
  13.             $url 'https://ws.sandbox.pagseguro.uol.com.br/v3/transactions/notifications/'.$code.'?email=' $email '&token=' $token;
  14.             $curl curl_init($url);
  15.             curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
  16.             curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
  17.             $transactionCurl curl_exec($curl);
  18.             curl_close($curl);
  19.             $xml simplexml_load_string($transactionCurl);
  20.             $log fopen($xml->code.'.xml','w+');
  21.             fwrite($log,'reference='.$xml->reference.' | status='.$xml->status.' | date='.$xml->date);
  22.             fclose($log);
  23.             
  24.             
  25.             try
  26.             {
  27.                 TTransaction::open('aplicacao');
  28.                 $retorno = new Retorno;
  29.                 $retorno->reference $xml->reference;
  30.                 $retorno->status $xml->status;
  31.                 $retorno->date $xml->date;
  32.                 $retorno->store();
  33.                             TTransaction::close(); 
  34.             }
  35.             catch (Exception $e
  36.             {
  37.                 $log fopen('erro.log','w+');
  38.                 fwrite($log,$e->getMessage());
  39.                 fclose($log);
  40.                         TTransaction::rollback(); // undo all pending operations
  41.             }
  42.     }
  43.     }
  44. }    
  45. ?>


Neste exemplo a url que eu configuraria no PagSeguro, seria semelhante a esta:

www.meudomino.com.br/minhaaplicacao/index.php?class=PagSeguroRetorno

Quando eu finalizasse uma transação no PagSeguro ele enviaria o POST para esta url e após obter o xml, eu armazenaria o retorno ele no banco de dados da minha aplicação.

Infelizmente não obtive retorno do grupo, e nem mesmo um "cidadão daí do grupo", que se "ofereceu" para "resolver" esse problema e para tal me cobrou ( e eu paguei R$ 200,00 ), mesmo "não" me entregando uma solução que funcionasse em produção. A suposta solução não gerava nada quando o POST era enviado do PagSeguro, e depois de dois dias batendo a cabeça com o código que ele me entregou, pedi ajuda a mesmo e o pouco caso foi excepcional!!!

No dia em que combinei de fazer o depósito do valor, argumentei com ele sobre todo o ocorrido e a sua posição foi afirmar que o servidor estava com problema, um servidor que roda uma aplicação feita no Adianti sem qualquer problema, e que até o código php que eu fiz com base em exemplo da internet funcionava perfeitamente, sim este servidor, segundo o cidadão estava com problema.

Diante dessa situação, o que fiz foi criar uma outra pasta no domínio, usar o código do primeiro exemplo, criar uma classe de conexão PDO TConnection, um arquivo ini, e por meio dessa classe fazer os devidos registros no banco de dados, após obter o xml de retorno. Eu outras palavras "uma gambiarra", porque se não fizesse assim, nunca entregaria o sistema ao cliente.

Com esta "gambiarra" o sistema recebe o POST e registra o retorno normalmente no banco de dados.

Acredito que esta explicação deixe bem claro qual "era" a minha necessidade no dia 17, mas como sei que essa é apenas uma lista voluntária, e que cada um faz o que pode e o que quer, sem compromisso com o Framework, porque, até quem é pago age de forma relapsa e descomprometida, imagina aqueles que são voluntários..rsrs.

Mais uma vez agradeço a sua atenção e boa vontade Alexsander.

Cordialmente

Beto.
PD

Beto,

Você precisa a classe PagSeguroRetorno pública tal qual a classe LoginForm já é.
Para tal, precisará adicionar uma regra de exclusão no engine.php.

Como seu "retorno" do POST não precisará mostrar nada em tela, uma vez que não
há usuário envolvido nesse POST de volta, não precisará usar o index.php, mas sim o engine.php.
Também sugiro criar um método para receber o retorno. Assim sua URL ficará:
caminho-do-sistema/engine.php?class=PagSeguroRetorno&method=onRe

Se tivesse usuário na história, precisaria alterar também o index.php, por que lá tem um IF que
verifica o "logged" que vai vir false. Teria de alterar para ele não carregar o login.html nessa situação.

Att,
Pablo
BJ

Olá Pablo.

Grato pelo retorno, mas como o sistema já está em produção, não vou mais mexer nele, no entanto assim que eu puder hospedarei o projeto do cliente em um subdomínio do meu domínio, e de posse das suas dicas tentarei fazer isso funcionar, e se funcionar postarei o código aqui para referência futura.

Cordialmente,
Beto.
EA

Beto, olá! Tenho interesse na sua solução para o pagseguro, pagando é claro. Podemos falar? obrigado