Skip to content

Commit

Permalink
v2.2
Browse files Browse the repository at this point in the history
`Melhorias implementadas`

* Checagem e validação de CPF/CNPJ no checkout, na página de invoice e na tela de boleto/PIX
* Exibição das tags de boleto/PIX no editor de templates de e-mail
* Suporte a campo de razão social (opcional)
* Melhor lógica de reaproveitamento de boletos
* Mais informações nos logs
* Melhor manipulação de CPF/CNPJ para criação de faturas
* Tela de erro, caso o o valor com desconto por pagto. antecipado seja menor que R$ 3
* Tela de erro genérica (evita tela branca, caso uma transação não possa ser gerada)

`Bugs resolvidos`

* Boletos vencidos eram ignorados, ainda que dentro do período de tolerância
* Erro ao cancelar boletos nos logs
* Bloco de inserção de boleto/PIX PDF era executado apenas na primeira fatura da CRON (mod_lsapi)
* Melhor cálculo de desconto para pagto. antecipado
* Maior dinstinção entre as mensagens (evita confusão no front-end)
* Melhor convenção de naming de funções (evita conflitos com outros módulos/gateways)
* Warning de operador ternário removido
  • Loading branch information
henriqueccruz authored May 27, 2021
2 parents 325c868 + e43c670 commit 2e6e4a4
Show file tree
Hide file tree
Showing 11 changed files with 522 additions and 170 deletions.
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Na aba “All Payment Gateways” ou "Todos os Portais de Pagamento" e procure p

8. Adicione o texto abaixo no arquivo invoicepdf.tpl do seu tema, para anexar boletos e códigos PIX ao PDF das faturas (opcional)

```<?php require_once(dirname(__FILE__).'/../../modules/gateways/paghiper/inc/helpers/attach_pdf_slip.php'); ?>```
```<?php include dirname(__FILE__).'/../../modules/gateways/paghiper/inc/helpers/attach_pdf_slip.php'; ?>```

9. Para inserir código PIX e linha digitável de boletos, edite seu template de e-mail em Opções (Setup) > Modelos de e-mail (E-mail templates). Você pode usar dois campos de mesclagens, um para boleto e outro para PIX, respectivamente: {$linha_digitavel} e {$codigo_pix}. Basta inserí-los nos templates de comunicação de e-mail nos locais desejados.

Expand All @@ -51,6 +51,30 @@ Para dúvidas comerciais e/ou sobre o funcionamento do serviço, visite a nossa

* Disponibilização de linha digitável no painel

## 2.2 - 2021/05/27

`Melhorias implementadas`

* Checagem e validação de CPF/CNPJ no checkout, na página de invoice e na tela de boleto/PIX
* Exibição das tags de boleto/PIX no editor de templates de e-mail
* Suporte a campo de razão social (opcional)
* Melhor lógica de reaproveitamento de boletos
* Mais informações nos logs
* Melhor manipulação de CPF/CNPJ para criação de faturas
* Tela de erro, caso o o valor com desconto por pagto. antecipado seja menor que R$ 3
* Tela de erro genérica (evita tela branca, caso uma transação não possa ser gerada)

`Bugs resolvidos`

* Boletos vencidos eram ignorados, ainda que dentro do período de tolerância
* Erro ao cancelar boletos nos logs
* Bloco de inserção de boleto/PIX PDF era executado apenas na primeira fatura da CRON (mod_lsapi)
* Melhor cálculo de desconto para pagto. antecipado
* Maior dinstinção entre as mensagens (evita confusão no front-end)
* Melhor convenção de naming de funções (evita conflitos com outros módulos/gateways)
* Warning de operador ternário removido


## 2.1 - 2020/12/18

