<commit_before># Redys

[![Latest Version on Packagist][ico-version]][link-packagist]
[![Software License][ico-license]](LICENSE.md)
[![Total Downloads][ico-downloads]][link-downloads]

Historia
--------
Esta clase nace porque no te encontraba una clase de pasarela de pagos (TPV) que se pueda integrar directamente en una web, existen
muchas pero para varios CMS y no me servian, solo quería montar algo fácil que pueda usar, los ejemplos que vienen en la documentación oficial era muy simple así que decidi realizar esta clase y ahora lo comparto con todos.

    Valido para Sermepa y Redsys.

Introducción
------------
La clase sermepa sirve para generar el formulario que se comunicará con la pasarela de pagos que usan muchos bancos como: Sabadell, Lacaixa, etc.

Es una versión que ira creciendo y actualizandose poco a poco y mejorandolo.
Si lo usas en algún proyecto y te ayudo en algo no dudas en decirmelo

Requerimientos mínimos
----------------------
PHP 5 >= 5.3.0, PHP 7.1

Creditos
--------
    Clase creada por <NAME>, Madrid 2012
    Twitter: @eduardo_dx


Actualización
-------------
    - Agregado namespace.
    - Se actualiza para trabajar con sha256, que ha sido un requisito del banco.
    - Se cambian todos los nombres de la clases a Ingles.
    - Se crean nuevos métodos.
    - Para facilitar la integración usamos funciones ya creadas.

Instalación
-----------
**Si usas composer tienes 2 opciones**

1.- Por linea de comandos
```bash
    composer require sermepa/sermepa
```
2.- Creas o agregas a tu archivo **composer.json** la siguiente dependencia:

```json
    {
       "require": {
          "sermepa/sermepa": "^1.2"
       }
    }
```

Luego ejecutas:

    composer update


**Si en caso contrario no usas composer, bastará con clonar el repositorio**
```bash
git clone https://github.com/ssheduardo/sermepa.git
```


Como usar la clase
------------------
**Ejemplo**
```php
    //Si usas composer
    //include_once('vendor/autoload.php');

    //Si clonaste la clase
    //include_once('sermepa/src/Sermepa/Tpv/Tpv.php');

    try{
        //Key de ejemplo
        $key = '<KEY>';

        $redsys = new Sermepa\Tpv\Tpv();
        $redsys->setAmount(rand(10,600));
        $redsys->setOrder(time());
        $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
        $redsys->setCurrency('978');
        $redsys->setTransactiontype('0');
        $redsys->setTerminal('1');
        $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
        $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
        $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
        $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
        $redsys->setVersion('HMAC_SHA256_V1');
        $redsys->setTradeName('Tienda S.L');
        $redsys->setTitular('<NAME>');
        $redsys->setProductDescription('Compras varias');
        $redsys->setEnviroment('test'); //Entorno test

        $signature = $redsys->generateMerchantSignature($key);
        $redsys->setMerchantSignature($signature);

        $form = $redsys->createForm();
    }
    catch(Exception $e){
        echo $e->getMessage();
    }
    echo $form;
```

**Con esto generamos el form para la comunicación con la pasarela de pagos.**

>Nota:
    Con la integración del pago con referencia, ahora el importe **puede ser 0**. <br>
    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.


###Pago con referencia###

Esta operativa nos permite guardar los datos de la tarjeta, SIS almacena la tarjeta y devuelve la referencia que deberá ser almacenada por el comercio.  
Imaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastará agregar el método  setMerchantIdentifier. Cuando se haga el llamado a la url de notificación y este nos devolverá **Ds_Merchant_Identifier** y **Ds_ExpiryDate**

