michaeldouglas / laravel-pagseguro

Integração com o gateway de pagamento pagseguro, para utilização com o Laravel
357 stars 119 forks source link

Receber Notificacao em Callback #81

Closed edsonrodsilva closed 7 years ago

edsonrodsilva commented 7 years ago

Porque eu não consigo receber as notificacão do pagseguro vejam como esta meu callback. O objetivo é tratar as notificacoes no metodo notification do meu controller Por favor alguem me da uma luz.

'routes' => [ 'redirect' => [ 'route-name' => 'pagseguro-retorno', // Criar uma rota com este nome ], 'notification' => [ 'callback' => ['\app\Http\Controllers\Loja\CheckoutController', 'notification'], // Callable callback to Notification function (notificationInfo) : void {} 'credential' => 'default', // Callable resolve credential function (notificationCode) : Credentials {} 'route-name' => 'pagseguro-notificacao', // Criar uma rota com este nome ], ],

isaquesb commented 7 years ago

@edsonrodsilva

Geralmente o callback é um classe de negócio, ou mesmo uma classe simples para resolver um determinado problema, nesse caso, a resposta do PagSeguro. Um controller é uma classe "complexa" do framework que serve apenas para tratar as requisições que são feitas. Para instanciar um controller geralmente é necessário uma série de injeções (App, Request, Response, etc...) que geralmente o framework quem faz.

Resumindo, não use controllers no callback. Use uma classe simples.

edsonrodsilva commented 7 years ago

Olá Isaque,

Cara ja tentei de tudo, você poderia dar um exemplo de utilizacao?

Apenas desta forma consigo o retorno do pagseguro, fazendo um log.

'routes' => [ 'notification' => [ 'callback' => function ($information) { // Callable \Log::debug(print_r($information, 1)); }, ], ],

Mas eu apenas gastaria de passar isto para uma classe qualquer e um metodo, iqual este exemplo: 'callback' => ['MyNotificationClass', 'myMethod'], // Callable

Mas nao entendo porque nao funciona, veja como esta no meu config.

'routes' => [ 'redirect' => [ 'route-name' => 'pagseguro-retorno', // Criar uma rota com este nome ], 'notification' => [ //'callback' => ['app\Http\Services\PedidoServices', 'notification'], // 'callback' => ['PedidoService', 'notification'], // Callable 'credential' => 'default', // Callable 'route-name' => 'pagseguro-notificacao', // Criar uma rota com este nome ], ],

Minha rota esta assim: Route::post('/pagseguro/notificacao', [ 'uses' => '\laravel\pagseguro\Platform\Laravel5\NotificationController@notification', 'as' => 'pagseguro-notificacao', ]);

Valeu.

isaquesb commented 7 years ago

@edsonrodsilva

Não esta funcionando porque possivelmente não esta sendo encontrado essa classe "PedidoService", ou não há o método notification nessa classe, ou coisas assim, tornando o callable inválido.

Tenta simular isso num controller / action qualquer (ou criar um teste) para verificar se sua classe / método estão ok:

$callable =  function ($information) { // Callable
    $myObject = new \PedidoService();
    $notify = $myObject->notification($information);
}
$callable('ABC');

O objetivo disso é ver se há problemas com PedidoService:notification Se funcionar é um callable válido.

Obs.: Pelo que você escreveu "['PedidoService', 'notification']" a classe PedidoService não tem um namespace. Tente colocar a classe completa caso esse PedidoService seja um alias do Laravel para acessar outra classe.

Ou você implementa o callback como no exemplo que fiz acima para ficar assim:

'notification' => [
    'callback' => function ($information) { // Callable
        $service = new \PedidoService();
        $service->notification($information);
    }
    'credential' => 'default', // Callable
    'route-name' => 'pagseguro-notificacao', // Criar uma rota com este nome
],

De qualquer forma, não esqueça de se certificar que esse callable é válido antes de usar.