`Melhorias implementadas`
Expand Down
11 changes: 9 additions & 2 deletions includes/hooks/cancel_paghiper_slip.php
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
<?php
/**
* Cancela boletos bancários não-pagos, atrelados a uma fatura cancelada ou paga.
* @author Henrique Cruz | henriquecruz.com.br
* @copyright Copyright (c) 2019 https://henriquecruz.com.br
*
* @package PagHiper para WHMCS
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Henrique Cruz
* @license BSD License (3-clause)
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

if (!defined("WHMCS")) die("This file cannot be accessed directly");

function cancel_paghiper_slips($vars) {

//require_once ("../init.php");
require_once(dirname(__FILE__) . '/../../modules/gateways/paghiper/inc/helpers/gateway_functions.php');
$invoice_id = $vars['invoiceid'];

// Initialise gateway configuration
Expand Down
22 changes: 17 additions & 5 deletions includes/hooks/create_paghiper_pix.php
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
<?php
/**
* Adiciona QR code do PIX nos templates do WHMCS
* @author Henrique Cruz | henriquecruz.com.br
* @copyright Copyright (c) 2019 https://henriquecruz.com.br
*
* @package PagHiper para WHMCS
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Henrique Cruz
* @license BSD License (3-clause)
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

if (!defined("WHMCS")) die("This file cannot be accessed directly");
Expand All @@ -18,14 +24,20 @@ function display_pix_qr_code($vars) {
$invoice = mysql_fetch_array(mysql_query("SELECT tblinvoices.*,tblclients.id as client_id, tblclients.email FROM tblinvoices INNER JOIN tblclients ON tblclients.id=tblinvoices.userid WHERE tblinvoices.id='$invoice_id'"));

$whmcs_url = rtrim(\App::getSystemUrl(),"/");
$json = file_get_contents($whmcs_url."/modules/gateways/paghiper_pix.php?invoiceid=".$invoice_id."&uuid=".$invoice['client_id']."&mail=".$invoice['email']."&json=1&pix=true");
$result = json_decode($json);
$json_url = $whmcs_url."/modules/gateways/paghiper_pix.php?invoiceid=".$invoice_id."&uuid=".$invoice['client_id']."&mail=".$invoice['email']."&json=1&pix=true";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $json_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$json = curl_exec($ch);
$result = json_decode($json);

$digitable_line = (isset($result->pix_code)) ? $result->pix_code->emv : $result->emv;
$qrcode_image_url = (isset($result->pix_code)) ? $result->pix_code->qrcode_image_url : $result->qrcode_image_url;

if($digitable_line) {
$merge_fields['codigo_pix'] = "<div style='text-align: center;'><img width='320' height='320' src='{$qrcode_image_url}'><br>";
$merge_fields['codigo_pix'] = "<div style='text-align: center;' class='qr-code-container'><img class='qr-code' width='320' height='320' src='{$qrcode_image_url}'><br>";
$merge_fields['codigo_pix'] .= '<h2 style="font-size: 16px; color: #000000">Use a opção QR Code no seu app de internet banking<br><span style="font-size: 14px; font-weight: normal;">Ou, se preferir, copie o texto abaixo para fazer o pagamento</span></h2>';
$merge_fields['codigo_pix'] .= '<span>Seu código PIX: <br><span style="font-size: 16px; color: #000000"><strong>';
$merge_fields['codigo_pix'] .= $digitable_line;
Expand Down
24 changes: 18 additions & 6 deletions includes/hooks/create_paghiper_slip.php
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
<?php
/**
* Adiciona boleto bancário e link direto para boleto no WHMCS
* @author Henrique Cruz | henriquecruz.com.br
* @copyright Copyright (c) 2019 https://henriquecruz.com.br
*
* @package PagHiper para WHMCS
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Henrique Cruz
* @license BSD License (3-clause)
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

if (!defined("WHMCS")) die("This file cannot be accessed directly");
Expand All @@ -18,15 +24,21 @@ function display_digitable_line($vars) {
$invoice = mysql_fetch_array(mysql_query("SELECT tblinvoices.*,tblclients.id as client_id, tblclients.email FROM tblinvoices INNER JOIN tblclients ON tblclients.id=tblinvoices.userid WHERE tblinvoices.id='$invoice_id'"));

$whmcs_url = rtrim(\App::getSystemUrl(),"/");
$json = file_get_contents($whmcs_url."/modules/gateways/paghiper.php?invoiceid=".$invoice_id."&uuid=".$invoice['client_id']."&mail=".$invoice['email']."&json=1");
$json_url = $whmcs_url."/modules/gateways/paghiper.php?invoiceid=".$invoice_id."&uuid=".$invoice['client_id']."&mail=".$invoice['email']."&json=1";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $json_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$json = curl_exec($ch);
$result = json_decode($json);

$digitable_line = (isset($result->bank_slip)) ? $result->bank_slip->digitable_line : $result->digitable_line;
$bar_code_number_to_image = (isset($result->bank_slip)) ? $result->bank_slip->bar_code_number_to_image : $result->bar_code_number_to_image;


if($digitable_line) {
$merge_fields['linha_digitavel'] = '<div style="text-align: center;"><span>Linha digitável: <br><span style="font-size: 16px; color: #000000"><strong>';
$merge_fields['linha_digitavel'] .= "<img style='max-width: 100%;' src='{$whmcs_url}/modules/gateways/paghiper/assets/php/barcode.php?codigo={$bar_code_number_to_image}'>";
$merge_fields['linha_digitavel'] = '<div style="text-align: center;" class="billet-barcode-container"><span>Linha digitável: <br><span style="font-size: 16px; color: #000000"><strong>';
$merge_fields['linha_digitavel'] .= "<img class='billet-barcode' style='max-width: 100%;' height='50' src='{$whmcs_url}/modules/gateways/paghiper/assets/php/barcode.php?codigo={$bar_code_number_to_image}'><br>";
$merge_fields['linha_digitavel'] .= $digitable_line;
$merge_fields['linha_digitavel'] .= '</strong></span></span></div>';
}
Expand Down
21 changes: 21 additions & 0 deletions includes/hooks/show_paghiper_mergefields.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
/**
* Mostra campos da Paghiper na lista de campos disponíveis para uso nos templates
*
* @package PagHiper e Boleto para WHMCS
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Henrique Cruz
* @license BSD License (3-clause)
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

if (!defined("WHMCS")) die("This file cannot be accessed directly");
function show_paghiper_tpl_fields($vars) {
$merge_fields = [];
$merge_fields['codigo_pix'] = "Mostra o código PIX Paghiper e informações de pagamento";
$merge_fields['linha_digitavel'] = "Mostra a linha digitável e código de barras do boleto PagHiper";
return $merge_fields;
}
add_hook('EmailTplMergeFields', 1, 'show_paghiper_tpl_fields');
95 changes: 95 additions & 0 deletions includes/hooks/validate_paghiper_taxid.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php
/**
* Valida informações de faturamento do cliente no check-out
*
* @package PagHiper e Boleto para WHMCS
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Henrique Cruz
* @license BSD License (3-clause)
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

require_once(dirname(__FILE__) . '/../../modules/gateways/paghiper/inc/helpers/gateway_functions.php');

function paghiper_clientValidateTaxId($vars){

if(array_key_exists('paymentmethod', $vars) && strpos($vars['paymentmethod'], "paghiper") !== false) {
$gatewayConfig = getGatewayVariables($vars['paymentmethod']);
} else {
return;
}

// Checamos o CPF/CNPJ novamente, para evitar problemas no checkout
$taxIdFields = explode("|", $gatewayConfig['cpf_cnpj']);
$clientCustomFields = [];
$clientTaxIds = [];

if(array_key_exists('custtype', $vars) && $vars['custtype'] == 'existing') {

$gateway_admin = $gatewayConfig['admin'];
$backup_admin = array_shift(mysql_fetch_array(mysql_query("SELECT username FROM tbladmins LIMIT 1")));

// Se o usuário admin estiver vazio nas configurações, usamos o padrão
$whmcsAdmin = (
(empty(trim($gateway_admin))) ?

// Caso não tenha um valor para usarmos, pegamos o primeiro admin disponível na tabela
$backup_admin :

// Caso tenha, usamos o preenchido
(
empty(array_shift(mysql_fetch_array(mysql_query("SELECT username FROM tbladmins WHERE username = '$gateway_admin' LIMIT 1"))))) ?
$backup_admin :
trim($GATEWAY['admin']
)

);

$query_params = array(
'clientid' => $vars['userid'],
'stats' => false
);

$client_details = localAPI('getClientsDetails', $query_params, $whmcsAdmin);

foreach($client_details["customfields"] as $key => $value){
$clientCustomFields[$value['id']] = $value['value'];
}

} else {

foreach($vars["customfield"] as $key => $value){
$clientCustomFields[$key] = $value;
}

}

if(count($taxIdFields) > 1) {
$clientTaxIds[] = $clientCustomFields[$taxIdFields[0]];
$clientTaxIds[] = $clientCustomFields[$taxIdFields[1]];
} else {
$clientTaxIds[] = $clientCustomFields[$taxIdFields[0]];
}

$isValidTaxId = false;
foreach($clientTaxIds as $clientTaxId) {
if(paghiper_is_tax_id_valid($clientTaxId)) {
$isValidTaxId = true;
break 1;
}
}

if(!$isValidTaxId) {

if(array_key_exists('custtype', $vars) && $vars['custtype'] == 'existing') {
return array('CPF/CNPJ inválido! Cheque seu cadastro.');
} else {
return array('CPF/CNPJ inválido!');
}
}
}

//add_hook("ClientDetailsValidation", 1, "paghiper_clientValidateTaxId");
add_hook("ShoppingCartValidateCheckout", 1, "paghiper_clientValidateTaxId");
74 changes: 58 additions & 16 deletions modules/gateways/paghiper.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@
* PagHiper - Módulo oficial para integração com WHMCS
*
* @package PagHiper para WHMCS
* @version 2.1
* @version 2.2
* @author Equipe PagHiper https://github.com/paghiper/whmcs
* @author Desenvolvido e mantido Henrique Cruz - https://henriquecruz.com.br/
* @license BSD License (3-clause)
* @copyright (c) 2017-2020, PagHiper
* @copyright (c) 2017-2021, PagHiper
* @link https://www.paghiper.com/
*/

// Opções padrão do Gateway
function paghiper_config($params = NULL) {

$custom_fields_conf = paghiper_get_customfield_id();

$config = array(
'FriendlyName' => array(
"Type" => "System",
Expand All @@ -25,7 +28,7 @@ function paghiper_config($params = NULL) {
<tbody>
<tr>
<td width='60%'><img src='https://s3.amazonaws.com/logopaghiper/whmcs/badge.oficial.png' style='max-width: 100%;'></td>
<td>Versão <h2 style='font-weight: bold; margin-top: 0px; font-size: 300%;'>2.1</h2></td>
<td>Versão <h2 style='font-weight: bold; margin-top: 0px; font-size: 300%;'>2.2</h2></td>
</tr>
</tbody>
</table>
Expand Down Expand Up @@ -64,7 +67,13 @@ function paghiper_config($params = NULL) {
"FriendlyName" => "ID do custom field contendo CPF/CNPJ",
"Type" => "text",
"Size" => "3",
"Description" => "Defina aqui o ID do campo usado para coletar CPF/CNPJ do seu cliente. Isso é necessário para usar o checkout transparente." . get_customfield_id()
"Description" => "Defina aqui o ID do campo usado para coletar CPF/CNPJ do seu cliente. Isso é necessário para usar o checkout transparente." . $custom_fields_conf
),
"razao_social" => array(
"FriendlyName" => "ID do custom field contendo Razão Social",
"Type" => "text",
"Size" => "3",
"Description" => "Defina aqui o ID do campo usado, caso utilize um campo personalizado para coletar a Razão Social do seu cliente. Isso é opcional."
),
"porcento" => array(
"FriendlyName" => "Taxa Percentual (%)",
Expand Down Expand Up @@ -180,24 +189,57 @@ function paghiper_link($params) {
$abrirAuto = '';
endif;

// Código do checkout
$code = "<!-- INICIO DO FORM DO BOLETO PAGHIPER -->
<form name=\"paghiper\" action=\"{$urlRetorno}?invoiceid={$params['invoiceid']}&uuid={$params['clientdetails']['userid']}&mail={$params['clientdetails']['email']}\" method=\"post\">
<input type='image' src='{$systemurl}/modules/gateways/paghiper/assets/img/billet.jpg' title='Pagar com Boleto' alt='Pagar com Boleto' border='0' align='absbottom' width='120' height='74' /><br>
<button formtarget='_blank' class='btn btn-success' style='margin-top: 5px;' type=\"submit\"><i class='fa fa-barcode'></i> Gerar Boleto</button>
<br> <br>
<div class='alert alert-warning' role='alert'>
<strong>Importante:</strong> A compensação bancária poderá levar até 2 dias úteis.
</div>
<!-- FIM DO BOLETO PAGHIPER -->
</form>
{$abrirAuto}";
// Checamos o CPF/CNPJ novamente, para evitar problemas no checkout
$taxIdFields = explode("|", $params['cpf_cnpj']);

$clientCustomFields = [];
foreach($params["clientdetails"]["customfields"] as $key => $value){
$clientCustomFields[$value['id']] = $value['value'];
}

$clientTaxIds = [];
if(count($taxIdFields) > 1) {
$clientTaxIds[] = $clientCustomFields[$taxIdFields[0]];
$clientTaxIds[] = $clientCustomFields[$taxIdFields[1]];
} else {
$clientTaxIds[] = $clientCustomFields[$taxIdFields[0]];
}

$isValidTaxId = false;
foreach($clientTaxIds as $clientTaxId) {
if(paghiper_is_tax_id_valid($clientTaxId)) {
$isValidTaxId = true;
break 1;
}
}

if($isValidTaxId) {

// Código do checkout
$code = "<!-- INICIO DO FORM DO BOLETO PAGHIPER -->
<form name=\"paghiper\" action=\"{$urlRetorno}?invoiceid={$params['invoiceid']}&uuid={$params['clientdetails']['userid']}&mail={$params['clientdetails']['email']}\" method=\"post\">
<input type='image' src='{$systemurl}/modules/gateways/paghiper/assets/img/billet.jpg' title='Pagar com Boleto' alt='Pagar com Boleto' border='0' align='absbottom' width='120' height='74' /><br>
<button formtarget='_blank' class='btn btn-success' style='margin-top: 5px;' type=\"submit\"><i class='fa fa-barcode'></i> Gerar Boleto</button>
<br> <br>
<div class='alert alert-warning' role='alert'>
<strong>Importante:</strong> A compensação bancária poderá levar até 2 dias úteis.
</div>
<!-- FIM DO BOLETO PAGHIPER -->
</form>
{$abrirAuto}";

} else {
$code = sprintf('<div class="alert alert-danger" role="alert">%s</div>', 'CPF ou CNPJ inválido, atualize seus dados cadastrais.');
}

return $code;

}

$is_pix = FALSE;




require_once('paghiper/inc/helpers/gateway_functions.php');
require_once('paghiper/inc/helpers/process_payment.php');
Loading

0 comments on commit 2e6e4a4

Please sign in to comment.