```php
    //Para una nueva referencia agregar este método al ejemplo anterior
    $redsys->setIdentifier();

    //En la url de notificación nos devolverá algo como esto
    Array
    (
        [Ds_Date] => 20/10/2016
        [Ds_Hour] => 13:06
        [Ds_SecurePayment] => 1
        [Ds_Card_Number] => 454881******0004
        
        [Ds_ExpiryDate] => 2012
        [Ds_Merchant_Identifier] => cd8e4017c4c2f16bc9ccff87b0d07ad9c6cbd257

        [Ds_Card_Country] => 724
        [Ds_Amount] => 47700
        [Ds_Currency] => 978
        [Ds_Order] => 1476961526
        [Ds_MerchantCode] => 999008881
        [Ds_Terminal] => 001
        [Ds_Response] => 0000
        [Ds_MerchantData] => Descripcion_del_pedido_extra
        [Ds_TransactionType] => 0
        [Ds_ConsumerLanguage] => 1
        [Ds_AuthorisationCode] => 024772
    )

```

Ahora 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 setMerchantIdentifier.  
Cada 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.


```php
    $redsys->setIdentifier(cd8e4017c4c2f16bc9ccff87b0d07ad9c6cbd257);

    //En la url de notificación nos devolverá algo como esto
    Array
    (
        [Ds_Date] => 20/10/2016
        [Ds_Hour] => 15:19
        [Ds_SecurePayment] => 1
        [Ds_Card_Number] => 454881******0004
        
        [Ds_Merchant_Identifier] => cd8e4017c4c2f16bc9ccff87b0d07ad9c6cbd257

        [Ds_Card_Country] => 724
        [Ds_Amount] => 3200
        [Ds_Currency] => 978
        [Ds_Order] => 1476969550
        [Ds_MerchantCode] => 999008881
        [Ds_Terminal] => 001
        [Ds_Response] => 0000
        [Ds_MerchantData] => Descripcion_del_pedido_extra
        [Ds_TransactionType] => 0
        [Ds_ConsumerLanguage] => 1
        [Ds_AuthorisationCode] => 025483
    )

```
<commit_msg>Finish fixed-readme<commit_after># Redys

[![Latest Version on Packagist][ico-version]][link-packagist]
[![Software License][ico-license]](LICENSE.md)
[![Total Downloads][ico-downloads]][link-downloads]

Historia
--------
Esta clase nace porque no te encontraba una clase de pasarela de pagos (TPV) que se pueda integrar directamente en una web, existen
muchas pero para varios CMS y no me servian, solo quería montar algo fácil que pueda usar, los ejemplos que vienen en la documentación oficial era muy simple así que decidi realizar esta clase y ahora lo comparto con todos.

    Valido para Sermepa y Redsys.

Introducción
------------
La clase sermepa sirve para generar el formulario que se comunicará con la pasarela de pagos que usan muchos bancos como: Sabadell, Lacaixa, etc.

Es una versión que ira creciendo y actualizandose poco a poco y mejorandolo.
Si lo usas en algún proyecto y te ayudo en algo no dudas en decirmelo

Requerimientos mínimos
----------------------
PHP 5 >= 5.3.0, PHP 7.1

Creditos
--------
    Clase creada por <NAME>, Madrid 2012
    Twitter: @eduardo_dx


Actualización
-------------
    - Agregado namespace.
    - Se actualiza para trabajar con sha256, que ha sido un requisito del banco.
    - Se cambian todos los nombres de la clases a Ingles.
    - Se crean nuevos métodos.
    - Para facilitar la integración usamos funciones ya creadas.

Instalación
-----------
**Si usas composer tienes 2 opciones**

1.- Por linea de comandos
```bash
    composer require sermepa/sermepa
```
2.- Creas o agregas a tu archivo **composer.json** la siguiente dependencia:

```json
    {
       "require": {
          "sermepa/sermepa": "^1.2"
       }
    }
```

Luego ejecutas:

    composer update


**Si en caso contrario no usas composer, bastará con clonar el repositorio**
```bash
git clone https://github.com/ssheduardo/sermepa.git
```


