{"id":32354132,"url":"https://github.com/ssheduardo/sermepa","last_synced_at":"2025-10-24T10:43:54.848Z","repository":{"id":2174053,"uuid":"3120886","full_name":"ssheduardo/sermepa","owner":"ssheduardo","description":"Clase para utilizar la pasarela de pagos redsys, sermepa.","archived":false,"fork":false,"pushed_at":"2025-03-07T01:07:31.000Z","size":293,"stargazers_count":200,"open_issues_count":5,"forks_count":59,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-03-07T02:21:34.267Z","etag":null,"topics":["php","redsys","sermepa","tpv"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ssheduardo.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":"2012-01-06T20:46:43.000Z","updated_at":"2025-03-07T01:05:28.000Z","dependencies_parsed_at":"2025-01-11T19:31:38.900Z","dependency_job_id":"36175fa9-c3cc-4e04-8279-5db72f2d2799","html_url":"https://github.com/ssheduardo/sermepa","commit_stats":{"total_commits":121,"total_committers":19,"mean_commits":6.368421052631579,"dds":0.578512396694215,"last_synced_commit":"809c455612a74519493a056d474bce3cadd5b316"},"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/ssheduardo/sermepa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssheduardo%2Fsermepa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssheduardo%2Fsermepa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssheduardo%2Fsermepa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssheduardo%2Fsermepa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ssheduardo","download_url":"https://codeload.github.com/ssheduardo/sermepa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssheduardo%2Fsermepa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280783847,"owners_count":26390277,"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","status":"online","status_checked_at":"2025-10-24T02:00:06.418Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["php","redsys","sermepa","tpv"],"created_at":"2025-10-24T10:43:54.036Z","updated_at":"2025-10-24T10:43:54.842Z","avatar_url":"https://github.com/ssheduardo.png","language":"PHP","funding_links":["https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=ssh%2eeduardo%40gmail%2ecom\u0026lc=ES\u0026currency_code=EUR\u0026bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted)!","https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=ssh%2eeduardo%40gmail%2ecom\u0026lc=ES\u0026currency_code=EUR\u0026bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted"],"categories":["Pasarelas de Pago"],"sub_categories":["Wallapop"],"readme":"# Redsys\n\n[![Latest Version on Packagist][ico-version]][link-packagist]\n[![Software License][ico-license]](LICENSE.md)\n[![Total Downloads][ico-downloads]][link-downloads]\n[![Run Tests](https://github.com/ssheduardo/sermepa/actions/workflows/ci.yml/badge.svg)][link-workflows]\n\n---\n\n[![Visual Studio Code](https://ubublog.com/wp-content/uploads/2019/05/vsc.png)](https://code.visualstudio.com/)\n_This project is friendly supported by [Visual Studio Code](https://code.visualstudio.com/)!_\n\n---\n\n## Historia\n\nEsta clase nace porque no encontraba una clase de pasarela de pagos (TPV) que se pueda integrar directamente en una web. Existen\nmuchas pero para varios CMS y no me servían, solo quería montar algo fácil que pueda usar. Los ejemplos que vienen en la documentación oficial eran muy simples así que decidi realizar esta clase y ahora lo comparto con todos.\n\nVálido para Sermepa y Redsys.\n\n## Introducción\n\nLa clase `sermepa` actualmente `Redsys` sirve para generar el formulario que se comunicará con la pasarela de pagos que usan muchos bancos, como Santander, Sabadell, Lacaixa, etc.\n\nEs una versión que irá creciendo y actualizándose poco a poco y mejorándolo. Si lo usas en algún proyecto y te ayudo en algo no dudes en decírmelo\n\n## Requerimientos mínimos\n\nPHP 5 \u003e= 5.3.0, PHP 7.1, 8.0\n\n## Créditos\n\nClase creada por Eduardo Diaz, Madrid 2012\nTwitter: @eduardo_dx\n\n\n## Actualización\n\n- Agregado namespace.\n- Se actualiza para trabajar con sha256, que ha sido un requisito del banco.\n- Se cambian todos los nombres de la clases a ingles.\n- Se crean nuevos métodos.\n- Para facilitar la integración usamos funciones ya creadas.\n- Rest.\n\n## Instalación\n\n### Si usas composer tienes 2 opciones\n\n1.- Por línea de comandos\n```bash\ncomposer require sermepa/sermepa\n```\n2.- Creas o agregas a tu archivo **composer.json** la siguiente dependencia:\n\n```json\n{\n   \"require\": {\n      \"sermepa/sermepa\": \"^1.3.2\"\n   }\n}\n```\n\nLuego ejecutas:\n\n    composer update\n\n\n### Si en caso contrario no usas composer, bastará con clonar el repositorio\n\n```bash\ngit clone https://github.com/ssheduardo/sermepa.git\n```\n\n## ¿Cómo usar la clase?\n\nEjemplo:\n\n```php\n//Si usas composer\n//include_once('vendor/autoload.php');\n\n//Si clonaste la clase\n//include_once('sermepa/src/Sermepa/Tpv/Tpv.php');\n\ntry{\n    //Key de ejemplo\n    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';\n\n    $redsys = new Sermepa\\Tpv\\Tpv();\n    $redsys-\u003esetAmount(rand(10,600));\n    $redsys-\u003esetOrder(time());\n    $redsys-\u003esetMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco\n    $redsys-\u003esetCurrency('978');\n    $redsys-\u003esetTransactiontype('0');\n    $redsys-\u003esetTerminal('1');\n    $redsys-\u003esetMethod('C'); //Solo pago con tarjeta, no mostramos iupay\n    $redsys-\u003esetNotification('http://localhost/noti.php'); //Url de notificacion\n    $redsys-\u003esetUrlOk('http://localhost/ok.php'); //Url OK\n    $redsys-\u003esetUrlKo('http://localhost/ko.php'); //Url KO\n    $redsys-\u003esetVersion('HMAC_SHA256_V1');\n    $redsys-\u003esetTradeName('Tienda S.L');\n    $redsys-\u003esetTitular('Pedro Risco');\n    $redsys-\u003esetProductDescription('Compras varias');\n    $redsys-\u003esetEnvironment('test'); //Entorno test\n\n    $signature = $redsys-\u003egenerateMerchantSignature($key);\n    $redsys-\u003esetMerchantSignature($signature);\n\n    $form = $redsys-\u003ecreateForm();\n} catch (\\Sermepa\\Tpv\\TpvException $e) {\n    echo $e-\u003egetMessage();\n}\necho $form;\n```\n\nCon esto generamos el form para la comunicación con la pasarela de pagos.\n\n### Nota\nCon la integración del pago con referencia, ahora el importe **puede ser 0**. Según la documentación, si se quiere generar dicho identificador, se puede pasar el importe a 0 para obtener dicho valor, si en caso contrario no se utiliza el pago con referencia y se pasa el importe en 0, el banco nos mostrará un error.\n\n## Enviar datos de la tarjeta\n\nSi queremos enviar los datos de la tarjeta para que no nos lo solicite la pasarela de pagos, podemos hacerlo de la siguiente forma.\n\n```php\ntry{\n    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';\n\n    $redsys = new Sermepa\\Tpv\\Tpv();\n    $redsys-\u003esetAmount(rand(10,600));\n    $redsys-\u003esetOrder(time());\n    $redsys-\u003esetMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco\n    $redsys-\u003esetCurrency('978');\n    $redsys-\u003esetTransactiontype('0');\n    $redsys-\u003esetTerminal('1');\n    $redsys-\u003esetMethod('C'); //Solo pago con tarjeta, no mostramos iupay\n    $redsys-\u003esetNotification('http://localhost/noti.php'); //Url de notificacion\n    $redsys-\u003esetUrlOk('http://localhost/ok.php'); //Url OK\n    $redsys-\u003esetUrlKo('http://localhost/ko.php'); //Url KO\n    $redsys-\u003esetVersion('HMAC_SHA256_V1');\n    $redsys-\u003esetTradeName('Tienda S.L');\n    $redsys-\u003esetTitular('Pedro Risco');\n\n    $redsys-\u003esetPan('4548812049400004'); //Número de la tarjeta\n    $redsys-\u003esetExpiryDate('2012'); //AAMM (año y mes)\n    $redsys-\u003esetCVV2('123'); //CVV2 de la tarjeta\n\n    $redsys-\u003esetEnvironment('test'); //Entorno test\n\n    $signature = $redsys-\u003egenerateMerchantSignature($key);\n    $redsys-\u003esetMerchantSignature($signature);\n\n    $form = $redsys-\u003ecreateForm();\n} catch (\\Sermepa\\Tpv\\TpvException $e) {\n    echo $e-\u003egetMessage();\n}\necho $form;\n```\n\n## Pago con referencia\n\nEsta operativa nos permite guardar los datos de la tarjeta. SIS almacena la tarjeta y devuelve la referencia que deberá ser almacenada por el comercio.\n\nImaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastará con agregar el método `setIdentifier()`. Cuando se haga el llamado a la url de notificación, éste nos devolverá `Ds_Merchant_Identifier` y `Ds_ExpiryDate`.\n\n```php\n//Para una nueva referencia agregar este método al ejemplo anterior\n$redsys-\u003esetIdentifier();\n\n//En la url de notificación nos devolverá algo como esto\nArray\n(\n    [Ds_Date] =\u003e 17%2F02%2F2022\n    [Ds_Hour] =\u003e 23%3A25\n    [Ds_SecurePayment] =\u003e 1\n    [Ds_Card_Number] =\u003e 491801******4602\n    [Ds_ExpiryDate] =\u003e 3212\n    [Ds_Merchant_Identifier] =\u003e 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c\n    [Ds_Card_Country] =\u003e 724\n    [Ds_Amount] =\u003e 0\n    [Ds_Currency] =\u003e 978\n    [Ds_Order] =\u003e 1645136683\n    [Ds_MerchantCode] =\u003e 999008881\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 005090\n    [Ds_Card_Brand] =\u003e 1\n    [Ds_Merchant_Cof_Txnid] =\u003e 2202172334011\n    [Ds_ProcessedPayMethod] =\u003e 1\n    [Ds_Control_1645136701458] =\u003e 1645136701458\n)\n\n```\n\nAhora bien, si queremos realizar otro cobro sin que nos pidan los datos de la tarjeta para ese mismo usuario, bastará con pasar el `Ds_Merchant_Identifier` anterior en el método `setIdentifier()`.\n\nCada banco tiene un sistema de seguridad a través de un código de SMS, tarjeta de coordenadas, etc. que se mostrará para completar la transacción.\n\n```php\n$redsys-\u003esetIdentifier(2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c);\n\n//En la url de notificación nos devolverá algo como esto\nArray\n(\n    [Ds_Date] =\u003e 17%2F02%2F2022\n    [Ds_Hour] =\u003e 23%3A28\n    [Ds_SecurePayment] =\u003e 1\n    [Ds_Card_Number] =\u003e 491801******4602\n    [Ds_Merchant_Identifier] =\u003e 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c\n    [Ds_Card_Country] =\u003e 724\n    [Ds_Amount] =\u003e 12000\n    [Ds_Currency] =\u003e 978\n    [Ds_Order] =\u003e 1645136909\n    [Ds_MerchantCode] =\u003e 999008881\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 078737\n    [Ds_Card_Brand] =\u003e 1\n    [Ds_Merchant_Cof_Txnid] =\u003e 2202172334011\n    [Ds_ProcessedPayMethod] =\u003e 1\n    [Ds_Control_1645136925978] =\u003e 1645136925978\n)\n```\n\nSi no queremos que nos muestre ninguna pantalla y directamente realice el pago debemos hacer uso del método `setMerchantDirectPayment()`:\n\n```php\n$redsys-\u003esetMerchantDirectPayment(true);\n```\nTambién podemos hacer los cobros recurrentes a traves de Rest.\n\n_Nota: En algunos casos dependiendo del Banco, debemos enviar el parámetro MIT_\n\n```php\n$parameters = ['DS_MERCHANT_EXCEP_SCA' =\u003e 'MIT'];\n$redsys-\u003esetParameters($parameters);\n```\n\n```php\ntry{\n    //Key de ejemplo\n    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';\n\n    $redsys = new Sermepa\\Tpv\\Tpv();\n    $redsys-\u003esetAmount(rand(20,80));\n    $redsys-\u003esetOrder(time());\n    $redsys-\u003esetMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco\n\n    $redsys-\u003esetCurrency('978');\n    $redsys-\u003esetTransactiontype('0');\n    $redsys-\u003esetTerminal('1');\n    $redsys-\u003esetIdentifier('2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c');\n    $redsys-\u003esetVersion('HMAC_SHA256_V1');\n    $redsys-\u003esetEnvironment('restTest'); //Rest entorno test\n    $redsys-\u003esetMerchantCofIni('N');\n    $redsys-\u003esetMerchantDirectPayment(true);\n\n    $redsys-\u003esetMerchantCofTxnid(2202172334011);\n\n    $signature = $redsys-\u003egenerateMerchantSignature($key);\n    $redsys-\u003esetMerchantSignature($signature);\n\n    $response = json_decode($redsys-\u003esend(), true);\n\n    // Verifica si hay un error en la respuesta\n    if (array_key_exists('errorCode', $response)) {\n        // Si en el response nos retorna un error, aquí podemos gestionarlo.\n        throw new Exception(\"Error en la respuesta: \" . $response['errorCode']);\n    }\n\n    // Obtiene los parámetros del comerciante\n    $parameters = $redsys-\u003egetMerchantParameters($response['Ds_MerchantParameters']);\n    $DsResponse = $parameters[\"Ds_Response\"];\n    $DsResponse += 0;\n\n    // Verifica la respuesta y la clave\n    if ($redsys-\u003echeck($key, $response) \u0026\u0026 $DsResponse \u003c= 99) {\n        //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.\n        print_r($parameters);\n    } else {\n        //acciones a realizar si ha sido erroneo\n    }\n\n} catch (\\Sermepa\\Tpv\\TpvException $e) {\n    echo \"Error de TPV: \" . $e-\u003egetMessage();\n} catch (Exception $e) {\n    echo \"Error: \" . $e-\u003egetMessage();\n}\n\n```\n\n## Redirección automática\n\nPodemos forzar la redirección sin pasar por el método `createForm()` (gracias a la colaboración de [jaumecornado](https://github.com/jaumecornado))\n\n```php\n$redsys-\u003eexecuteRedirection();\n```\n\nEste método llamaría a `createForm()` y lanzaría el submit por javascript.\n\n## Comprobación de Pago\n\nPodemos comprobar si se ha realizado el pago correctamente (gracias a la colaboración de [markitosgv](https://github.com/markitosgv)). Para ello necesitamos setear la clave del banco y pasar la variable `$_POST` que nos devuelve en la URL de notificación o de retorno. Tener en cuenta que debemos realizar esta comprobación en la url de notificación. Por ejemplo, en el fichero que es llamado por la URL de retorno:\n\n```php\ntry{\n    $redsys = new Sermepa\\Tpv\\Tpv();\n    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';\n\n    $parameters = $redsys-\u003egetMerchantParameters($_POST[\"Ds_MerchantParameters\"]);\n    $DsResponse = $parameters[\"Ds_Response\"];\n    $DsResponse += 0;\n    if ($redsys-\u003echeck($key, $_POST) \u0026\u0026 $DsResponse \u003c= 99) {\n        //acciones a realizar si es correcto, por ejemplo validar una reserva, mandar un mail de OK, guardar en bbdd o contactar con mensajería para preparar un pedido\n    } else {\n        //acciones a realizar si ha sido erroneo\n    }\n} catch (\\Sermepa\\Tpv\\TpvException $e) {\n    echo $e-\u003egetMessage();\n}\n```\n\n### Nota\n\nPor defecto se conecta por la pasarela de pruebas. Para cambiar a un entorno real, usar el método `setEnvironment('live')`, con esto ya estará activo.\n\n```php\nLos entornos que tenemos son:\n - test\n - live\n - restLive\n - restTest\n```\n\n## Métodos útiles\n\n### Asignar parámetros\nEste método recibe un array asociativo con los nuevos valores a asignar.\n\nEjemplo:\n```php\n$parameters = ['DS_MERCHANT_CHARGEEXPIRYDATE' =\u003e '2020', 'DS_MERCHANT_COF_INI' =\u003e 'S'];\n$redsys-\u003esetParameters($parameters);\n```\n### Asignar nombre a id y name del formulario\n\n```php\n$redsys-\u003esetNameForm('nombre_formulario');\n$redsys-\u003esetIdForm('id_formulario');\n```\n\n### Cambiar el idioma de la pasarela de pago\n\n```php\n//Esto mostraría la pasarela de pago en inglés\n$redsys-\u003esetLanguage('002');\n```\n\nCódigos de idiomas disponibles:\n\n- 001: Castellano\n- 002: Inglés\n- 003: Catalán\n- 004: Francés\n- 005: Alemán\n- 006: Holandés\n- 007: Italiano\n- 008: Sueco\n- 009: Portugués\n- 010: Valenciano\n- 011: Polaco\n- 012: Gallego\n- 013: Euskera\n\n### Asignar nombre, id, value y style (css) al botón submit\n\n```php\n$redsys-\u003esetAttributesSubmit('btn_submit', 'btn_id', 'Enviar', 'font-size:14px; color:#ff00c1');\n```\n\nSi usáis redirección podéis ocultar el botón con `display:none`\n\n### Generar formulario\n\n```php\n$redsys-\u003ecreateForm();\n```\n\n### Obtener un array con todos los datos asignados\n\n```php\n$redsys-\u003egetParameters();\n```\n\nPor ejemplo, esto nos devuelve:\n\n    Array\n    (\n        [DS_MERCHANT_AMOUNT] =\u003e 1700\n        [DS_MERCHANT_ORDER] =\u003e 160224230429\n        [DS_MERCHANT_MERCHANTCODE] =\u003e XXXXXX\n        [DS_MERCHANT_CURRENCY] =\u003e 978\n        [DS_MERCHANT_TRANSACTIONTYPE] =\u003e 0\n        [DS_MERCHANT_TERMINAL] =\u003e 1\n        [DS_MERCHANT_PAYMETHODS] =\u003e C\n        [DS_MERCHANT_MERCHANTURL] =\u003e http://demo.com/notificacion.php\n        [DS_MERCHANT_URLOK] =\u003e http://demo.com/accept\n        [DS_MERCHANT_URLKO] =\u003e http://demo.com/cancel\n        [DS_MERCHANT_MERCHANTNAME] =\u003e Tu empresa\n        [DS_MERCHANT_TITULAR] =\u003e Usuario\n        [DS_MERCHANT_PRODUCTDESCRIPTION] =\u003e Tu descripción\n    )\n\n### Obtener un array de los datos devueltos por `Ds_MerchantParameters`\n\n```php\n$redsys-\u003egetMerchantParameters($_POST[\"Ds_MerchantParameters\"]);\n```\n\nEsto nos devuelve:\n\n    [Ds_Date] =\u003e 12/11/2015\n    [Ds_Hour] =\u003e 14:04\n    [Ds_SecurePayment] =\u003e 1\n    [Ds_Card_Number] =\u003e 454881******0004\n    [Ds_Card_Country] =\u003e 724\n    [Ds_Amount] =\u003e 7300\n    [Ds_Currency] =\u003e 978\n    [Ds_Order] =\u003e 1447333990\n    [Ds_MerchantCode] =\u003e 999008881\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 906611\n\n### Obtener Versión\n\n```php\n$redsys-\u003egetVersion()\n```\n\nDevuelve el valor asignado en `setVersion()`, por ejemplo: `HMAC_SHA256_V1`;\n\n### Obtener MerchantSignature\n\n```php\n$redsys-\u003egetMerchantSignature()\n```\n\nDevuelve el valor asignado en `setMerchantSignature()`, por ejemplo: `Cia90trhTPGxtJDmK6WDhqXzU+98LbuKZKAKYHMjtMs=`\n\n## Change log\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information about what has changed recently.\n\n## Licencia\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n\n[ico-version]: https://img.shields.io/packagist/v/sermepa/sermepa.svg?style=flat-square\n[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square\n[ico-downloads]: https://img.shields.io/packagist/dt/sermepa/sermepa.svg?style=flat-square\n\n[link-packagist]: https://packagist.org/packages/sermepa/sermepa\n[link-downloads]: https://packagist.org/packages/sermepa/sermepa\n[link-author]: https://github.com/ssheduardo\n\n [link-workflows]: https://github.com/ssheduardo/sermepa/actions/workflows/ci.yml\n\n## Donación\n\n¿Te gustaría apoyarme?\n¿Aprecias mi trabajo?\n¿Lo usas en proyectos comerciales?\n\n¡Siéntete libre de hacer una pequeña [donación](https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=ssh%2eeduardo%40gmail%2ecom\u0026lc=ES\u0026currency_code=EUR\u0026bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted)! :wink:\n\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=ssh%2eeduardo%40gmail%2ecom\u0026lc=ES\u0026currency_code=EUR\u0026bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssheduardo%2Fsermepa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fssheduardo%2Fsermepa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssheduardo%2Fsermepa/lists"}