Advertisement
tecsecret

paghiper whmcs

Jan 23rd, 2019
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.88 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4. * PagHiper - Módulo oficial para integração com WHMCS
  5. *
  6. * @package PagHiper para WHMCS
  7. * @version 1.121
  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() {
  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.121</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('+0 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 = rtrim($params['systemurl'],"/");
  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. <button class='btn btn-success btn-block' style='margin-top: 5px;' type=\"submit\"><i class='fas fa-barcode'></i> Gerar Boleto</button> <br>
  248. <div class='alert alert-warning' role='alert'>
  249. <strong>Importante:</strong> A compensação bancária poderá levar até 3 dias úteis.
  250. </div>
  251. <!-- FIM DO BOLETO PAGHIPER -->
  252. </form>
  253. {$abrirAuto}";
  254. } else {
  255. $code = "
  256. <!-- INICIO DO FORM DO BOLETO PAGHIPER -->
  257. <form name=\"paghiper\" {$target} action=\"https://www.paghiper.com/checkout/\" method=\"post\">
  258. <input name='email_loja' type='hidden' value='{$params['email']}'>
  259. <!-- Informações opcionais -->
  260. <input name='urlRetorno' type='hidden' value='{$urlRetorno}'>
  261. <input name='vencimentoBoleto' type='hidden' value='{$vencimentoBoleto}'>
  262. <!-- Dados do produto -->
  263. <input name='id_plataforma' type='hidden' value='{$params['invoiceid']}' />
  264. <input name='produto_codigo_1' type='hidden' value='{$params['invoiceid']}' />
  265. <input name='produto_valor_1' type='hidden' value='{$valorInvoice}'>
  266. <input name='produto_descricao_1' type='hidden' value='Fatura #{$params['invoiceid']}'>
  267. <input name='produto_qtde_1' type='hidden' value='1'>";
  268.  
  269. $code .= $code_insert;
  270. $code .= "
  271.  
  272. <!-- Dados do cliente -->
  273. <input name='email' type='hidden' value='{$params['clientdetails']['email']}' />
  274. <input name='nome' type='hidden' value='{$params['clientdetails']['firstname']} {$params['clientdetails']['lastname']}'>
  275.  
  276. <input name='telefone' type='hidden' value='{$params['clientdetails']['phonenumber']}' />
  277.  
  278. <input name='endereco' type='hidden' value='{$params['clientdetails']['address1']}' />
  279. <input name='bairro' type='hidden' value='{$params['clientdetails']['address2']}' />
  280. <input name='cidade' type='hidden' value='{$params['clientdetails']['city']}' />
  281. <input name='estado' type='hidden' value='{$params['clientdetails']['state']}' />
  282. <input name='cep' type='hidden' value='{$params['clientdetails']['postcode']}' />
  283. <input name='numero_casa' type='hidden' value='S/N' />
  284. <input name='complemento' type='hidden' value='{$params['clientdetails']['address2']}' />
  285. <input name='idPartners' type='hidden' value='D1J0M5GD' />
  286. <input name='pagamento' type='hidden' id='pagamento' />
  287. <input type='image' src='https://www.paghiper.com/img/checkout/boleto/boleto-120px-69px.jpg'
  288. title='Pagar com Boleto' alt='Pagar com Boleto' border='0'
  289. align='absbottom' /><br>
  290. <button class='btn btn-success btn-block' style='margin-top: 5px;' type=\"submit\"><i class='fas fa-barcode'></i> Gerar Boleto</button> <br>
  291. <div class='alert alert-warning' role='alert'>
  292. <strong>Importante:</strong> A compensação bancária poderá levar até 2 dias úteis.
  293. </div>
  294. <!-- FIM DO BOLETO PAGHIPER -->
  295. </form>
  296. {$abrirAuto}";
  297. }
  298.  
  299.  
  300.  
  301. return $code;
  302. }
  303.  
  304. function httpPost($url,$params,$GATEWAY,$invoiceid,$urlRetorno,$vencimentoBoleto)
  305. {
  306. $postData = '';
  307. $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'";
  308. $result = mysql_query($query);
  309. $data = mysql_fetch_array($result);
  310. $id = $data["id"];
  311. $myid = $data["myid"];
  312. $firstname = $data["firstname"];
  313. $lastname = $data["lastname"];
  314. $companyname = $data["companyname"];
  315. $address1 = $data["address1"];
  316. $address2 = $data["address2"];
  317. $city = $data["city"];
  318. $state = $data["state"];
  319. $postcode = $data["postcode"];
  320. $date = $data["email"];
  321. $subtotal = $data["total"];
  322. $credit = $data["credit"];
  323. $tax = $data["tax"];
  324. $taxrate = $data["taxrate"];
  325. $phone = $data["phonenumber"];
  326. $email = $data["email"];
  327. $total = $data["total"];
  328. $cpfcnpj = $GATEWAY['cpf_cnpj'];
  329. $query2 = "SELECT * FROM tblcustomfieldsvalues WHERE relid = $myid and fieldid = $cpfcnpj";
  330. $result2 = mysql_query($query2);
  331. $data2 = mysql_fetch_array($result2);
  332. $cpf = $data2["value"];
  333.  
  334. //TODO
  335. $subtotal = apply_custom_taxes($subtotal, $GATEWAY, $params);
  336.  
  337. // Preparate data to send
  338. $paghiper_data = array(
  339. "email_loja" => $GATEWAY['email'],
  340. "idPartners" => "D1J0M5GD",
  341.  
  342. // Informações opcionais
  343. "urlRetorno" => $urlRetorno,
  344. "vencimentoBoleto" => $vencimentoBoleto,
  345.  
  346. // Dados do produto
  347. "id_plataforma" => $invoiceid,
  348. "produto_codigo_1" => $invoiceid,
  349. "produto_valor_1" => $subtotal,
  350. "produto_descricao_1" => 'Fatura #'.$invoiceid,
  351. "produto_qtde_1" => 1,
  352.  
  353. // Dados do cliente
  354. "email" => $email,
  355. "nome" => $firstname . ' ' . $lastname,
  356. "telefone" => $phone,
  357. "endereco" => $address1,
  358. "bairro" => $address2,
  359. "cidade" => $city,
  360. "estado" => $$state,
  361. "cep" => $postcode,
  362. );
  363.  
  364.  
  365. // Checa se incluimos dados CPF ou CNPJ no post
  366. if ($cpf != " " or $cpf != "on file") {
  367. if(strpos($cpf, '/') !== false) {
  368. $paghiper_data["razao_social"] = $companyname;
  369. $paghiper_data["cnpj"] = substr(trim(str_replace(array('+','-'), '', filter_var($cpf, FILTER_SANITIZE_NUMBER_INT))), -14);
  370. } else {
  371. $paghiper_data["cpf"] = substr(trim(str_replace(array('+','-'), '', filter_var($cpf, FILTER_SANITIZE_NUMBER_INT))), -15);
  372. }
  373. } elseif(!isset($cpfcnpj) || $cpfcnpj == '') {
  374. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. Você não definiu o campo CPF/CNPJ");
  375. } elseif(!isset($cpf_cnpj) || $cpf_cnpj == '') {
  376. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. CPF/CNPJ do cliente não foi informado");
  377. } else {
  378. logTransaction($GATEWAY["name"],$_POST,"Boleto não exibido. Erro indefinido");
  379. }
  380.  
  381. if($GATEWAY['frasefixa'] == true) {
  382. $paghiper_data["frase_fixa_boleto"] = true;
  383. }
  384.  
  385. $paghiper_data["pagamento"] = "pagamento";
  386.  
  387. // Pegar todos os dados que setamos e preparamos para enviar. Os dados vão todos na URL.
  388. foreach($paghiper_data as $k => $v)
  389. {
  390. $postData .= $k . '='.$v.'&';
  391. }
  392. $postData = rtrim($postData, '&');
  393.  
  394. $ch = curl_init();
  395.  
  396. curl_setopt($ch, CURLOPT_URL,$url);
  397. curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  398. curl_setopt($ch, CURLOPT_HEADER, false);
  399. curl_setopt($ch, CURLOPT_POST, count($postData));
  400. curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
  401. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  402. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  403.  
  404.  
  405. $output=curl_exec($ch);
  406.  
  407. curl_close($ch);
  408. return $output;
  409.  
  410. }
  411.  
  412. function check_table() {
  413. $table_create = full_query("CREATE TABLE IF NOT EXISTS `mod_paghiper` (
  414. `id` int(11) NOT NULL AUTO_INCREMENT,
  415. `idTransacao` varchar(16) NOT NULL,
  416. `status` varchar(45) NOT NULL,
  417. `urlPagamento` varchar(255) DEFAULT NULL,
  418. `linhaDigitavel` varchar(54) DEFAULT NULL,
  419. `codRetorno` varchar(64) NOT NULL,
  420. `type` varchar(10) NOT NULL,
  421. PRIMARY KEY (`id`),
  422. KEY `idTransacao` (`idTransacao`)
  423. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 AUTO_INCREMENT=1 ;");
  424. if(!$table_create) {
  425. return false;
  426. logTransaction($GATEWAY["name"],$_POST,"Não foi possível gravar os dados no banco.");
  427. } else {
  428. return true;
  429. }
  430.  
  431. }
  432.  
  433. // Nenhuma das funções foi executada, então o script foi acessado diretamente.
  434. if (basename(__FILE__) == basename($_SERVER['SCRIPT_NAME'])) {
  435.  
  436. header("access-control-allow-origin: *");
  437.  
  438. // Inicializar WHMCS, carregar o gateway e a fatura.
  439. require "../../init.php";
  440. $whmcs->load_function("gateway");
  441. $whmcs->load_function("invoice");
  442.  
  443. // Initialize module settings
  444. $GATEWAY = getGatewayVariables("paghiper");
  445.  
  446. // Define variáveis para configurações do gateway
  447. $gateway_name = $GATEWAY["name"];
  448. $account_email = trim($GATEWAY["email"]);
  449. $account_token = trim($GATEWAY['token']);
  450. $transparent_checkout = $GATEWAY['transparentcheckout'];
  451.  
  452. // Se o usuário admin estiver vazio nas configurações, usamos o padrão
  453. $whmcsAdmin = (empty(trim($GATEWAY['admin'])) ? 'admin' : trim($GATEWAY['admin']));
  454.  
  455.  
  456.  
  457. // Se as condições baterem, estamos lidando com um post do checkout transparente.
  458. if($GATEWAY['transparentcheckout'] == true && isset($_GET["invoiceid"])) {
  459.  
  460. // Vamos precisar pegar a URL do sistema direto do banco de dados. A variável $params não está disponível nesse momento.
  461. $systemurl = rtrim(($CONFIG['SystemSSLURL'] ? $CONFIG['SystemSSLURL'] : $CONFIG['SystemURL']),"/");
  462.  
  463. $user_id = intval($_GET["uuid"]);
  464. $user_email = $_GET["mail"];
  465. //echo 'a';
  466.  
  467. // Pegamos a fatura no banco de dados
  468. $getinvoice = 'getinvoice';
  469. $getinvoiceid['invoiceid'] = intval($_GET["invoiceid"]);
  470. $getinvoiceResults = localAPI($getinvoice,$getinvoiceid,$whmcsAdmin);
  471. //print_r($getinvoiceResults);
  472. //echo $user_id . ' / '. $getinvoiceResults['userid'];
  473.  
  474. if(intval($getinvoiceResults['userid']) !== $user_id) {
  475. //echo 'ops!';
  476. exit;
  477. } else {
  478. $query = "SELECT email FROM tblclients WHERE id = '".$user_id."' LIMIT 1";
  479. $result = mysql_query($query);
  480. $data = mysql_fetch_array($result);
  481. $email = $data[0];
  482.  
  483. if($email !== $user_email) {
  484. exit;
  485. }
  486. }
  487.  
  488.  
  489.  
  490.  
  491.  
  492. // Pegamos a data de vencimento e a data de hoje
  493. $invoiceDuedate = $getinvoiceResults['duedate']; // Data de vencimento da fatura
  494. $dataHoje = date('Y-m-d'); // Data de Hoje
  495.  
  496. // Se a data do vencimento da fatura for maior que o dia de hoje
  497. if ( $invoiceDuedate >= date('Y-m-d') ) {
  498.  
  499. // Usamos a data de vencimento normalmente
  500. $billetDuedate = $invoiceDuedate;
  501.  
  502. // Se a data de vencimento da fatura for menor que o dia de hoje
  503. } elseif( $invoiceDuedate < date('Y-m-d')) {
  504.  
  505. // Pegamos a data de hoje, adicionamos um dia e usamos como nova data de vencimento
  506. $billetDuedate = date('Y-m-d', strtotime('+1 day'));
  507.  
  508. }
  509.  
  510. // Pegamos as datas que definimos anteriormente e transformamos em objeto Date do PHP
  511. $data1 = new DateTime($billetDuedate);
  512. $data2 = new DateTime($dataHoje);
  513.  
  514. // 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.
  515. $intervalo = $data1->diff($data2);
  516. $vencimentoBoleto = $intervalo->days;
  517.  
  518. // Checamos uma ultima vez se o ID da fatura não veio vazio
  519. if($_GET["invoiceid"] == '') {
  520. exit("Fatura inexistente");
  521. } else {
  522. $invoiceid = $_GET["invoiceid"];
  523. $urlRetorno = $systemurl.'/modules/gateways/'.basename(__FILE__);
  524.  
  525. // Executamos o checkout transparente e printamos o resultado
  526. echo httpPost("https://www.paghiper.com/checkout/",$params,$GATEWAY,$invoiceid,$urlRetorno,$vencimentoBoleto);
  527. exit;
  528. }
  529.  
  530. // Caso contrário, é um post do PagHiper.
  531. } else {
  532.  
  533. // Pegamos os campos enviados por POST. Vamos checar esses dados.
  534. $idTransacao = $_POST['idTransacao'];
  535. $status = $_POST['status'];
  536. $urlPagamento = $_POST['urlPagamento'];
  537. $linhaDigitavel = $_POST['linhaDigitavel'];
  538. $codRetorno = $_POST['codRetorno'];
  539. $valorOriginal = $_POST['valorOriginal'];
  540. $valorLoja = $_POST['valorLoja'];
  541. $amountGateway = $_POST['valorTotal'];
  542. $idPlataforma = $_POST['idPlataforma'];
  543.  
  544. // Calcula a taxa cobrada pela PagHiper de maneira dinâmica e registra para uso no painel.
  545. $fee = $_POST['valorTotal']-$_POST['valorLoja'];
  546.  
  547. // Antes de mais nada, checamos se o ID da fatura existe no banco.
  548. $invoiceid = checkCbInvoiceID($idPlataforma,$GATEWAY["name"]);
  549.  
  550. // Vamos enviar esses dados a PagHiper pra termos certeza de que são autênticos
  551. $post = "idTransacao=$idTransacao" .
  552. "&status=$status" .
  553. "&codRetorno=$codRetorno" .
  554. "&valorOriginal=$valorOriginal" .
  555. "&valorLoja=$valorLoja" .
  556. "&token=$account_token";
  557. $enderecoPost = "https://www.paghiper.com/checkout/confirm/";
  558.  
  559. // Prepara a chamada Curl que vamos usar.
  560. ob_start();
  561. $ch = curl_init();
  562. curl_setopt($ch, CURLOPT_URL, $enderecoPost);
  563. curl_setopt($ch, CURLOPT_POST, true);
  564. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  565. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  566. curl_setopt($ch, CURLOPT_HEADER, false);
  567. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  568. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  569. $resposta = curl_exec($ch); // Importante, verifica se o retorno automatico é verdadeiro
  570. curl_close($ch);
  571.  
  572. // O valor que procuramos na confirmação da PagHiper é esse. Se der true, podemos prosseguir.
  573. $confirmado = (strcmp ($resposta, "VERIFICADO") == 0);
  574.  
  575. // Só executamos o bloco condicional abaixo se o post da PagHiper for confirmado.
  576. if ($confirmado) {
  577.  
  578. if($GATEWAY["integracao_avancada"] == TRUE) {
  579. $custom_table = check_table();
  580. if($custom_table) {
  581. $log_transaction = full_query("INSERT INTO 'mod_paghiper' (idTransacao,status,urlPagamento,linhaDigitavel,codRetorno,type) VALUES ($idTransacao,$status,$urlPagamento,$linhaDigitavel,$codRetorno,'retorno'");
  582. if(!$log_transaction) {
  583. logTransaction($GATEWAY["name"],$_POST,"Não foi possível gravar os dados no banco.");
  584. }
  585. }
  586. }
  587.  
  588. // Pegamos a fatura como array e armazenamos na variável para uso posterior
  589. $command = "getinvoice";
  590. $values["invoiceid"] = $invoiceid;
  591. $results = localAPI($command,$values,$whmcsAdmin);
  592.  
  593. // Abaixo evitamos que eventuais taxas extrar sejam adicionadas como crédito na conta do cliente.
  594. if($results['total'] < $amountGateway):
  595. $amountGateway = $results['total'];
  596. endif;
  597.  
  598. // Função que vamos usar na localAPI
  599. $addtransaction = "addtransaction";
  600.  
  601. // Cliente fez emissão do boleto, logamos apenas como memorando
  602. if ($status == "Aguardando") {
  603.  
  604. $addtransvalues['userid'] = $results['userid'];
  605. $addtransvalues['invoiceid'] = $invoiceid;
  606. $addtransvalues['description'] = "Boleto gerado aguardando pagamento.";
  607. $addtransvalues['amountin'] = '0.00';
  608. $addtransvalues['fees'] = '0.00';
  609. $addtransvalues['paymentmethod'] = 'paghiper';
  610. $addtransvalues['transid'] = $idTransacao.'-Boleto-Gerado';
  611. $addtransvalues['date'] = date('d/m/Y');
  612. $addtransresults = localAPI($addtransaction,$addtransvalues,$whmcsAdmin);
  613. logTransaction($GATEWAY["name"],$_POST,"Aguardando o Pagamento"); # Salva informações da transação no log do WHMCS.
  614.  
  615. // Transação foi aprovada
  616. } else if ($status == "Aprovado") {
  617.  
  618. // Essa função checa se a transação ja foi registrada no banco de dados.
  619. checkCbTransID($idTransacao);
  620.  
  621. // Registramos o pagamento e damos baixa na fatura
  622. addInvoicePayment($invoiceid,$idTransacao,$amountGateway,$fee,'paghiper');
  623.  
  624. // Logamos a transação no log de Gateways do WHMCS.
  625. logTransaction($GATEWAY["name"],$_POST,"Transação Concluída");
  626.  
  627. // Transação Cancelada.
  628. } else if ($status == "Cancelado") {
  629.  
  630. // Boleto não foi pago, logamos apenas como memorando
  631. logTransaction($GATEWAY["name"],$_POST,"Transação Cancelada");
  632. }
  633.  
  634. //TODO
  635. // Prever todos os tipos de retorno.
  636. }
  637.  
  638.  
  639. }
  640. }
  641.  
  642. function apply_custom_taxes($amount, $GATEWAY, $params = NULL){
  643.  
  644. if(array_key_exists('amount', $params)) {
  645. $amount = $params['amount'];
  646. $porcento = $params['porcento'];
  647. $taxa = $params['taxa'];
  648. } else {
  649. $porcento = $GATEWAY['porcento'];
  650. $taxa = $GATEWAY['taxa'];
  651. }
  652. return number_format(($amount+((($amount / 100) * $porcento) + $taxa)), 2, '.', ''); # Formato: ##.##
  653. }
  654.  
  655. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement