{"id":18289741,"url":"https://github.com/oscarnovasf/redsys","last_synced_at":"2025-04-09T07:24:38.835Z","repository":{"id":133194035,"uuid":"301966421","full_name":"oscarnovasf/RedSys","owner":"oscarnovasf","description":"Librería para integrar (o no) en un módulo \"custom\" de Drupal. Permite realizar cobros (tanto normales como recurrentes) a través de RedSys-Semerpa (España).","archived":false,"fork":false,"pushed_at":"2020-10-08T10:18:27.000Z","size":47,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-15T01:41:30.000Z","etag":null,"topics":["cobros","cobros-recurrentes","pagos","pagos-recurrentes","redsys","redsys-api","semerpa","tarjetas","tpv"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oscarnovasf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-07T08:01:57.000Z","updated_at":"2020-10-09T11:12:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"ce9597c5-8736-48d7-8675-dbc0826b7581","html_url":"https://github.com/oscarnovasf/RedSys","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarnovasf%2FRedSys","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarnovasf%2FRedSys/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarnovasf%2FRedSys/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarnovasf%2FRedSys/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oscarnovasf","download_url":"https://codeload.github.com/oscarnovasf/RedSys/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247995834,"owners_count":21030367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cobros","cobros-recurrentes","pagos","pagos-recurrentes","redsys","redsys-api","semerpa","tarjetas","tpv"],"created_at":"2024-11-05T14:07:56.060Z","updated_at":"2025-04-09T07:24:38.803Z","avatar_url":"https://github.com/oscarnovasf.png","language":"PHP","funding_links":["https://paypal.me/oscarnovasf"],"categories":[],"sub_categories":[],"readme":"Pagos vía RedSys con SOAP y redirección\n===\n\n\u003eLibrería para integrar en un módulo personalizado de *Drupal* y poder ejecutar\n\u003ecobros a través de la pasarela RedSys.\n\u003e\n\u003eTambién puede ser utilizada fuera de un entorno *Drupal* adaptando los\n\u003ecorrespondientes ***namespaces*** y ***uses***.\n\n[![version][version-badge]][changelog]\n[![Licencia][license-badge]][license]\n[![Donate][donate-badge]][donate-url]\n\n## Instalación\n\n### Requerimientos\n\n\u003e* Esta clase funciona con PHP \u003e= 5.5.0 pero se recomienda usar la última\n\u003e  versión estable.\n\u003e\n\u003e* Para poder usar la funcionalidad de envío (desde el comercio) de los datos\n\u003e  de la tarjeta debemos solicitar a nuestro banco que activen dicha opción.\n\n### Instalación manual\n\n\u003eCopiamos la carpeta ***src*** dentro de nuestro módulo Drupal y cambiamos los\n\u003e***namespaces*** en los archivos:\n\u003e * RedSys.php\n\u003e * Exception\\RedSysException.php\n\u003e * Messages\\RedSysMessages.php\n\u003e * Utils\\Utils.php\n\u003e * Utils\\Validators.php\n\u003e\n\u003e Sustituímos el valor ***module_name*** por el nombre de nuestro módulo.\n\u003e\n\u003ePor otro lado, en el archivo *RedSys.php* tendremos que modificar también\n\u003elas sentencias ***uses*** para adaptarlas al cambio anterior así como los\n\u003ecomentarios que poseen cláusulas ***@throws***.\n\n\n## Documentación oficial de RedSys\n\n* [Documentación para redirección](https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf)\n* [Documentación para SOAP](https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Web%20Service.pdf)\n\n## Ejemplos de uso\n* ### Pago por redirección:\n  #### OPCIÓN 1.- El banco solicita los datos de la tarjeta.\n\n  ```PHP\n  /**\n   * @file\n   * payment.php\n   */\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\RedSys;\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\Exception\\RedSysException;\n\n  /* Creamos una instancia en entorno de pruebas\n   * (omitimos el último parámetro para un entorno de producción). */\n  $redsys = new Redsys('test');\n\n  try {\n    /* Parámetros obligatorios */\n    $redsys-\u003esetOrder('0001aa');\n    $redsys-\u003esetMerchantCode('999008881');\n    $redsys-\u003esetAmount(99.99);\n    $redsys-\u003esetTradeName('Mi tienda, s.l.');\n    $redsys-\u003esetTitular('Perico de los Palotes');\n    $redsys-\u003esetProductDescription('Compra de producto 1');\n\n    /* Estos parámetros sólo son necesarios si son distintos de los\n     * indicados por defecto. */\n    $redsys-\u003esetTerminal(1);\n    $redsys-\u003esetCurrency(978);\n    $redsys-\u003esetTransactionType('0');\n    $redsys-\u003esetMethod('C');\n    $redsys-\u003esetVersion('HMAC_SHA256_V1');\n    $redsys-\u003esetLanguage('001');\n\n    /* URL de notificación y redirección */\n    $redsys-\u003esetNotification('https://localhost/notification.php');\n    $redsys-\u003esetUrlOk('https://localhost/payment_ok.php');\n    $redsys-\u003esetUrlKo('https://localhost/payment_ko.php');\n\n    /* Establezco cambios en el formulario del TPV.\n     * Estos parámetros son opcionales. */\n    $redsys-\u003esetNameForm('redsys_form');\n    $redsys-\u003esetIdForm('redsys_form');\n    $redsys-\u003esetAttributesSubmit(\n      'btn_submit',\n      'btn_submit',\n      'Realizar pago',\n      '',\n      'btn btn-primary');\n\n    /* Muestro el formulario sin redirección automática */\n    $redsys-\u003egenerateMerchantSignature('sq7HjrUOBfKmC576ILgskD5srU870gJ7');\n    $form = $redsys-\u003ecreateForm(FALSE);\n  }\n  catch (RedSysException $e) {\n    echo $e-\u003egetMessage();\n    die;\n  }\n\n  echo $form;\n\n  ```\n\n  #### OPCIÓN 2.- Capturamos nosotros los datos de la tarjeta.\n\n  ```PHP\n  /**\n   * @file\n   * payment.php\n   */\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\RedSys;\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\Exception\\RedSysException;\n\n  /* Creamos una instancia en entorno de pruebas\n   * (omitimos el último parámetro para un entorno de producción). */\n  $redsys = new Redsys('test');\n\n  try {\n    /* Parámetros obligatorios */\n    $redsys-\u003esetOrder('0001aa');\n    $redsys-\u003esetMerchantCode('999008881');\n    $redsys-\u003esetAmount(99.99);\n    $redsys-\u003esetTradeName('Mi tienda, s.l.');\n    $redsys-\u003esetTitular('Perico de los Palotes');\n    $redsys-\u003esetProductDescription('Compra de producto 1');\n\n    /* Estos parámetros sólo son necesarios si son distintos de los\n     * indicados por defecto. */\n    $redsys-\u003esetTerminal(1);\n    $redsys-\u003esetCurrency(978);\n    $redsys-\u003esetTransactionType('0');\n    $redsys-\u003esetMethod('C');\n    $redsys-\u003esetVersion('HMAC_SHA256_V1');\n    $redsys-\u003esetLanguage('001');\n\n    /* Datos de la tarjeta del cliente.\n     * (El comercio debe estar autorizado para poder capturar estos datos) */\n    $redsys-\u003esetPan('4548812049400004');\n    $redsys-\u003esetExpiryDate('2012');\n    $redsys-\u003esetCVV('123');\n\n    /* URL de notificación y redirección */\n    $redsys-\u003esetNotification('https://localhost/notification.php');\n    $redsys-\u003esetUrlOk('https://localhost/payment_ok.php');\n    $redsys-\u003esetUrlKo('https://localhost/payment_ko.php');\n\n    /* Establezco cambios en el formulario del TPV.\n     * Estos parámetros son opcionales. */\n    $redsys-\u003esetNameForm('redsys_form');\n    $redsys-\u003esetIdForm('redsys_form');\n    $redsys-\u003esetAttributesSubmit(\n      'btn_submit',\n      'btn_submit',\n      'Realizar pago',\n      '',\n      'btn btn-primary');\n\n    /* Muestro el formulario sin redirección automática */\n    $redsys-\u003egenerateMerchantSignature('sq7HjrUOBfKmC576ILgskD5srU870gJ7');\n    $form = $redsys-\u003ecreateForm(FALSE);\n  }\n  catch (RedSysException $e) {\n    echo $e-\u003egetMessage();\n    die;\n  }\n\n  echo $form;\n\n  ```\n\n  #### RESULTADO: Captura de la devolución de la pasarela.\n\n  ```PHP\n  /**\n   * @file\n   * notification.php\n   */\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\RedSys;\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\Exception\\RedSysException;\n\n  $redsys = new Redsys('test');\n\n  try {\n    $result = $redsys-\u003echeckPaymentResponse($_POST, 'sq7HjrUOBfKmC576ILgskD5srU870gJ7');\n  }\n  catch (RedSysException $e) {\n      echo $e-\u003egetMessage();\n      die;\n  }\n\n  var_dump($result);\n\n  ```\n\n  #### Resultado de las peticiones por formulario\n  ##### Con error:\n\n  ```PHP\n  $resultado = [\n    'error' =\u003e true,\n    'code' =\u003e \"SIS0051\",\n    'error_info' =\u003e [\n      'code' =\u003e 'SIS0051',\n      'response' =\u003e 9051,\n      'message' =\u003e 'Error número de pedido repetido',\n      'msg' =\u003e 'MSG0001',\n      'detail' =\u003e '',\n    ],\n    'error_info' =\u003e '',\n    'Ds_Date' =\u003e '06/10/2020',\n    'Ds_Hour' =\u003e '19:00',\n    'Ds_SecurePayment' =\u003e '0',\n    'Ds_ExpiryDate' =\u003e '2012',\n    'Ds_Merchant_Identifier' =\u003e '3208c536f53db9c01106e87f6a867ce832ee9358',\n    'Ds_Card_Country' =\u003e '724',\n    'Ds_Amount' =\u003e '9999',\n    'Ds_Currency' =\u003e '978',\n    'Ds_Order' =\u003e '6666c',\n    'Ds_MerchantCode' =\u003e '351570213',\n    'Ds_Terminal' =\u003e '001',\n    'Ds_Response' =\u003e '0000',\n    'Ds_MerchantData' =\u003e '',\n    'Ds_TransactionType' =\u003e '0',\n    'Ds_ConsumerLanguage' =\u003e '1',\n    'Ds_AuthorisationCode' =\u003e '173839',\n    'Ds_Card_Brand' =\u003e '1',\n    'Ds_ProcessedPayMethod' =\u003e '14',\n  ];\n\n  ```\n\n  ##### Sin error:\n\n  ```PHP\n  $resultado = [\n    'error' =\u003e false,\n    'code' =\u003e '0',\n    'error_info' =\u003e '',\n    'Ds_Date' =\u003e '06/10/2020',\n    'Ds_Hour' =\u003e '19:00',\n    'Ds_SecurePayment' =\u003e '0',\n    'Ds_ExpiryDate' =\u003e '2012',\n    'Ds_Merchant_Identifier' =\u003e '3208c536f53db9c01106e87f6a867ce832ee9358',\n    'Ds_Card_Country' =\u003e '724',\n    'Ds_Amount' =\u003e '9999',\n    'Ds_Currency' =\u003e '978',\n    'Ds_Order' =\u003e '6666c',\n    'Ds_MerchantCode' =\u003e '351570213',\n    'Ds_Terminal' =\u003e '001',\n    'Ds_Response' =\u003e '0000',\n    'Ds_MerchantData' =\u003e '',\n    'Ds_TransactionType' =\u003e '0',\n    'Ds_ConsumerLanguage' =\u003e '1',\n    'Ds_AuthorisationCode' =\u003e '173839',\n    'Ds_Card_Brand' =\u003e '1',\n    'Ds_ProcessedPayMethod' =\u003e '14',\n  ];\n\n  ```\n\n* ### Pago por WebService:\n  #### Solicitud del pago\n\n  ```PHP\n  /**\n   * @file\n   * payment.php\n   */\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\RedSys;\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\Exception\\RedSysException;\n\n  /* Creamos una instancia en entorno de pruebas\n   * (omitimos el último parámetro para un entorno de producción). */\n  $redsys = new Redsys('test');\n\n  try {\n      /* Parámetros obligatorios */\n      $redsys-\u003esetMerchantcode('999008881');\n      $redsys-\u003esetAmount(99.99);\n      $redsys-\u003esetOrder('9999K');\n\n      /* Establecemos el tipo y método de la transacción */\n      $redsys-\u003esetTransactiontype('A');\n      $redsys-\u003esetMethod('T');\n\n      /* Estos parámetros sólo son necesarios si son distintos de los\n       * indicados por defecto. */\n      $redsys-\u003esetTerminal(1);\n      $redsys-\u003esetCurrency(978);\n      $redsys-\u003esetVersion('HMAC_SHA256_V1');\n      $redsys-\u003esetLanguage('001');\n      $redsys-\u003esetIdentifier('REQUIRED');\n\n      /* Indicamos los datos de la tarjeta del cliente */\n      $redsys-\u003esetPan('4548812049400004');\n      $redsys-\u003esetExpiryDate('2012');\n      $redsys-\u003esetCVV('123');\n\n      /* Genero la firma y ejecuto el cobro */\n      $result = $redsys-\u003efirePayment('sq7HjrUOBfKmC576ILgskD5srU870gJ7');\n\n    }\n    catch (RedSysException $e) {\n      echo $e-\u003egetMessage();\n      die;\n    }\n\n    var_dump($result);\n\n  ```\n\n  #### Solicitud de pago con identificador (*Pago recurrente*)\n\n  ```PHP\n  /**\n   * @file\n   * payment.php\n   */\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\RedSys;\n  use Drupal\\module_name\\lib\\redsys\\RedSys\\Exception\\RedSysException;\n\n  /* Creamos una instancia en entorno de pruebas\n   * (omitimos el último parámetro para un entorno de producción). */\n  $redsys = new Redsys('test');\n\n  try {\n      /* Parámetros obligatorios */\n      $redsys-\u003esetMerchantcode('999008881');\n      $redsys-\u003esetAmount(99.99);\n      $redsys-\u003esetOrder('9999K');\n\n      /* Establecemos el tipo y método de la transacción */\n      $redsys-\u003esetTransactiontype('A');\n      $redsys-\u003esetMethod('T');\n\n      /* Estos parámetros sólo son necesarios si son distintos de los\n       * indicados por defecto. */\n      $redsys-\u003esetTerminal(1);\n      $redsys-\u003esetCurrency(978);\n      $redsys-\u003esetVersion('HMAC_SHA256_V1');\n      $redsys-\u003esetLanguage('001');\n\n      /* Indicamos el identificador del pago anterior */\n      $redsys-\u003esetIdentifier('d202286b28232a55160890eedac145a70d1b8cd3');\n\n      /* Genero la firma y ejecuto el cobro */\n      $result = $redsys-\u003efirePayment('sq7HjrUOBfKmC576ILgskD5srU870gJ7');\n\n    }\n    catch (RedSysException $e) {\n      echo $e-\u003egetMessage();\n      die;\n    }\n\n    var_dump($result);\n\n  ```\n\n  #### Resultados de las peticiones SOAP\n  ##### Con error:\n\n  ```PHP\n  $resultado = [\n    \"error\" =\u003e true,\n    \"code\" =\u003e \"SIS0051\",\n    \"error_info\" =\u003e [\n      \"code\" =\u003e \"SIS0051\",\n      \"response\" =\u003e 9051,\n      \"message\" =\u003e \"Error número de pedido repetido\",\n      \"msg\" =\u003e \"MSG0001\",\n      \"detail\" =\u003e \"\",\n    ],\n    \"DS_MERCHANT_DIRECTPAYMENT\" =\u003e [],\n    \"DS_MERCHANT_CURRENCY\" =\u003e \"978\",\n    \"DS_MERCHANT_TRANSACTIONTYPE\" =\u003e \"A\",\n    \"DS_MERCHANT_TERMINAL\" =\u003e \"001\",\n    \"DS_MERCHANT_CONSUMERLANGUAGE\" =\u003e \"001\",\n    \"DS_MERCHANT_PAYMETHODS\" =\u003e \"T\",\n    \"DS_MERCHANT_IDENTIFIER\" =\u003e \"REQUIRED\",\n    \"DS_MERCHANT_MERCHANTCODE\" =\u003e \"999008881\",\n    \"DS_MERCHANT_AMOUNT\" =\u003e \"9999\",\n    \"DS_MERCHANT_ORDER\" =\u003e \"9999J\",\n    \"DS_MERCHANT_PAN\" =\u003e \"4548812049400004\",\n    \"DS_MERCHANT_EXPIRYDATE\" =\u003e \"2012\",\n    \"DS_MERCHANT_CVV2\" =\u003e \"123\",\n  ];\n\n  ```\n\n  ##### Sin error:\n\n  ```PHP\n  $resultado =[\n    \"error\" =\u003e false,\n    \"code\" =\u003e \"0\",\n    \"error_info\" =\u003e NULL,\n    \"Ds_Amount\" =\u003e \"9999\",\n    \"Ds_Currency\" =\u003e \"978\",\n    \"Ds_Order\" =\u003e \"9999J\",\n    \"Ds_Signature\" =\u003e \"vAf4mdomXrabre/f9xOkbTOtQN4KaqRi6Sj8Hq5dvzQ=\",\n    \"Ds_MerchantCode\" =\u003e \"999008881\",\n    \"Ds_Terminal\" =\u003e \"1\",\n    \"Ds_Response\" =\u003e \"0000\",\n    \"Ds_AuthorisationCode\" =\u003e \"462168\",\n    \"Ds_TransactionType\" =\u003e \"A\",\n    \"Ds_SecurePayment\" =\u003e \"0\",\n    \"Ds_Language\" =\u003e \"1\",\n    \"Ds_CardNumber\" =\u003e \"454881******0004\",\n    \"Ds_ExpiryDate\" =\u003e \"2012\",\n    \"Ds_Merchant_Identifier\" =\u003e \"d202286b28232a55160890eedac145a70d1b8cd3\",\n    \"Ds_MerchantData\" =\u003e [],\n    \"Ds_Card_Country\" =\u003e \"724\",\n    \"Ds_Card_Brand\" =\u003e \"1\",\n    \"Ds_ProcessedPayMethod\" =\u003e \"3\",\n  ];\n\n  ```\n\n## Autor\n- Óscar Novás - [OscarNovas.com](https://oscarnovas.com)\n\n## Organizaciones de apoyo\n- [Gloudify.com](https://gloudify.com)\n\n## Créditos\nEsta librería nace a partir del código de otras tres:\n* [buuum/Redsys](https://github.com/buuum/Redsys)\n* [ssheduardo/sermepa](https://github.com/ssheduardo/sermepa)\n* [eusonlito/redsys-Messages](https://github.com/eusonlito/redsys-Messages)\n\nAquí puedes comprobar la lista de [contribuyentes][contributors]\na este repositorio.\n\n## Histórico de cambios\nAquí puedes comprobar la lista de [cambios][changelog] efectuados hasta el\nmomento.\n\n---\n⌨️ con ❤️ por [Óscar Novás](https://oscarnovas.com) 😊\n\n[version]: v0.0.1\n[version-badge]: https://img.shields.io/badge/version-0.0.1-blue.svg\n\n[license]: LICENSE.md\n[license-badge]: https://img.shields.io/github/license/oscarnovasf/redsys\n\n[changelog]: CHANGELOG.md\n[contributors]: https://github.com/oscarnovasf/redsys/contributors\n\n[donate-badge]: https://img.shields.io/badge/Donate-PayPal-green.svg\n[donate-url]: https://paypal.me/oscarnovasf\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscarnovasf%2Fredsys","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foscarnovasf%2Fredsys","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscarnovasf%2Fredsys/lists"}