A biblioteca fica no git (https://github.com/pagseguro/pagseguro-php-sdk ) sendo instalada pelo Composer:
composer require pagseguro/pagseguro-php-sdk
Verificar no composer.json se a linha referente a biblioteca foi adicionada:
"require": {
"pagseguro/pagseguro-php-sdk": "^4.2"
Incluir no arquivo as variáveis
PAGSEGURO_EMAIL=
PAGSEGURO_TOKEN=
PAGSEGURO_AMBIENTE=sandbox
Coloque as suas informações, estou usando o perfil de vendedor do sandbox (https://sandbox.pagseguro.uol.com.br/vendedor/configuracoes.html)
<script src="{{ asset('js/jquery-3.3.1.min.js') }}"></script>
/resources/views/shared/ligthbox.blade.php
@if('sandbox' == env('PAGSEGURO_AMBIENTE'))
<script type="text/javascript"
src="https://stc.sandbox.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.lightbox.js">
</script>
@else
<script type="text/javascript"
src="https://stc.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.lightbox.js">
</script>
@endif
Para o processo de criação do pagamento, criei 3 funções javascript para: criar a requisição de pagamento, abrir a Ligthbox e registrar o pagamento.
/resources/views/shared/ligthbox.blade.php
function criaRequisicao(id){
$.get( "requisicao/" + id, function( data ) {
}).done(function(data) {
abrePagseguro(data, id)
}).fail(function() {
}).always(function() {
});
}
/resources/views/shared/ligthbox.blade.php
function abrePagseguro(code, id){
var isOpenLightbox = PagSeguroLightbox({
code: code
}, {
success : function(transactionCode) {
criaPagamento(transactionCode, id);
},
abort : function() {
}
});
// Redirecionando o cliente caso o navegador não tenha suporte ao Lightbox
if (!isOpenLightbox){
@if('sandbox' == env('PAGSEGURO_AMBIENTE'))
location.href="https://sandbox.pagseguro.uol.com.br/v2/checkout/payment.html?code="+code;
@else
location.href="https://pagseguro.uol.com.br/v2/checkout/payment.html?code="+code;
@endif
}
}
/resources/views/shared/ligthbox.blade.php
function criaPagamento(code, id){
var token = '{{csrf_token()}}';
$.post( "pagar",{'code': code, 'assinatura_id' : id , '_token': token },
function( data ) {
}).done(function(data) {
location.reload();
}).fail(function() {
}).always(function() {
});
}
php artisan make:controller PagseguroController
Inclua esses imports
use PagSeguro\Configuration\Configure;
use PagSeguro\Services\Session as PagseguroSession;
use PagSeguro\Domains\Requests\Payment as PagseguroPayment;
use PagSeguro\Services\Transactions\Search\Code as PagseguroSearchCode;
use PagSeguro\Services\Transactions\Notification as PagseguroNotification;
use PagSeguro\Helpers\Xhr;
use PagSeguro\Parsers\Transaction\Response as PagseguroResponse;
public function __construct()
{
$this->_configs = new Configure();
$this->_configs->setCharset('UTF-8');
$this->_configs->setAccountCredentials(env('PAGSEGURO_EMAIL'), env('PAGSEGURO_TOKEN'));
$this->_configs->setEnvironment(env('PAGSEGURO_AMBIENTE'));
//pode ser false
$this->_configs->setLog(true, storage_path('logs/pagseguro_'. date('Ymd') .'.txt'));
}
public function getCredenciais()
{
return $this->_configs->getAccountCredentials();
}
public function criaRequisicao($assinatura_id)
{
try {
$assinatura = Assinatura::findOrFail($assinatura_id);
$pagamento = new PagseguroPayment();
$pagamento->setCurrency('BRL');
//referência interna do pagamento ao sistema
$pagamento->setReference($assinatura_id);
//pegar valores do plano selecionado na tela
$pagamento->addItems()->withParameters(
$assinatura->id,
$assinatura->plano->nome,
1,
$assinatura->plano->valor
);
//pegar do usuario logado
$pagamento->setSender()->setName(Auth::user()->name);
$pagamento->setSender()->setEmail(Auth::user()->email);
//pegar cpf ou cnpj do usuario logado
if(Auth::user()->cliente->cpf_cnpj){
$pagamento->setSender()->setPhone()->withParameters(
Auth::user()->cliente->tipo_cpf_cnpj,
Auth::user()->cliente->cpf_cnpj
);
}
//pegar telefone do usuario logado
if(Auth::user()->cliente->telefone){
$pagamento->setSender()->setPhone()->withParameters(
Auth::user()->cliente->telefone_ddd,
Auth::user()->cliente->telefone
);
}
$onlyCheckoutCode = true;
$result = $pagamento->register($this->getCredenciais(),$onlyCheckoutCode);
return $result->getCode();
} catch (Exception $e) {
die($e->getMessage());
}
}
public function criaPagamento(Request $request)
{
try{
$pagamento = new Pagamento();
$pagamento->assinatura_id = $request->assinatura_id;
$pagamento->transacao = $request->code;
$pagamento->status_codigo = 1;
$pagamento->status = 'Aguardando Pagamento';
if($pagamento->save()){
return true;
} else {
throw new Exception("Error ao salvar");
}
} catch (Exception $e) {
logger($e->getMessage());
}
}
Route::get('/pagamento/requisicao/{assinatura_id}'
,'PagseguroController@criaRequisicao')->middleware('auth')->name('requisicao');
Route::post('/pagamento/pagar'
,'PagseguroController@criaPagamento')->middleware('auth')->name('pagar');
Os passos configuram sua aplicação para abrir o Checkout no Ligthbox do Pagseguro.
Route::post('/pagamento/notificacao', 'PagseguroController@verificaNotificacao')->name('notificacao');
public function verificaNotificacao(Request $request)
{
try {
if (Xhr::hasPost()) {
$response = PagseguroNotification::check(
$this->getCredenciais()
);
self::atualizaPagamento($response);
} else {
throw new Exception('Código invalido');
}
} catch (Exception $e) {
logger($e->getMessage());
}
}
public function atualizaPagamento(PagseguroResponse $data)
{
try {
$pagamento = Pagamento::where('code', $data->getCode())->first();
$pagamento->status_codigo = $data->getStatus();
$pagamento->status = Config::get('constants.status_pagseguro.' . $data->getStatus());
if(!$pagamento->save()){
throw new Exception('Não doi possivel atualizar o pagamento');
}
} catch (Exception $e) {
logger($e->getMessage());
// die($e->getMessage());
}
}
return [
'status_pagseguro' => [
'1' => 'Aguardando pagamento',
'2' => 'Em análise',
'3' => 'Paga',
'4' => 'Disponível',
'5' => 'Em disputa',
'6' => 'Devolvida',
'7' => 'Cancelada'
]
];