| Server IP : 54.233.248.239 / Your IP : 172.28.1.13 Web Server : Apache System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/vinumday2_0/app/Services/ |
Upload File : |
<?php
namespace App\Services;
use App\Modules\CadastroCartao\Models\CadastroCartao;
use App\Modules\CadastroEndereco\Models\CadastroEndereco;
use App\Modules\Cidade\Models\Cidade;
use App\Modules\Estado\Models\Estado;
use App\Modules\Pais\Models\Pais;
use Carbon\Carbon;
use Log;
class CheckoutService
{
public static function pagamento($cadastro, $user, $total, $post, $hash)
{
$ApiKeyPagarMe = GeralService::getApiKeyPagarMe($cadastro);
if(substr($ApiKeyPagarMe, 0, 3) == 'sk_') {
$currentDate = Carbon::now()->format('Y-m-d');
$appEnv = env('APP_ENV');
if ($appEnv === 'development') {
$additionalEmails = [];
// $additionalEmails = ['marcoskubas@gmail.com'];
} else {
$additionalEmails = [];
}
if (empty($cadastro->customer_id)) {
$customer = PagarMeService::createCustomer($cadastro, $ApiKeyPagarMe);
if (!isset($customer->id)) {
$dataEmail = $post;
$dataEmail['customer'] = json_encode($customer, JSON_PRETTY_PRINT);
\Mail::send('emails.error-checkout', $dataEmail, function ($m) use ($currentDate, $additionalEmails, $appEnv) {
$m->from(config('mail.from.address'), config('mail.from.name'));
$m->to(array_merge(['marcos.kubas@rua.com.br', 'jonathas.martins@rua.com.br'], $additionalEmails))->subject('[' . $appEnv . '/' . $currentDate . '] pagamento => Falha ao cadastrar usuário na PagarMe');
});
$json = ['status' => false, 'message' => 'Falha ao cadastrar cliente', 'error' => json_encode($customer)];
return $json;
}
$cadastro->customer_id = $customer->id;
$cadastro->save();
}
try {
$card = PagarMeService::createCustomerCard($cadastro, $post, $ApiKeyPagarMe);
} catch (\Exception $exception) {
$dataEmail = $post;
$dataEmail['card'] = json_encode($exception->getMessage(), JSON_PRETTY_PRINT);
\Mail::send('emails.error-checkout', $dataEmail, function ($m) use ($currentDate, $additionalEmails, $appEnv) {
$m->from(config('mail.from.address'), config('mail.from.name'));
$m->to(array_merge(['marcos.kubas@rua.com.br', 'jonathas.martins@rua.com.br'], $additionalEmails))->subject('[' . $appEnv . '/' . $currentDate . '] pagamento => Falha ao efetuar pagamento Cartão Crédito');
});
return ['status' => false, 'error' => $exception->getMessage()];
}
if (!isset($card->id) || $card->status == 'failed') {
$dataEmail = $post;
$dataEmail['card'] = json_encode($card, JSON_PRETTY_PRINT);
\Mail::send('emails.error-checkout', $dataEmail, function ($m) use ($currentDate, $additionalEmails, $appEnv) {
$m->from(config('mail.from.address'), config('mail.from.name'));
$m->to(array_merge(['marcos.kubas@rua.com.br', 'jonathas.martins@rua.com.br'], $additionalEmails))->subject('[' . $appEnv . '/' . $currentDate . '] pagamento => Falha ao efetuar pagamento Cartão Crédito');
});
$json = ['status' => false, 'pagamento_status' => (isset($card->status) ? $card->status : 'error'), 'message' => 'Falha ao efetuar pagamento', 'error' => json_encode($card)];
return $json;
}
$card_hash = $card->id;
//Log Pedido Venda Transação
$pedidoVendaTransacao = new \stdClass;
$pedidoVendaTransacao->empresa_id = $cadastro->empresa_id;
$pedidoVendaTransacao->cadastro_id = $cadastro->id;
$pedidoVendaTransacao->customer_id = $cadastro->customer_id;
$pedidoVendaTransacao->valor = $total;
$pedidoVendaTransacao->observacao = json_encode([
'parcelas' => $post['parcelas'],
'total' => $total,
'card' => $card_hash,
'customer' => $cadastro->customer_id
]);
try {
$order = PagarMeService::createOrderCreditCard($cadastro, $total, $card_hash, $post['parcelas'], $ApiKeyPagarMe, $hash);
} catch (\Exception $exception) {
$dataEmail = $post;
$dataEmail['logs'] = json_encode($exception->getMessage(), JSON_PRETTY_PRINT);
\Mail::send('emails.error-checkout', $dataEmail, function ($m) use ($currentDate, $additionalEmails, $appEnv) {
$m->from(config('mail.from.address'), config('mail.from.name'));
$m->to(array_merge(['marcos.kubas@rua.com.br', 'jonathas.martins@rua.com.br'], $additionalEmails))->subject('[' . $appEnv . '/' . $currentDate . '] pagamento => Falha ao efetuar pagamento Cartão Crédito');
});
}
if (!isset($order->id) || $order->status == 'failed') {
$dataEmail = $post;
$dataEmail['order'] = json_encode($order, JSON_PRETTY_PRINT);
\Mail::send('emails.error-checkout', $dataEmail, function ($m) use ($currentDate, $additionalEmails, $appEnv) {
$m->from(config('mail.from.address'), config('mail.from.name'));
$m->to(array_merge(['marcos.kubas@rua.com.br', 'jonathas.martins@rua.com.br'], $additionalEmails))->subject('[' . $appEnv . '/' . $currentDate . '] pagamento => Falha ao efetuar pagamento Cartão Crédito');
});
$pedidoVendaTransacao->status = $order->status;
$pedidoVendaTransacao->observacao = json_encode($order);
$id_pedido_venda_transacao = GeralService::logPedidoVendaTransacao($pedidoVendaTransacao);
$json = ['status' => false, 'pagamento_status' => (isset($order->status) ? $order->status : 'error'), 'message' => 'Falha ao efetuar pagamento', 'error' => json_encode($order)];
return $json;
}
$pedidoVendaTransacao->status = $order->status;
$pedidoVendaTransacao->observacao = json_encode($order);
$pedidoVendaTransacao->transacao_id = $order->id;
$id_pedido_venda_transacao = GeralService::logPedidoVendaTransacao($pedidoVendaTransacao);
return [
'status' => true,
'transaction_id' => $order->id,
'id_pedido_venda_transacao' => $id_pedido_venda_transacao,
'message' => 'Compra processada com sucesso.'
];
}
$pagarMe = new \PagarMe\Sdk\PagarMe(GeralService::getApiKeyPagarMe($cadastro));
$customer = null;
if ($cadastro->customer_id) {
$customer = GeralService::buscarCustomerPagarme($cadastro);
}
if (!$customer || count($cadastro->enderecos) == 0) {
if (count($cadastro->enderecos) == 0) {
$cadastroEndereco = new CadastroEndereco();
$cadastroEndereco->fill($post);
$cadastroEndereco->cadastro_id = $cadastro->id;
$cadastroEndereco->principal = 1;
//$cadastroEndereco->nome = 'Endereço de cadastro';
$cadastroEndereco->save();
} else {
$cadastroEndereco = CadastroEndereco::where('cadastro_id', $cadastro->id)->where('principal', 1)->first();
if (!$cadastroEndereco) {
return [
'status' => false,
'message' => 'Você não possui um endereço principal definido. Defina um na página de seu perfil antes de finalizar a compra.'
];
}
}
$cidade = Cidade::find($cadastroEndereco->cidade_id);
if (!$cidade) {
return [
'status' => false,
'message' => 'Cidade do seu endereço não é válida. Por favor, verifique se se endereço principal está cadastro corretamente.'
];
}
$estado = Estado::find($cadastroEndereco->estado_id);
if (!$estado) {
return [
'status' => false,
'message' => 'Estado do seu endereço não é válido. Por favor, verifique se se endereço principal está cadastro corretamente.'
];
}
$pais = Pais::find($cadastroEndereco->pais_id);
if (!$pais) {
return [
'status' => false,
'message' => 'País do seu endereço não é válido. Por favor, verifique se se endereço principal está cadastro corretamente.'
];
}
try {
$address = new \PagarMe\Sdk\Customer\Address([
'street' => $cadastroEndereco->logradouro,
'streetNumber' => $cadastroEndereco->numero,
'neighborhood' => $cadastroEndereco->bairro,
'zipcode' => str_replace(['-', '.'], '', $cadastroEndereco->cep),
'complementary' => $cadastroEndereco->complemento,
'city' => $cidade->nome,
'state' => $estado->nome,
'country' => $pais->nome,
]);
} catch (\Exception $e) {
return [
'status' => false,
'message' => 'Não foi possível cadastrar seu endereço na plataforma de pagamento. Por favor, tente novamente mais tarde.'
];
}
try {
$telefone = (int) $res = preg_replace("/[^0-9]/", "", $cadastro->telefone);
$phone = new \PagarMe\Sdk\Customer\Phone(['ddd' => substr($telefone, 0, 2),
'number' => substr($telefone, 2), 'ddi' => '55'
]);
} catch (\Exception $e) {
return [
'status' => false,
'message' => 'Não foi possível cadastrar seu telefone na plataforma de pagamento. Por favor, verifique se seu perfil está preenchido devidamente.'
];
}
$errors = [
'address[street_number]' => 'Número <strong>inválido</strong>.',
'address[street]' => 'Logradouro <strong>inválido</strong>.',
'address[neighborhood]' => 'Bairro <strong>inválido</strong>.',
'address[zipcode]' => 'CEP <strong>inválido</strong>.',
'phone[number]' => 'Telefone <strong>inválido</strong>. Por favor, ajuste seu cadastro ná pagina de seu perfil.',
'phone[ddd]' => 'O seu DDD é inválido. Por favor verifique se o seu <b>Telefone</b> está preenchido corretamente no seu perfil.',
];
try {
$customer = $pagarMe->customer()->create(
$cadastro->nome,
$user->email,
$cadastro->cpf,
$address,
$phone
);
} catch (\Exception $e) {
$exceptionErrors = json_decode(json_decode($e->getMessage()));
if ($exceptionErrors != null) {
$message = (isset($errors[$exceptionErrors->errors[0]->parameter_name])) ? $errors[$exceptionErrors->errors[0]->parameter_name] : $exceptionErrors->errors[0]->message;
} else {
$message = $e->getMessage();
}
return [
'status' => false,
'message' => $message
];
}
$cadastro->customer_id = $customer->getId();
$cadastro->save();
}
if (isset($post['cartao_id']) && $post['cartao_id']) { // Se está usando um cartão já cadastrado
$cartao = CadastroCartao::where('cadastro_id', $cadastro->id)->where('id', $post['cartao_id'])->where('ativo', 1)->first();
if (!$cartao) {
return [
'status' => false,
'message' => 'Cartão selecionado é inválido.'
];
}
try {
$card = $pagarMe->card()->get($cartao->cartao_id);
} catch (\Exception $e) {
return [
'status' => false,
'message' => 'Não foi possível encontrar o seu cartão na plataforma de pagamento. Por favor, tente outro método de pagamento.'
];
}
} else {
$tentativasCartao = CadastroCartao::where('cadastro_id', $cadastro->id)->where('empresa_id', $cadastro->empresa_id)->whereDate('data_cadastro', date('Y-m-d'))->where('ativo', 0)->count();
$cartoesCliente = CadastroCartao::where('cadastro_id', $cadastro->id)->where('empresa_id', $cadastro->empresa_id)->where('ativo', 1)->count();
if ($tentativasCartao >= 3) {
return [
'status' => false,
'message' => 'Tentativas Excedidas. Entre em contato com nossa equipe de suporte.'
];
} elseif ($cartoesCliente >= 3) {
return [
'status' => false,
'message' => 'Por razões de segurança são permitidos apenas 3 (três) cartões cadastrados.'
];
} elseif ($tentativasCartao >= 2 && (!isset($post['g-recaptcha-response']) || (isset($post['g-recaptcha-response']) && empty($post['g-recaptcha-response'])))) {
return [
'status' => false,
'message' => 'ReCaptcha inválido'
];
}
$cadastroCartao = new CadastroCartao();
$cadastroCartao->cadastro_id = $cadastro->id;
$cadastroCartao->empresa_id = $cadastro->empresa_id;
$cadastroCartao->data_cadastro = date('Y-m-d H:i:s');
$cadastroCartao->principal = 0;
try {
$card = $pagarMe->card()->create(
$post['number'],
$post['name'],
substr($post['expiry'], 0, 2).substr($post['expiry'], 5, 2)
);
if ($card->getValid()) {
$cadastroCartao->cartao_id = $card->getId();
if (isset($post['salvar_cartao']) && $post['salvar_cartao']) {
if (count($cadastro->cartoes) == 0) {
$cadastroCartao->principal = 1;
}
$cadastroCartao->save();
} else {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao',
'observacao' => "Compra sem cartão salvo: ".$card->getId()
]);
}
} else {
if (!isset($post['salvar_cartao'])) {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao', 'status' => 0,
'observacao' => 'Dados do cartão são inválidos'
]);
}
$cadastroCartao->retorno = 'Cartão Inválido';
$cadastroCartao->ativo = 0;
$cadastroCartao->save();
return [
'status' => false,
'tentativasCartao' => ($tentativasCartao + 1),
'message' => 'Dados do cartão são <strong>inválidos</strong>. Tente novamente.'
];
}
} catch (\Exception $e) {
if (!isset($post['salvar_cartao'])) {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao', 'status' => 0,
'observacao' => 'Dados do cartão são inválidos (Exception)'
]);
}
$errors = json_decode(json_decode($e->getMessage()));
$cadastroCartao->retorno = isset($errors->errors) ? json_encode($errors->errors[0]->message) : 'Erro cartão checkout';
$cadastroCartao->ativo = 0;
$cadastroCartao->save();
return [
'status' => false,
'tentativasCartao' => ($tentativasCartao + 1),
'message' => 'Dados do cartão são <strong>inválidos</strong>. Tente novamente.',
];
}
}
$totalTransaction = $total * 100;
$totalTransaction = number_format($totalTransaction, 0, '', '');
$creditCardTransaction = [
'total' => $totalTransaction,
'card' => $card->getId(),
'customer' => $cadastro->customer_id,
'parcelas' => $post['parcelas']
];
//Log Pedido Venda Transação
$pedidoVendaTransacao = new \stdClass;
$pedidoVendaTransacao->empresa_id = $cadastro->empresa_id;
$pedidoVendaTransacao->cadastro_id = $cadastro->id;
$pedidoVendaTransacao->customer_id = $cadastro->customer_id;
$pedidoVendaTransacao->valor = $total;
$pedidoVendaTransacao->observacao = json_encode($creditCardTransaction);
try {
$transaction = $pagarMe->transaction()->creditCardTransaction(
$totalTransaction,
$card,
$customer,
$post['parcelas'], // parcelas
true // captura
//'http://requestb.in/pkt7pgpk', // postbackURL
//['idProduto' => 13933139] //metadata
);
if ($transaction->getStatus() != 'paid') {
if (!isset($post['salvar_cartao'])) {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao', 'status' => 0,
'observacao' => 'Pagamento Recusado para '.$card->getId().' : '.$transaction->getStatus()
]);
}
Log::info('confirmarCompra Pedido Status : transacao_id => '.$transaction->getId().' '.$transaction->getStatus().'('.json_encode($creditCardTransaction).')');
$pedidoVendaTransacao->status = $transaction->getStatus();
$pedidoVendaTransacao->transacao_id = $transaction->getId();
$id_pedido_venda_transacao = GeralService::logPedidoVendaTransacao($pedidoVendaTransacao);
return [
'status' => false,
'message' => 'Não foi possível realizar a transação na plataforma de pagamento. Por favor, tente novamente mais tarde.'
];
} else {
if (!isset($post['salvar_cartao'])) {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao',
'observacao' => "Pagamento Aprovado sem cartão salvo: ".$card->getId()
]);
}
$pedidoVendaTransacao->status = $transaction->getStatus();
$pedidoVendaTransacao->transacao_id = $transaction->getId();
$id_pedido_venda_transacao = GeralService::logPedidoVendaTransacao($pedidoVendaTransacao);
Log::info('confirmarCompra OK : transacao_id => '.$transaction->getId().' - '.json_encode($creditCardTransaction));
}
} catch (\Exception $e) {
if (!isset($post['salvar_cartao'])) {
GeralService::checkoutTracking('usuario', [
'id_tipo' => $cadastro->user_id, 'acao' => 'compra-cartao', 'status' => 0,
'observacao' => 'Pagamento Recusado para '.$card->getId().' : Exception'
]);
}
Log::info('confirmarCompra Exception : '.json_encode($creditCardTransaction));
Log::info('confirmarCompra Exception Customer : '.json_encode($customer));
Log::info('confirmarCompra Exception : '.json_encode($e->getMessage()));
$pedidoVendaTransacao->status = 'exception';
$pedidoVendaTransacao->observacao = $pedidoVendaTransacao->observacao." - ".json_encode($e->getMessage());
$id_pedido_venda_transacao = GeralService::logPedidoVendaTransacao($pedidoVendaTransacao);
return [
'status' => false,
'message' => 'Erro ao realizar a transação na plataforma de pagamento. Por favor, tente novamente mais tarde.'
];
}
$transaction_id = false;
if($transaction) {
$transaction_id = $transaction->getId();
}
return [
'status' => true,
'transaction_id' => $transaction_id,
'id_pedido_venda_transacao' => $id_pedido_venda_transacao,
'message' => 'Compra processada com sucesso.'
];
}
}