Skip to content

Instantly share code, notes, and snippets.

@marcosfreitas
Last active January 4, 2016 18:29
Show Gist options
  • Save marcosfreitas/8661404 to your computer and use it in GitHub Desktop.
Save marcosfreitas/8661404 to your computer and use it in GitHub Desktop.
<?php
header('Content-Type: application/json; charset=utf-8');
error_reporting(true);
try{
/**
* Verifica o tipo de requisição. Obrigatoriamente (porque eu quis kk) deve ser do tipo POST
*/
if(!$_SERVER['REQUEST_METHOD'] == 'POST') {
$retorno = 'Requisição Inválida';
throw new Exception($retorno, 1);
}
/**
* Inclue o arquivo da conexão do banco
*/
if(file_exists('../../databases/db.php')) {
require_once('../../databases/db.php');
}else{
$retorno = 'Arquivo do Banco de Dados não encontrado.';
throw new Exception($retorno, 1);
}
/**
* Recebe o post como o Tipo de Notificação
*/
$tipoNotificacao = $_POST['notificationType'];
/**
* Recebe o código da Notificação
*/
$codigoNotificacao = $_POST['notificationCode'];
/**
* Verificamos se tipo da notificação é transaction
*/
if($tipoNotificacao == 'transaction'){
/**
* dados de autenticação do pagseguro
*/
$ps_email = "[email protected]";
$ps_token = "HUEHUEHUE1234567890HUE";
/**
* Chama a classe para utilizar a biblioteca do pagseguro
*/
if(file_exists('../v2/PagSeguroLibrary/PagSeguroLibrary.php')){
require_once ('../v2/PagSeguroLibrary/PagSeguroLibrary.php');
}else{
$retorno = 'Biblioteca do PagSeguro não encontrada.';
throw new Exception($retorno, 1);
}
/**
* Criando objeto PagSeguroAccountCredentials
*/
$credentials = new PagSeguroAccountCredentials($ps_email,$ps_token);
/**
        * Verifica as informações da transação, e retorna
* o objeto Transaction com todas as informações
*/
$transacao = PagSeguroNotificationService::checkTransaction($credentials, $codigoNotificacao);
/**
* Retorna o objeto TransactionStatus, que vamos resgatar o valor do status
* -----------------------------------
* WAITING_PAYMENT 1 Aguardando pagamento: o comprador iniciou a transação, mas até o momento o PagSeguro não recebeu nenhuma informação sobre o pagamento.
* IN_ANALYSIS 2 Em análise: o comprador optou por pagar com um cartão de crédito e o PagSeguro está analisando o risco da transação.
* PAID 3 Paga: a transação foi paga pelo comprador e o PagSeguro já recebeu uma confirmação da instituição financeira responsável pelo processamento.
* AVAILABLE 4 Disponível: a transação foi paga e chegou ao final de seu prazo de liberação sem ter sido retornada e sem que haja nenhuma disputa aberta.
* IN_DISPUTE 5 Em disputa: o comprador, dentro do prazo de liberação da transação, abriu uma disputa.
* REFUNDED 6 Devolvida: o valor da transação foi devolvido para o comprador.
* CANCELLED 7 Cancelada: a transação foi cancelada sem ter sido finalizada.
*/
$status = $transacao->getStatus();
//$status = 3;
/**
         * Verificamos se foi realizado o pagamento para mudar no banco de dados
         * O valor 3 se referente o tipo de status, no caso informando
         * que cliente realizou o pagamento.
* CASO A TRANSACAO TENHA SIDO CANCELADA NÃO ACONTECE NADA COM A MATRICULA DO USUÁRIO, POIS POR PADRÃO ESTÁ INATIVA
         * https://pagseguro.uol.com.br/v2/guia-de-integracao/documentacao-da-biblioteca-pagseguro-em-php.html#TransactionStatus
         */
if($status->getValue() == 3){
//if($status == 3){
/**
* Pegamos o código que passamos por referência para o pagseguro
* Que no nosso exemplo é id da tabela 'transacoes_pagseguro'
*/
$id_transacao = $transacao->getReference();
// $id_transacao = 1;
/**
* ATUALIZANDO o código de notificação retornado pelo pagseguro na tabela 'transacoes_pagseguro'
* -------------
             * Esse SQL será para mudança de status do pedido ( 1 => liberado para matricula ), e informar a hora
             * da modificação do status (hora da confirmação do pagamento)
             */
$mysqli->autocommit(false);
$upd = 'UPDATE transacoes_pagseguro PS INNER JOIN matricula M ON PS.fk_id_matricula = M.id_matricula SET';
$upd .= ' M.status_matricula = 1';
$upd .= ' PS.ps_status = 1';
$upd .= ' PS.ps_id_notificacao = "'.$codigoNotificacao.'"';
$upd .= ' PS.ps_modificado = NOW()';
$upd .= ' WHERE PS.ps_id_transacao = '.$id_ONS_Transacao;
#Executa o SQL
$mysqli->query($upd);
/**
* Verifica se o número de tabelas alteradas no banco de dados é maior que ZERO
* Dispara uma exceção com o código 000 (nada alterado no banco) caso nada tenha sido alterado no BD.
* Veja tabela de Exceções.
* o número -1 identifica que o $mysqli retornou um erro
*/
if($mysqli->affected_rows == -1){
$mysqli->rollback();
//echo '3'.$mysqli->error;
$retorno = 'Houve um erro na atualização dos dados.';
throw new Exception($retorno, 1);
}else{
$mysqli->commit();
$retorno[0] = 'sucesso';
echo json_encode($retorno);
}
}#fim status->getValue() == 3
else{
$retorno[0] = 'código diferente';
echo json_encode($retorno);
}
}#fim tipo notificação
else{
$retorno[0] = 'tipo de notificação diferente';
echo json_encode($retorno);
}
# Dispara a Exceção
var_dump($retorno);
}catch (Exception $e) {
$array[0] = $e->getMessage(); //erro crítico
echo json_encode($array);
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment