Guest User

Untitled

a guest
Jul 26th, 2017
40
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. /**
  4. * PagHiper - Módulo oficial para integração com WHMCS
  5. *
  6. * @package PagHiper para WHMCS
  7. * @version 1.12
  8. * @author Equipe PagHiper https://github.com/paghiper/whmcs
  9. * @author Colaboração de Henrique Cruz - Intelihost
  10. * @license BSD License (3-clause)
  11. * @copyright (c) 2017, Henrique Cruz
  12. * @link https://www.paghiper.com/
  13. */
  14.  
  15.  
  16. /**
  17. * O arquivo foi acessado diretamente.
  18. * Se trata de um post da PagHiper, de um boleto emitido com checkout transparente
  19. * ou um link direto enviado por e-mail.
  20. */
  21.  
  22. // Opções padrão do Gateway
  23. function paghiper_config($params) {
  24. $config = array(
  25.  
  26. 'FriendlyName' => array(
  27. "Type" => "System",
  28. "Value" => "PagHiper Boleto"
  29. ),
  30.  
  31. "nota" => array(
  32. "FriendlyName" => "Nota",
  33. "Description" => "
  34. <table><tbody><tr><td width='60%'><img src='https://s3.amazonaws.com/logopaghiper/whmcs/badge.oficial.png' style='
  35. max-width: 100%;
  36. '></td><td>
  37. Versão
  38. <h2 style='
  39. font-weight: bold;
  40. margin-top: 0px;
  41. font-size: 300%;
  42. '>1.12</h2>
  43. </td></tr></tbody></table>
  44. <h2>Para que o modulo funcione, siga as etapas abaixo:</h2>
  45. <ul>
  46. <li>Caso não possua uma conta PagHiper, <a href='https://www.paghiper.com/abra-sua-conta/' target='_blank'><strong> crie a sua aqui</strong></a> <br>
  47. Precisa de ajuda para criar sua conta? <a href='https://www.paghiper.com/duvidas/como-se-cadastrar-no-paghiper/' target='_blank'><strong> clique aqui e veja como criar de maneira rápida e facil.</strong></a><br></li>
  48. <li>Certifique-se que a conta esteja verificada e valida na página de <a href='https://www.paghiper.com/painel/detalhes-da-conta/' target='_blank'><strong>Detalhes da sua conta</strong></a> PagHiper</li>
  49. <li>Gere o seu token PagHiper na <a href='https://www.paghiper.com/painel/token/' target='_blank'><strong> pagina de token</strong></a></li>
  50. <li>Ative o prazo máximo de vencimento do boleto para 180 dias, no Painel do PagHiper &gt; Ferramentas &gt; Vencimento do Boleto ( <a href='https://www.paghiper.com/painel/prazo-vencimento-boleto/' target='_blank'><strong>Confira Aqui</strong></a> ). Somente assim, a data do vencimento do boleto será igual a da fatura.</li>
  51. <li>Ative a integração entre o PagHiper e o <a href='https://www.paghiper.com/painel/whmcs' target='_blank'><strong>WHMCS</strong></a>, <a href='https://www.paghiper.com/painel/whmcs' target='_blank'><strong>Acesse aqui</strong></a> e ative.</li>
  52. <li><h5>Suporte</h5><p>Se tiver qualquer duvida, visite a nossa <a href='https://www.paghiper.com/atendimento/' target='_blank'><strong>central de atendimento</strong></a></p></li>
  53. </ul>"
  54. ),
  55.  
  56. 'email' => array(
  57. "FriendlyName" => "Email",
  58. "Type" => "text",
  59. "Size" => "100",
  60. "Description" => "Email da conta PagHiper que irá receber"
  61. ),
  62.  
  63. 'token' => array(
  64. "FriendlyName" => "Token",
  65. "Type" => "text",
  66. "Size" => "66",
  67. "Description" => "Extremamente importante, você pode gerar seu token em nossa pagina: Painel > Ferramentas > Token ( <a href='https://www.paghiper.com/painel/token/' target='_blank'><strong>Confira Aqui</strong></a> )."
  68. ),
  69.  
  70. "cpf_cnpj" => array(
  71. "FriendlyName" => "ID do custom field contendo CPF/CNPJ",
  72. "Type" => "text",
  73. "Size" => "3",
  74. "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()
  75. ),
  76.  
  77. "porcento" => array(
  78. "FriendlyName" => "Taxa Percentual (%)",
  79. "Type" => "text",
  80. "Size" => "3",
  81. "Description" => "Porcentagem da fatura a se pagar a mais por usar o PagHiper. Ex.: (2.5). Obs.: não precisa colocar o % no final. Obs²: Use o ponto (.) como delimitador de casas decimais. <br> Recomendamos não cobrar nenhuma taxa."
  82. ),
  83.  
  84. "taxa" => array(
  85. "FriendlyName" => "Taxa fixa",
  86. "Type" => "text",
  87. "Size" => "7",
  88. "Description" => "Taxa cobrada a mais do cliente por utilizar esse meio de pagamento, exemplo: 1.0 (dois reias). Obs: Use o ponto (.) como delimitador de casas decimais.<br> Recomendamos não cobrar nenhuma taxa."
  89. ),
  90.  
  91. "abrirauto" => array(
  92. "FriendlyName" => "Abrir boleto ao abrir fatura?",
  93. "Type" => "yesno"
  94. ),
  95.  
  96. "frasefixa" => array(
  97. "FriendlyName" => "Exibe ou não a frase do boleto",
  98. "Type" => "yesno"
  99. ),
  100.  
  101. "porcento" => array(
  102. "FriendlyName" => "Taxa Percentual (%)",
  103. "Type" => "text",
  104. "Size" => "3",
  105. "Description" => "Porcentagem da fatura a se pagar a mais por usar o PagHiper. Ex.: (2.5). Obs.: não precisa colocar o % no final. Obs²: Use o ponto (.) como delimitador de casas decimais. <br> Recomendamos não cobrar nenhuma taxa."
  106. ),
  107.  
  108. "integracao_avancada" => array(
  109. "FriendlyName" => "Integração Avançada",
  110. "Type" => "yesno",
  111. "Description" => "Ao ativar essa opção, as informações de retorno são armazenadas no banco de dados para uso posterior. Com isso, podemos fazer coisas como mandar o código de barras direto no corpo do e-mail de fatura, integrar o boleto ao PDF da fatura e reutilizar boletos ja emitidos. Para mais informações, acesse nossa <a href='https://github.com/paghiper/whmcs' target='_blank'>Página do GitHub</a>"
  112. ),
  113.  
  114. "transparentcheckout" => array(
  115. "FriendlyName" => "Mostrar boleto usando Checkout Transparente?",
  116. "Type" => "yesno"
  117. ),
  118.  
  119. "admin" => array(
  120. "FriendlyName" => "Administrador atribuído",
  121. "Type" => "text",
  122. "Size" => "10",
  123. "Default" => "admin",
  124. "Description" => "Insira o nome de usuário ou ID do administrador do WHMCS que será atribuído as transações. Necessário para usar a API interna do WHMCS."
  125. ),
  126.  
  127. 'suporte' => array(
  128. "FriendlyName" => "<span class='label label-primary'><i class='fa fa-question-circle'></i> Suporte</span>",
  129. "Description" => '<h2>Para informações ou duvidas: </h2><br><br>
  130.  
  131. <ul>
  132. <li>Duvidas sobre a conta <strong> PAGHIPER:</strong> <br><br>
  133. Devem ser resolvidas diretamente na central de atendimento: <br>
  134. <strong><a href="https://www.paghiper.com/atendimento" target="_blank">https://www.paghiper.com/atendimento</a></strong></li>
  135. <br><br><br>
  136.  
  137. <li>Duvidas sobre o <strong> Modulo WHMCS </strong> <br><br>
  138. Tem uma dúvida ou quer contribuir para o projeto? Acesse nosso repositório no GitHub!
  139. <br>
  140. <strong><a href="https://github.com/paghiper/whmcs" target="_blank">https://github.com/paghiper/whmcs</a></strong></li>
  141.  
  142. </ul><br>
  143.  
  144. <h2>Nota de Agradecimento</h2>
  145. Esse modulo foi desenvolvido através da colaboração do desenvolvedor <strong><a href="https://henriquecruz.com.br" target="_blank">Henrique Cruz</a></strong> <br> <br>'
  146. )
  147.  
  148. );
  149.  
  150. return $config;
  151. }
  152.  
  153. function get_customfield_id() {
  154. $fields = mysql_query("SELECT id, fieldname FROM tblcustomfields WHERE type = 'client';");
  155. if (!$fields) {
  156. return '<br><br>Erro geral no banco de dados';
  157. } elseif (mysql_num_rows($fields) >= 1) {
  158.  
  159. $tutorial = '<br><br>Para sua comodidade, listamos abaixo os campos que podem ser usados e seus IDs. Basta pegar o ID e preencher acima. <ul>';
  160. while ($field = mysql_fetch_assoc($fields)) {
  161.  
  162. $tutorial .= '<li><strong>ID do Campo: ';
  163. $tutorial .= $field['id'];
  164. $tutorial .= '</strong> | Nome: ';
  165. $tutorial .= htmlentities($field['fieldname']);
  166. $tutorial .= '</li>';
  167.  
  168. }
  169. $tutorial .= '</ul>';
  170. $tutorial .= '<br>Caso o campo de CPF não esteja disponível, <strong><a href="https://github.com/paghiper/whmcs/wiki/Criando-o-campo-de-CPF-CNPJ" target="_blank">acesse o tutorial clicando aqui</a></strong> e veja como pode criar o campo.';
  171. return $tutorial;
  172. } else {
  173. return '<br><br>Nenhum campo possível foi encontrado! Por favor <strong><a href="https://github.com/paghiper/whmcs/wiki/Criando-o-campo-de-CPF-CNPJ" target="_blank">acesse o tutorial clicando aqui</a></strong> e veja como pode criar o campo.';
  174. }
  175.  
  176. }
  177.  
  178. function paghiper_link($params) {
  179.  
  180. $function = 'getinvoice';
  181. $getinvoiceid['invoiceid'] = $params['invoiceid'];
  182. $whmcsAdmin = $params['admin'];
  183. $getinvoiceResults = localAPI($function,$getinvoiceid,$whmcsAdmin);
  184.  
  185. $invoiceDuedate = $getinvoiceResults['duedate']; // Data de vencimento da fatura
  186. $dataHoje = date('Y-m-d'); // Data de Hoje
  187.  
  188. // Se a data de vencimento estiver no futuro ou presente
  189. if ( $invoiceDuedate >= date('Y-m-d') ) {
  190.  
  191. // Usar a data de vencimento original
  192. $billetDuedate = $invoiceDuedate;
  193.  
  194. // Caso contrario...
  195. } elseif ( $invoiceDuedate < date('Y-m-d') ) {
  196.  
  197. // usar a data de hoje, acrescida de um dia extra como vencimento.
  198. $billetDuedate = date('Y-m-d', strtotime('+1 day'));
  199.  
  200. }
  201.  
  202. // instancia as datas para a comparacao de internvalos de dias
  203. $data1 = new DateTime($billetDuedate);
  204. $data2 = new DateTime($dataHoje);
  205.  
  206. // Calcula a diferença de dias entre o dia de hoje e a data de vencimento. Vamos usar esse número para enviar ao PagHiper.
  207. $intervalo = $data1->diff($data2);
  208. $vencimentoBoleto = $intervalo->days;
  209.  
  210. // Definimos &&
  211. $systemurl = get_system_url($params);
  212. $urlRetorno = $systemurl.'/modules/gateways/'.basename(__FILE__);
  213.  
  214. // Pegamos os dados de CPF/CNPJ
  215. $cpf_field = 'customfields'.$params["cpf_cnpj"];
  216. $cpf_cnpj = $params['clientdetails'][$cpf_field];
  217. if(strpos($cpf_cnpj, '/') !== false) {
  218. $razao_social = $params['clientdetails']['companyname'];
  219. $cnpj = substr(trim(str_replace(array('+','-'), '', filter_var($cpf_cnpj, FILTER_SANITIZE_NUMBER_INT))), -14);
  220.  
  221. $code_insert = '<input name="razao_social" type="hidden" value="'.$razao_social.'" />';
  222. $code_insert .= '<input name="cnpj" type="hidden" value="'.$cnpj.'" />';
  223. } else {
  224. $cpf = substr(trim(str_replace(array('+','-'), '', filter_var($cpf_cnpj, FILTER_SANITIZE_NUMBER_INT))), -15);
  225. $code_insert = '<input name="cpf" type="hidden" value="'.$cpf.'" />';
  226. }
  227.  
  228. // faz os calculos (caso tenha definido um percentual ou taxa a mais, será incluida no calculo agora)
  229. $valorInvoice = apply_custom_taxes($params['amount'], $params); # Formato: ##.##
  230.  
  231. ### abrir o boleto automaticamente ao abrir a fatura
  232. if($params['abrirauto']==true):
  233. $target = '';
  234. $abrirAuto = "<script type='text/javascript'> document.paghiper.submit()</script>";
  235. else:
  236. $target = "target='_blank'";
  237. $abrirAuto = '';
  238. endif;
  239. // ALLOW CHECKOUT TRANSPARENTE
  240. if($params['transparentcheckout'] == true) {
  241. $code = "
  242. <!-- INICIO DO FORM DO BOLETO PAGHIPER -->
  243. <form name=\"paghiper\" action=\"{$urlRetorno}?invoiceid={$params['invoiceid']}&uuid={$params['clientdetails']['userid']}&mail={$params['clientdetails']['email']}\" method=\"post\">
  244. <input type='image' src='https://www.paghiper.com/img/checkout/boleto/boleto-120px-69px.jpg'
  245. title='Pagar com Boleto' alt='Pagar com Boleto' border='0'
  246. align='absbottom' /><br>
  247. <input type=\"submit\" value=\"Gerar boleto\">
  248. <!-- FIM DO BOLETO PAGHIPER -->
  249. </form>
  250. {$abrirAuto}";
  251. } else {
  252. $code = "
  253. <!-- INICIO DO FORM DO BOLETO PAGHIPER -->
  254. <form name=\"paghiper\" {$target} action=\"https://www.paghiper.com/checkout/\" method=\"post\">
  255. <input name='email_loja' type='hidden' value='{$params['email']}'>
  256. <!-- Informações opcionais -->
  257. <input name='urlRetorno' type='hidden' value='{$urlRetorno}'>
  258. <input name='vencimentoBoleto' type='hidden' value='{$vencimentoBoleto}'>
  259. <!-- Dados do produto -->
  260. <input name='id_plataforma' type='hidden' value='{$params['invoiceid']}' />
  261. <input name='produto_codigo_1' type='hidden' value='{$params['invoiceid']}' />
  262. <input name='produto_valor_1' type='hidden' value='{$valorInvoice}'>
  263. <input name='produto_descricao_1' type='hidden' value='Fatura #{$params['invoiceid']}'>
  264. <input name='produto_qtde_1' type='hidden' value='1'>";
  265.  
  266. $code .= $code_insert;
  267. $code .= "
  268.  
  269. <!-- Dados do cliente -->
  270. <input name='email' type='hidden' value='{$params['clientdetails']['email']}' />
  271. <input name='nome' type='hidden' value='{$params['clientdetails']['firstname']} {$params['clientdetails']['lastname']}'>
  272.  
  273. <input name='telefone' type='hidden' value='{$params['clientdetails']['phonenumber']}' />
  274.  
  275. <input name='endereco' type='hidden' value='{$params['clientdetails']['address1']}' />
  276. <input name='bairro' type='hidden' value='{$params['clientdetails']['address2']}' />
  277. <input name='cidade' type='hidden' value='{$params['clientdetails']['city']}' />
  278. <input name='estado' type='hidden' value='{$params['clientdetails']['state']}' />
  279. <input name='cep' type='hidden' value='{$params['clientdetails']['postcode']}' />
  280. <input name='numero_casa' type='hidden' value='S/N' />
  281. <input name='complemento' type='hidden' value='{$params['clientdetails']['address2']}' />
  282. <input name='idPartners' type='hidden' value='D1J0M5GD' />
  283. <input name='pagamento' type='hidden' id='pagamento' />
  284. <input type='image' src='https://www.paghiper.com/img/checkout/boleto/boleto-120px-69px.jpg'
  285. title='Pagar com Boleto' alt='Pagar com Boleto' border='0'
  286. align='absbottom' /><br>
  287. <input type=\"submit\" value=\"Gerar boleto\">
  288. <!-- FIM DO BOLETO PAGHIPER -->
  289. </form>
  290. {$abrirAuto}";
  291. }
  292.  
  293.  
  294.  
  295. return $code;
  296. }
  297.  
  298. function httpPost($url,$params,$GATEWAY,$invoiceid,$urlRetorno,$vencimentoBoleto)
  299. {
  300. $postData = '';
  301. $query = "SELECT tblinvoices.*,tblclients.id as myid, tblclients.firstname,tblclients.lastname,tblclients.companyname,tblclients.address1,tblclients.address2,tblclients.city,tblclients.state,tblclients.postcode,tblclients.email,tblclients.phonenumber FROM tblinvoices INNER JOIN tblclients ON tblclients.id=tblinvoices.userid WHERE tblinvoices.id='$invoiceid'";
  302. $result = mysql_query($query);
  303. $data = mysql_fetch_array($result);
  304. $id = $data["id"];
  305. $myid = $data["myid"];
  306. $firstname = $data["firstname"];
  307. $lastname = $data["lastname"];
  308. $companyname = $data["companyname"];
  309. $address1 = $data["address1"];
  310. $address2 = $data["address2"];
  311. $city = $data["city"];
  312. $state = $data["state"];
  313. $postcode = $data["postcode"];
  314. $date = $data["email"];
  315. $subtotal = $data["subtotal"];
  316. $credit = $data["credit"];
  317. $tax = $data["tax"];
  318. $taxrate = $data["taxrate"];
  319. $phone = $data["phonenumber"];
  320. $email = $data["email"];
  321. $total = $data["total"];
  322. $cpfcnpj = $GATEWAY['cpf_cnpj'];
  323. $query2 = "SELECT * FROM tblcustomfieldsvalues WHERE relid = $myid and fieldid = $cpfcnpj";
  324. $result2 = mysql_query($query2);
  325. $data2 = mysql_fetch_array($result2);
  326. $cpf = $data2["value"];
  327.  
  328. //TODO
  329. $subtotal = apply_custom_taxes($subtotal, $GATEWAY, $params);
  330.  
  331. // Preparate data to send
  332. $paghiper_data = array(
  333. "email_loja" => $GATEWAY['email'],
  334. "idPartners" => "D1J0M5GD",
  335.  
  336. // Informações opcionais
  337. "urlRetorno" => $urlRetorno,
  338. "vencimentoBoleto" => $vencimentoBoleto,
  339.  
  340. // Dados do produto
  341. "id_plataforma" => $invoiceid,
  342. "produto_codigo_1" => $invoiceid,
  343. "produto_valor_1" => $subtotal,
  344. "produto_descricao_1" => 'Fatura #'.$invoiceid,
  345. "produto_qtde_1" => 1,
  346.  
  347. // Dados do cliente
  348. "email" => $email,
  349. "nome" => $firstname . ' ' . $lastname,
  350. "telefone" => $phone,
  351. "endereco" => $address1,
  352. "bairro" => $address2,
  353. "cidade" => $city,
  354. "estado" => $$state,
  355. "cep" => $postcode,
  356. );
  357.  
  358.  
  359. // Checa se incluimos dados CPF ou CNPJ no post
  360. if ($cpf != " " or $cpf != "on file") {
  361. if(strpos($cpf, '/') !== false) {
  362. $paghiper_data["razao_social"] = $companyname;
  363. $paghiper_data["cnpj"] = substr(trim(str_replace(array('+','-'), '', filter_var($cpf, FILTER_SANITIZE_NUMBER_INT))), -14);
  364. } else {
  365. $paghiper_data["cpf"] = substr(trim(str_replace(array('+','-'), '', filter_var($cpf, FILTER_SANITIZE_NUMBER_INT))), -15);
  366. }
  367. } elseif(!isset($cpfcnpj) || $cpfcnpj == '') {
  368. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. Você não definiu o campo CPF/CNPJ");
  369. } elseif(!isset($cpf_cnpj) || $cpf_cnpj == '') {
  370. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. CPF/CNPJ do cliente não foi informado");
  371. } else {
  372. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. Erro indefinido");
  373. }
  374.  
  375. if($GATEWAY['frasefixa'] == true) {
  376. $paghiper_data["frase_fixa_boleto"] = true;
  377. }
  378.  
  379. $paghiper_data["pagamento"] = "pagamento";
  380.  
  381. // Pegar todos os dados que setamos e preparamos para enviar. Os dados vão todos na URL.
  382. foreach($paghiper_data as $k => $v)
  383. {
  384. $postData .= $k . '='.$v.'&';
  385. }
  386. $postData = rtrim($postData, '&');
  387.  
  388. $ch = curl_init();
  389.  
  390. curl_setopt($ch, CURLOPT_URL,$url);
  391. curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  392. curl_setopt($ch, CURLOPT_HEADER, false);
  393. curl_setopt($ch, CURLOPT_POST, count($postData));
  394. curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
  395. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  396. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  397.  
  398.  
  399. $output=curl_exec($ch);
  400.  
  401. curl_close($ch);
  402. return $output;
  403.  
  404. }
  405.  
  406. function check_table() {
  407. $table_create = full_query("CREATE TABLE IF NOT EXISTS `mod_paghiper` (
  408. `id` int(11) NOT NULL AUTO_INCREMENT,
  409. `idTransacao` varchar(16) NOT NULL,
  410. `status` varchar(45) NOT NULL,
  411. `urlPagamento` varchar(255) DEFAULT NULL,
  412. `linhaDigitavel` varchar(54) DEFAULT NULL,
  413. `codRetorno` varchar(64) NOT NULL,
  414. `type` varchar(10) NOT NULL,
  415. PRIMARY KEY (`id`),
  416. KEY `idTransacao` (`idTransacao`)
  417. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 AUTO_INCREMENT=1 ;");
  418. if(!$table_create) {
  419. return false;
  420. logTransaction($GATEWAY["name"],$_POST,"Não foi possível gravar os dados no banco.");
  421. } else {
  422. return true;
  423. }
  424.  
  425. }
  426.  
  427. // Nenhuma das funções foi executada, então o script foi acessado diretamente.
  428. if (basename(__FILE__) == basename($_SERVER['SCRIPT_NAME'])) {
  429.  
  430. header("access-control-allow-origin: *");
  431.  
  432. // Inicializar WHMCS, carregar o gateway e a fatura.
  433. require "../../init.php";
  434. $whmcs->load_function("gateway");
  435. $whmcs->load_function("invoice");
  436.  
  437. // Initialize module settings
  438. $GATEWAY = getGatewayVariables("paghiper");
  439.  
  440. // Define variáveis para configurações do gateway
  441. $gateway_name = $GATEWAY["name"];
  442. $account_email = trim($GATEWAY["email"]);
  443. $account_token = trim($GATEWAY['token']);
  444. $transparent_checkout = $GATEWAY['transparentcheckout'];
  445.  
  446. // Se o usuário admin estiver vazio nas configurações, usamos o padrão
  447. $whmcsAdmin = (empty(trim($GATEWAY['admin'])) ? 'admin' : trim($GATEWAY['admin']));
  448.  
  449.  
  450.  
  451. // Se as condições baterem, estamos lidando com um post do checkout transparente.
  452. if($GATEWAY['transparentcheckout'] == true && isset($_GET["invoiceid"])) {
  453.  
  454. // Vamos precisar pegar a URL do sistema direto do banco de dados. A variável $params não está disponível nesse momento.
  455. $systemurl = get_system_url();
  456.  
  457. $user_id = intval($_GET["uuid"]);
  458. $user_email = $_GET["mail"];
  459. //echo 'a';
  460.  
  461. // Pegamos a fatura no banco de dados
  462. $getinvoice = 'getinvoice';
  463. $getinvoiceid['invoiceid'] = intval($_GET["invoiceid"]);
  464. $getinvoiceResults = localAPI($getinvoice,$getinvoiceid,$whmcsAdmin);
  465. //print_r($getinvoiceResults);
  466. //echo $user_id . ' / '. $getinvoiceResults['userid'];
  467.  
  468. if(intval($getinvoiceResults['userid']) !== $user_id) {
  469. //echo 'ops!';
  470. exit;
  471. } else {
  472. $query = "SELECT email FROM tblclients WHERE id = '".$user_id."' LIMIT 1";
  473. $result = mysql_query($query);
  474. $data = mysql_fetch_array($result);
  475. $email = $data[0];
  476.  
  477. if($email !== $user_email) {
  478. exit;
  479. }
  480. }
  481.  
  482.  
  483.  
  484.  
  485.  
  486. // Pegamos a data de vencimento e a data de hoje
  487. $invoiceDuedate = $getinvoiceResults['duedate']; // Data de vencimento da fatura
  488. $dataHoje = date('Y-m-d'); // Data de Hoje
  489.  
  490. // Se a data do vencimento da fatura for maior que o dia de hoje
  491. if ( $invoiceDuedate >= date('Y-m-d') ) {
  492.  
  493. // Usamos a data de vencimento normalmente
  494. $billetDuedate = $invoiceDuedate;
  495.  
  496. // Se a data de vencimento da fatura for menor que o dia de hoje
  497. } elseif( $invoiceDuedate < date('Y-m-d')) {
  498.  
  499. // Pegamos a data de hoje, adicionamos um dia e usamos como nova data de vencimento
  500. $billetDuedate = date('Y-m-d', strtotime('+1 day'));
  501.  
  502. }
  503.  
  504. // Pegamos as datas que definimos anteriormente e transformamos em objeto Date do PHP
  505. $data1 = new DateTime($billetDuedate);
  506. $data2 = new DateTime($dataHoje);
  507.  
  508. // Comparamos as datas para enviar o resultado a PagHiper. Isso é necessário pois o gateway pede o vencimento em número de dias no futuro, não como data.
  509. $intervalo = $data1->diff($data2);
  510. $vencimentoBoleto = $intervalo->days;
  511.  
  512. // Checamos uma ultima vez se o ID da fatura não veio vazio
  513. if($_GET["invoiceid"] == '') {
  514. exit("Fatura inexistente");
  515. } else {
  516. $invoiceid = $_GET["invoiceid"];
  517. $urlRetorno = $systemurl.'modules/gateways/'.basename(__FILE__);
  518.  
  519. // Executamos o checkout transparente e printamos o resultado
  520. echo httpPost("https://www.paghiper.com/checkout/",$params,$GATEWAY,$invoiceid,$urlRetorno,$vencimentoBoleto);
  521. exit;
  522. }
  523.  
  524. // Caso contrário, é um post do PagHiper.
  525. } else {
  526.  
  527. // Pegamos os campos enviados por POST. Vamos checar esses dados.
  528. $idTransacao = $_POST['idTransacao'];
  529. $status = $_POST['status'];
  530. $urlPagamento = $_POST['urlPagamento'];
  531. $linhaDigitavel = $_POST['linhaDigitavel'];
  532. $codRetorno = $_POST['codRetorno'];
  533. $valorOriginal = $_POST['valorOriginal'];
  534. $valorLoja = $_POST['valorLoja'];
  535. $amountGateway = $_POST['valorTotal'];
  536. $idPlataforma = $_POST['idPlataforma'];
  537.  
  538. // Calcula a taxa cobrada pela PagHiper de maneira dinâmica e registra para uso no painel.
  539. $fee = $_POST['valorTotal']-$_POST['valorLoja'];
  540.  
  541. // Antes de mais nada, checamos se o ID da fatura existe no banco.
  542. $invoiceid = checkCbInvoiceID($idPlataforma,$GATEWAY["name"]);
  543.  
  544. // Vamos enviar esses dados a PagHiper pra termos certeza de que são autênticos
  545. $post = "idTransacao=$idTransacao" .
  546. "&status=$status" .
  547. "&codRetorno=$codRetorno" .
  548. "&valorOriginal=$valorOriginal" .
  549. "&valorLoja=$valorLoja" .
  550. "&token=$account_token";
  551. $enderecoPost = "https://www.paghiper.com/checkout/confirm/";
  552.  
  553. // Prepara a chamada Curl que vamos usar.
  554. ob_start();
  555. $ch = curl_init();
  556. curl_setopt($ch, CURLOPT_URL, $enderecoPost);
  557. curl_setopt($ch, CURLOPT_POST, true);
  558. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  559. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  560. curl_setopt($ch, CURLOPT_HEADER, false);
  561. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  562. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  563. $resposta = curl_exec($ch); // Importante, verifica se o retorno automatico é verdadeiro
  564. curl_close($ch);
  565.  
  566. // O valor que procuramos na confirmação da PagHiper é esse. Se der true, podemos prosseguir.
  567. $confirmado = (strcmp ($resposta, "VERIFICADO") == 0);
  568.  
  569. // Só executamos o bloco condicional abaixo se o post da PagHiper for confirmado.
  570. if ($confirmado) {
  571.  
  572. if($GATEWAY["integracao_avancada"] == TRUE) {
  573. $custom_table = check_table();
  574. if($custom_table) {
  575. $log_transaction = full_query("INSERT INTO 'mod_paghiper' (idTransacao,status,urlPagamento,linhaDigitavel,codRetorno,type) VALUES ($idTransacao,$status,$urlPagamento,$linhaDigitavel,$codRetorno,'retorno'");
  576. if(!$log_transaction) {
  577. logTransaction($GATEWAY["name"],$_POST,"Não foi possível gravar os dados no banco.");
  578. }
  579. }
  580. }
  581.  
  582. // Pegamos a fatura como array e armazenamos na variável para uso posterior
  583. $command = "getinvoice";
  584. $values["invoiceid"] = $invoiceid;
  585. $results = localAPI($command,$values,$whmcsAdmin);
  586.  
  587. // Abaixo evitamos que eventuais taxas extrar sejam adicionadas como crédito na conta do cliente.
  588. if($results['total'] < $amountGateway):
  589. $amountGateway = $results['total'];
  590. endif;
  591.  
  592. // Função que vamos usar na localAPI
  593. $addtransaction = "addtransaction";
  594.  
  595. // Cliente fez emissão do boleto, logamos apenas como memorando
  596. if ($status == "Aguardando") {
  597.  
  598. $addtransvalues['userid'] = $results['userid'];
  599. $addtransvalues['invoiceid'] = $invoiceid;
  600. $addtransvalues['description'] = "Boleto gerado aguardando pagamento.";
  601. $addtransvalues['amountin'] = '0.00';
  602. $addtransvalues['fees'] = '0.00';
  603. $addtransvalues['paymentmethod'] = 'paghiper';
  604. $addtransvalues['transid'] = $idTransacao.'-Boleto-Gerado';
  605. $addtransvalues['date'] = date('d/m/Y');
  606. $addtransresults = localAPI($addtransaction,$addtransvalues,$whmcsAdmin);
  607. logTransaction($GATEWAY["name"],$_POST,"Aguardando o Pagamento"); # Salva informações da transação no log do WHMCS.
  608.  
  609. // Transação foi aprovada
  610. } else if ($status == "Aprovado") {
  611.  
  612. // Essa função checa se a transação ja foi registrada no banco de dados.
  613. checkCbTransID($idTransacao);
  614.  
  615. // Registramos o pagamento e damos baixa na fatura
  616. addInvoicePayment($invoiceid,$idTransacao,$amountGateway,$fee,'paghiper');
  617.  
  618. // Logamos a transação no log de Gateways do WHMCS.
  619. logTransaction($GATEWAY["name"],$_POST,"Transação Concluída");
  620.  
  621. // Transação Cancelada.
  622. } else if ($status == "Cancelado") {
  623.  
  624. // Boleto não foi pago, logamos apenas como memorando
  625. logTransaction($GATEWAY["name"],$_POST,"Transação Cancelada");
  626. }
  627.  
  628. //TODO
  629. // Prever todos os tipos de retorno.
  630. }
  631.  
  632.  
  633. }
  634. }
  635.  
  636. // Helper Functions
  637.  
  638. function get_system_url($params = NULL){
  639. if(array_key_exists('systemurl', $params)) {
  640. $systemurl = $params['systemurl'];
  641. } else {
  642. $query = "SELECT value FROM tblconfiguration WHERE setting = 'SystemSSLURL' OR setting = 'SystemURL' LIMIT 1";
  643. $result = mysql_query($query);
  644. $data = mysql_fetch_array($result);
  645. $systemurl = $data[0];
  646. }
  647.  
  648.  
  649. return $systemurl;
  650. }
  651.  
  652. function apply_custom_taxes($amount, $GATEWAY, $params = NULL){
  653.  
  654. if(array_key_exists('amount', $params)) {
  655. $amount = $params['amount'];
  656. $porcento = $params['porcento'];
  657. $taxa = $params['taxa'];
  658. } else {
  659. $porcento = $GATEWAY['porcento'];
  660. $taxa = $GATEWAY['taxa'];
  661. }
  662. return number_format(($amount+((($amount / 100) * $porcento) + $taxa)), 2, '.', ''); # Formato: ##.##
  663. }
  664.  
  665. ?>
RAW Paste Data