Last active
May 9, 2022 19:13
-
-
Save dimaspante/1ff138d9e0129111e86d11e939f6f881 to your computer and use it in GitHub Desktop.
Exemplo de post de notificação e-commerce Cielo + antifraude Braspag
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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ã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