Skip to content

Instantly share code, notes, and snippets.

@dimaspante
Last active May 9, 2022 19:13
Show Gist options
  • Save dimaspante/1ff138d9e0129111e86d11e939f6f881 to your computer and use it in GitHub Desktop.
Save dimaspante/1ff138d9e0129111e86d11e939f6f881 to your computer and use it in GitHub Desktop.
Exemplo de post de notificação e-commerce Cielo + antifraude Braspag
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json");
require_once '../vendor/autoload.php';
use Cielo\API30\Ecommerce\Browser;
use Cielo\API30\Ecommerce\CartItem;
use Cielo\API30\Ecommerce\FraudAnalysis;
use Cielo\API30\Merchant;
use Cielo\API30\Ecommerce\Environment;
use Cielo\API30\Ecommerce\Sale;
use Cielo\API30\Ecommerce\CieloEcommerce;
use Cielo\API30\Ecommerce\Payment;
use Cielo\API30\Ecommerce\CreditCard;
use Cielo\API30\Ecommerce\MerchantDefinedField;
use Cielo\API30\Ecommerce\Request\CieloRequestException;
/*
* Cielo Checkout - URL de Notificação (retorno de compra)
*
* A Cielo/Braspag vai enviar dados via POST para esta página depois que
* uma compra for efetuada pelo site (Captura / Cancelamento / Sondagem)
*
* Retornos de mudança possíveis para cartão de crédito:
*
* 1 Mudança de status do pagamento
* 3 Mudança de status do Antifraude
* 5 Cancelamento negado
* 7 Notificação de chargeback
* 8 Alerta de fraude
*/
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
//pegamos o que vier como content
$body = file_get_contents('php://input');
//e decodificamos, pois por padrao e enviado JSON
$data = json_decode($body, true);
if (json_last_error() != JSON_ERROR_NONE) {
//erro no json, exibe e sai
echo '<pre>Erro na leitura JSON: ' . json_last_error() . '</pre>';
} else {
//caso nao tenha nenhum erro no JSON enviado
$paymentid = $data['PaymentId'];
$mudanca = $data['ChangeType'];
$merchantID = 'XXX';
$merchantKEY = 'XXX';
$environment = Environment::production(); //ou sandbox()
$merchant = new Merchant($merchantID, $merchantKEY);
$total_centavos = '1000'; //10,00
if ($mudanca == 8) { //confirmada fraude
$message = 'Suspeita de fraude. Contate o emissor do seu cart&atilde;o para mais detalhes.';
$cancela = (new CieloEcommerce($merchant, $environment))->cancelSale($paymentid, $total_centavos);
//envia por email, atualiza no sistema do site, etc
} else {
try {
$sale = (new CieloEcommerce($merchant, $environment))->getSale($paymentid);
$fraudStatus = $sale->getPayment()->getFraudAnalysis();
$retornoFraude = $fraudStatus->getStatus();
if ($retornoFraude == 'Accept') {
//passou no antifraude: fazemos a captura da venda
//
//lembrando que no momento da compra, por causa do antifraude
//a captura automatica precisa vir como false
$capture = (new CieloEcommerce($merchant, $environment))->captureSale($paymentid, $total_centavos, 0);
$captured = [
'authorizationCode' => $capture->getAuthorizationCode(),
'returnCode' => $capture->getReturnCode(),
'returnMessage' => $capture->getReturnMessage(),
'status' => $capture->getStatus(),
'tid' => $capture->getTid(),
'data' => $capture->getReceivedDate()
];
if ($captured['status'] == 'success') {
//capturado com sucesso: pedido efetuado
//
//envia por email, atualiza no sistema do site, etc
}
} elseif ($retornoFraude == 'ProviderError' || $retornoFraude == 'Reject') {
//antifraude rejeitou: cancelamos a compra
//
//cancelamos na Cielo pra evitar debitar do cliente
$cancela = (new CieloEcommerce($merchant, $environment))->cancelSale($paymentid, $total_centavos);
//envia por email, atualiza no sistema do site, etc
}
} catch (CieloRequestException $e) {
$msg = $e->getCieloError()->getMessage();
$err = $e->getCieloError()->getCode();
echo '[!] Erro: ' . $msg . '(Código ' . $err . ')';
}
}
}
}
//retornamos 200 pra cielo
//ATENCAO: necessita mais tratamento
//antes de somente retornar 200
http_response_code(200);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment