PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/controller/tpv.php

https://github.com/alugo/Goteo
PHP | 259 lines | 205 code | 30 blank | 24 comment | 9 complexity | ef8d0033bf352b26a3bad14290087ef4 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /*
  3. * Copyright (C) 2012 Platoniq y Fundación Fuentes Abiertas (see README for details)
  4. * This file is part of Goteo.
  5. *
  6. * Goteo is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU Affero General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Goteo is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Affero General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Affero General Public License
  17. * along with Goteo. If not, see <http://www.gnu.org/licenses/agpl.txt>.
  18. *
  19. */
  20. namespace Goteo\Controller {
  21. use Goteo\Model\Invest,
  22. Goteo\Model\Project,
  23. Goteo\Model\User,
  24. Goteo\Core\Error,
  25. Goteo\Library\Feed,
  26. Goteo\Library\Text,
  27. Goteo\Core\Redirection;
  28. require_once 'library/paypal/stub.php'; // sí, uso el stub del SDK paypal
  29. require_once 'library/paypal/log.php'; // sí, uso el log del SDK paypal
  30. class Tpv extends \Goteo\Core\Controller {
  31. /* Kept as example */
  32. public static $errcode = array(
  33. '0' => 'Operación aprobada',
  34. '1' => 'COMUNICACION ON-LINE INCORRECTA',
  35. '2' => 'ERROR AL CALCULAR FIRMA',
  36. '5' => 'ERROR. Error en el SELECT COMERCIOS <%d>',
  37. '6' => 'ERROR. Faltan campos obligatorios',
  38. '7' => 'ERROR. MerchantID inexistente <%d>',
  39. '9' => 'ERROR. No se pudo conectar a ORACLE <%d>',
  40. '10' => 'ERROR. Tarjeta errónea',
  41. '12' => 'FIRMA: %s-%s',
  42. '13' => 'OPERACION INCORRECTA',
  43. '14' => 'ERROR. Error en el SELECT OPERACIONES <%d>',
  44. '15' => 'ERROR. Operación inexistente <%d>',
  45. '16' => 'ERROR. Operación ya anulada <%d>',
  46. '17' => 'ERROR AL OBTENER CLAVE',
  47. '18' => 'ERROR. El ETILL no acepta el pedido',
  48. '19' => 'ERROR. Datos no numéricos',
  49. '20' => 'ERROR. Datos no alfa-numéricos',
  50. '21' => 'ERROR en el calculo del MAC',
  51. '22' => 'ERROR en el calculo del MAC [%s - %s][cadena:%s]',
  52. '23' => 'ERROR. Usuario o password no valido.',
  53. '24' => 'ERROR. Tipo de moneda no valido. La operación debe realizarse en Euros.',
  54. '25' => 'ERROR. Importe no Integer.',
  55. '26' => 'ERROR. Operación no realizable 100.',
  56. '27' => 'ERROR. Formato CVV2/CVC2 no valido.',
  57. '28' => 'ERROR. Debe especificar el CVV2/CVC2 de su tarjeta.',
  58. '29' => 'ERROR. CVV2 no Integer.',
  59. '30' => 'ERROR. En estos momentos no es posible continuar sin cvc2/cvv2',
  60. '31' => 'ERROR. ERROR en la operatoria del comercio.',
  61. '32' => 'ERROR. Tipo de moneda no valido. La operación debe realizarse en Euros.',
  62. '33' => 'ERROR. El comercio solo puede realizar pagos en Euros',
  63. '34' => 'ERROR. Moneda o conversión no valida para esta tarjeta.[%d]',
  64. '35' => 'ERROR. Moneda o conversión no valida.[%d]',
  65. '36' => 'ERROR. Conversión a Euros no válida [%s][%s].',
  66. '37' => 'ERROR. El comercio no dispone de esta opción.',
  67. '38' => 'ERROR. Respuesta Errónea del Gestor de operaciones. [%d][%s].',
  68. '39' => 'ERROR. No es posible continuar con la preautorizacion.',
  69. '40' => 'ERROR. Error de comunicaciones Lu´s. No es posible finalizar la operación.',
  70. '41' => 'ERROR. TimeOut SEP. No es posible finalizar la operación.',
  71. '42' => 'ERROR. SEP devuelve un 20 ERROR. No es posible finalizar la operación.',
  72. '43' => 'ERROR. Error inesperado. No es posible finalizar la operación [%d].',
  73. '44' => 'ERROR. Respuesta Errónea de SEP. No es posible finalizar la operación.',
  74. '45' => 'ERROR. No es posible continuar con la preautorización.',
  75. '46' => 'ERROR. Error en el proceso de Autentificación. No retroceda en el navegador. Debe volver al comercio y reintentar el pago.',
  76. '47' => 'ERROR. Entidad no disponible. Inténtelo dentro de unos minutos',
  77. '48' => 'ERROR. Error en el proceso de Autentificación. Respuesta PAREQ no valida [%d]. No retroceda en el navegador. Debe volver al comercio y reintentar el pago.',
  78. '49' => 'ERROR. Error en el proceso de Autentificación. Respuesta PAREQ de su entidad no valida: %s,TXSTATUS',
  79. '50' => 'ERROR. Fallo en el proceso de Autentificación. Es necesario una identificación positiva para finalizar el proceso de compra: %s,TXSTATUS',
  80. '51' => 'ERROR. Fallo en el proceso de Autentificación. El comercio no acepta pagos no seguros: %s. Póngase en contacto con la entidad emisora de su tarjeta.,TXSTATUS',
  81. '52' => 'ERROR. En estos momentos no es posible iniciar un pago seguro',
  82. '53' => 'ERROR. Comercio seguro. Su tarjeta no admite autentificación y no puede operar en este comercio [%s]. Póngase en contacto con la entidad emisora de su tarjeta.',
  83. '54' => 'ERROR. No es posible iniciar un pago seguro y el importe supera el máximo permitido (%f <= %s). [Resultado: %s]',
  84. '55' => 'ERROR. En este momento no es posible iniciar un pago seguro. [Resultado: %s]',
  85. '56' => 'ERROR. No es posible iniciar un pago seguro y el importe supera el máximo permitido (%f <= %s). [Resultado: %s]',
  86. '57' => 'ERROR. En este momento no es posible iniciar un pago seguro y el importe supera el máximo permitido (%f <= %s). [Resultado: %s]',
  87. '58' => 'ERROR. En este momento no es posible iniciar un pago seguro. [Resultado: %s]',
  88. '59' => 'ERROR. El comercio tiene un filtro que no permite esta operación.',
  89. '60' => 'ERROR. El Comercio solo admite pago seguro. Necesita autentificarse para continuar.',
  90. '61' => 'ERROR. Operación segura no permitida. Importe (%14.2f) mayor del limite establecido (%14.2f).',
  91. '62' => 'ERROR. El comercio tiene un filtro que no permite esta operación.(Filtro2:%d)',
  92. '63' => 'ERROR. El comercio no acepta pagos Visa no autentificados. Póngase en contacto con su entidad para activar este tipo de pago.',
  93. '64' => 'ERROR. El comercio no acepta pagos MasterCard no autentificado. Póngase en contacto con su entidad para activar este tipo de pago.',
  94. '65' => 'ERROR. El comercio no acepta pagos no autentificados. Póngase en contacto con su entidad para activar este tipo de pago.',
  95. '66' => 'ERROR. Error de proceso. El comercio no acepta pagos no autentificados. Póngase en contacto con su entidad para activar este tipo de pago.',
  96. '67' => 'ERROR. Operación segura no autorizada. Importe (%14.2f) mayor del limite establecido (%14.2f).',
  97. '68' => 'ERROR. Respuesta Errónea del Gestor de operaciones. Operación anulada [%s].Gestor: [%d][%s].',
  98. '69' => 'ERROR. Operatoria UCAF no valida. Póngase en contacto con su comercio o caja.',
  99. '100' => 'Tarjeta no válida (en negativos)',
  100. '101' => 'Tarjeta caducada',
  101. '104' => 'Tarjeta no válida (electrón)',
  102. '106' => 'Tarjeta no válida (reintentos de PIN)',
  103. '111' => 'Número de tarjeta mal tecleado (check)',
  104. '112' => 'Tarjeta no válida (se exige PIN)',
  105. '114' => 'No admitida la forma de pago solicitada',
  106. '116' => 'Saldo insuficiente',
  107. '118' => 'Tarjeta no válida (no existente en ficheros)',
  108. '120' => 'Tarjeta no válida en este comercio',
  109. '121' => 'Disponible sobrepasado',
  110. '123' => 'Número máximo de operaciones superado',
  111. '125' => 'La tarjeta todavía no es operativa',
  112. '180' => 'Tarjeta no soportada por el sistema',
  113. '190' => 'Operación no realizable (resto de casos)',
  114. '400' => 'Anulación aceptada',
  115. '480' => 'Anulación por TO aceptada sin encontrar la operación original',
  116. '900' => 'Devolución aceptada',
  117. '904' => 'Operación no realizable (error de formato)',
  118. '908' => 'Tarjeta desconocida',
  119. '909' => 'Operación no realizable (error de sistema)',
  120. '912' => 'Su entidad no está disponible',
  121. '913' => 'Operación no realizable (clave duplicada)',
  122. '914' => 'No existe la operación a anular',
  123. '930' => 'Operación no realizable (caja merchant no válida)',
  124. '931' => 'Operación no realizable (comercio no dado de alta)',
  125. '932' => 'Operación no realizable (bin merchant no existe)',
  126. '933' => 'Operación no realizable (sector desconocido)',
  127. '940' => 'Ya recibida una anulación',
  128. '944' => 'Operación no realizable (sesión no válida)',
  129. '948' => 'Operación no realizable (fecha/hora inválida)',
  130. '950' => 'Devolución no aceptada',
  131. '999' => 'Operación no realizable (resto de casos)'
  132. );
  133. public function index () {
  134. throw new Redirection('/', Error::BAD_REQUEST);
  135. }
  136. /* Tratamiento de comunicaciones B2B */
  137. public function comunication () {
  138. @mail(\GOTEO_FAIL_MAIL, 'Comunicacion online', 'Este GET<pre>' . print_r($_GET, 1) . '</pre> y este POST:<pre>' . print_r($_POST, 1) . '</pre>');
  139. if (isset($_POST['__expected_field___'])) {
  140. $_POST['invest'] = $id = $_POST['__expected_field___'];
  141. $invest = Invest::get($id);
  142. $userData = User::getMini($invest->user);
  143. $projectData = Project::getMini($invest->project);
  144. $response = '';
  145. foreach ($_POST as $n => $v) {
  146. $response .= "{$n}:'{$v}'; ";
  147. }
  148. $conf = array('mode' => 0600, 'timeFormat' => '%X %x');
  149. $logger = &\Log::singleton('file', 'logs/'.date('Ymd').'_invest.log', 'caller', $conf);
  150. $logger->log("response: $response");
  151. $logger->log('##### END TPV ['.$id.'] '.date('d/m/Y').' '.$_POST['__expected_field___'].'#####');
  152. $logger->close();
  153. if (!empty($_POST['__expected_field___'])) {
  154. try {
  155. $tpvRef = $_POST['__expected_field___'];
  156. $tpvAut = $_POST['__expected_field___'];
  157. $values = array(
  158. ':id' => $invest->id,
  159. ':payment' => $tpvRef,
  160. ':transaction' => $tpvAut,
  161. ':charged' => date('Y-m-d')
  162. );
  163. $sql = "UPDATE invest
  164. SET
  165. status = 1,
  166. payment = :payment,
  167. charged = :charged,
  168. transaction = :transaction
  169. WHERE id = :id";
  170. if (Invest::query($sql, $values)) {
  171. Invest::setDetail($invest->id, 'tpv-response', 'La comunicación online del tpv se a completado correctamente. Proceso controller/tpv');
  172. } else {
  173. @mail(\GOTEO_FAIL_MAIL, 'Error db en comunicacion online', 'En la grabación de referencia, num auth. y estado. Ha fallado: '.$sql.' '.print_r($values, 1).'<hr /><pre>' . print_r($invest, 1) . '</pre>');
  174. }
  175. // CALLSYS
  176. } catch (\PDOException $e) {
  177. @mail(\GOTEO_FAIL_MAIL, 'Error db en comunicacion online', 'En la grabación de referencia, num auth. y estado. Ha dado un PDO::Exception<br /><pre>' . print_r($invest, 1) . '</pre>');
  178. }
  179. $_POST['result'] = 'Transaccion ok';
  180. $log_text = "%s ha aportado %s al proyecto %s mediante TPV";
  181. $doPublic = true;
  182. echo '$*$OKY$*$';
  183. } else {
  184. $Cerr = (string) $_POST['Codigo_error'];
  185. $errTxt = self::$errcode[$Cerr];
  186. Invest::setDetail($invest->id, 'tpv-response-error', 'El tpv ha comunicado el siguiente Codigo error: '.$Cerr.' - '.$errTxt.'. El aporte a quedado \'En proceso\'. Proceso controller/tpv');
  187. @mail(\GOTEO_FAIL_MAIL, 'Error en TPV', 'Codigo error: '.$Cerr.' '.$errTxt.'<br /><pre>' . print_r($_POST, 1) . '</pre>');
  188. $invest->cancel('ERR '.$Cerr);
  189. $_POST['result'] = 'Fail';
  190. $log_text = 'Ha habido un <span class="red">ERROR de TPV (Codigo: '.$Cerr.' '.$errTxt.')</span> en el aporte de %s de %s al proyecto %s mediante TPV';
  191. $doPublic = false;
  192. }
  193. // Evento Feed
  194. $log = new Feed();
  195. $log->setTarget($projectData->id);
  196. $log->populate('Aporte TPV', '/admin/invests',
  197. \vsprintf($log_text, $log_items = array(
  198. Feed::item('user', $userData->name, $userData->id),
  199. Feed::item('money', $invest->amount.' &euro;'),
  200. Feed::item('project', $projectData->name, $projectData->id))
  201. ));
  202. $log->doAdmin('money');
  203. if ($doPublic) {
  204. // evento público
  205. $log_html = Text::html('feed-invest',
  206. Feed::item('money', $invest->amount.' &euro;'),
  207. Feed::item('project', $projectData->name, $projectData->id));
  208. if ($invest->anonymous) {
  209. $log->populate(Text::get('regular-anonymous'), '/user/profile/anonymous', $log_html, 1);
  210. } else {
  211. $log->populate($userData->name, '/user/profile/'.$userData->id, $log_html, $userData->avatar->id);
  212. }
  213. $log->doPublic('community');
  214. }
  215. unset($log);
  216. } else {
  217. echo 'Se esperaban recibir datos de comunicación online del TPV.';
  218. @mail(\GOTEO_FAIL_MAIL, 'Comunicacion online sin datos', 'Este GET<pre>' . print_r($_GET, 1) . '</pre> y este POST:<pre>' . print_r($_POST, 1) . '</pre>');
  219. // throw new Redirection('/', Error::BAD_REQUEST);
  220. }
  221. die;
  222. }
  223. public function simulacrum () {
  224. echo 'Simulacrum<br />';
  225. @mail(\GOTEO_FAIL_MAIL, 'Test request', 'Recibido Este GET<pre>' . print_r($_GET, 1) . '</pre> y este POST:<pre>' . print_r($_POST, 1) . '</pre>');
  226. die;
  227. }
  228. }
  229. }