Como usar la clase
------------------
**Ejemplo**
```php
    //Si usas composer
    //include_once('vendor/autoload.php');

    //Si clonaste la clase
    //include_once('sermepa/src/Sermepa/Tpv/Tpv.php');

    try{
        //Key de ejemplo
        $key = '<KEY>';

        $redsys = new Sermepa\Tpv\Tpv();
        $redsys->setAmount(rand(10,600));
        $redsys->setOrder(time());
        $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
        $redsys->setCurrency('978');
        $redsys->setTransactiontype('0');
        $redsys->setTerminal('1');
        $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
        $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
        $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
        $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
        $redsys->setVersion('HMAC_SHA256_V1');
        $redsys->setTradeName('Tienda S.L');
        $redsys->setTitular('<NAME>');
        $redsys->setProductDescription('Compras varias');
        $redsys->setEnviroment('test'); //Entorno test

        $signature = $redsys->generateMerchantSignature($key);
        $redsys->setMerchantSignature($signature);

        $form = $redsys->createForm();
    }
    catch(Exception $e){
        echo $e->getMessage();
    }
    echo $form;
```

**Con esto generamos el form para la comunicación con la pasarela de pagos.**

>Nota:
    Con la integración del pago con referencia, ahora el importe **puede ser 0**. <br>
    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.


###Pago con referencia###

Esta operativa nos permite guardar los datos de la tarjeta, SIS almacena la tarjeta y devuelve la referencia que deberá ser almacenada por el comercio.  
Imaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastará agregar el método  setIdentifier. Cuando se haga el llamado a la url de notificación y este nos devolverá **Ds_Merchant_Identifier** y **Ds_ExpiryDate**

```php
    //Para una nueva referencia agregar este método al ejemplo anterior
    $redsys->setIdentifier();

    //En la url de notificación nos devolverá algo como esto
    Array
    (
        [Ds_Date] => 20/10/2016
        [Ds_Hour] => 13:06
        [Ds_SecurePayment] => 1
        [Ds_Card_Number] => 454881******0004
        
        [Ds_ExpiryDate] => 2012
        [Ds_Merchant_Identifier] => cd8e4017c4c2f16bc9ccff87b0d07ad9c6cbd257

        [Ds_Card_Country] => 724
        [Ds_Amount] => 47700
        [Ds_Currency] => 978
        [Ds_Order] => 1476961526
        [Ds_MerchantCode] => 999008881
        [Ds_Terminal] => 001
        [Ds_Response] => 0000
        [Ds_MerchantData] => Descripcion_del_pedido_extra
        [Ds_TransactionType] => 0
        [Ds_ConsumerLanguage] => 1
        [Ds_AuthorisationCode] => 024772
    )

```

Ahora 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.  
Cada 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.


```php
    $redsys->setIdentifier(<KEY>);

    //En la url de notificación nos devolverá algo como esto
    Array
    (
        [Ds_Date] => 20/10/2016
        [Ds_Hour] => 15:19
        [Ds_SecurePayment] => 1
        [Ds_Card_Number] => 454881******0004
        
        [Ds_Merchant_Identifier] => cd8e4017c4c2f16bc9ccff87b0d07ad9c6cbd257

        [Ds_Card_Country] => 724
        [Ds_Amount] => 3200
        [Ds_Currency] => 978
        [Ds_Order] => 1476969550
        [Ds_MerchantCode] => 999008881
        [Ds_Terminal] => 001
        [Ds_Response] => 0000
        [Ds_MerchantData] => Descripcion_del_pedido_extra
        [Ds_TransactionType] => 0
        [Ds_ConsumerLanguage] => 1
        [Ds_AuthorisationCode] => 025483
    )

```

{'fraction_non_alphanumeric': 0.1158713092382764, 'fraction_numerical': 0.038541063601025556, 'mean_word_length': 2.912002588159172, 'pattern_counts': {'":': 4, '<': 12, '<?xml version=': 0, '>': 124, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1709983', 'n_tokens_mistral': 4483, 'n_tokens_neox': 4041, 'n_words': 1213}