<repo_name>FuriosoJack/PayU-Payment-SDK<file_sep>/README.md
# PayU-Payment-SDK
Repositorio personalizado y acomodado para pagos con PayU basando en el SDK Official de PayU
<file_sep>/src/Requests/PayURequestStoreTokenCreditCard.php
<?php


namespace FuriosoJack\PayUPaymentSDK\Requests;
use FuriosoJack\PayUPaymentSDK\PayU\api\PayUResponseCode;
use FuriosoJack\PayUPaymentSDK\PayU\PayUTokens;

/**
 * Class PayUStoreTokenCreditCard
 * @package FuriosoJack\PayUPaymentSDK\Requests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayURequestStoreTokenCreditCard extends PayUBasicRequestAbstract
{

    /**
     * Se define metodo para el envio del request
     */
    public function sendRequest()
    {
        try {
            $this->response = PayUTokens::create($this->parameters->getParameters());
            $this->checkResponse();
        } catch (\Exception $e) {
            $this->errors = $e->getMessage();
        }
    }

    /**
     * Se encrara que la respuesta sea satisfactoria
     */
    protected function checkResponse()
    {
        if($this->response->code != PayUResponseCode::SUCCESS){
            $this->errors = "Response ".$this->response->code;
        }
    }
}<file_sep>/src/Parameters/PayUParametersAbstract.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Parameters;

/**
 * Class PayUParametersAbstract
 * @package FuriosoJack\PayUPaymentSDK\Parameters
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
abstract class PayUParametersAbstract
{
    protected $parameters = array();
    protected $parametersRequired = array();
    protected $parametersMissing = array();
    protected $parametersObtional = array();


    public function __construct()
    {
        $this->initParametersRequired();
    }

    /**
     *  Añade nuevo parametro
     * @param $paramName
     * @param $value
     * @throws \Exception
     */
    public function addParameter($paramName, $value)
    {

        //Verifica que sea necesario agregarlo
        if(!$this->checkParametrerIsRequired($paramName) && !$this->checkParameterIsOptional($paramName) ){
            throw new \Exception("Parametro Incorrecto, no requerido:".$paramName);
        }
        //Se verifica si ya esta agregado
        $this->checkParameterAlreadyAdded($paramName);

        if($this->checkParameterIsOptional($paramName)){
            $this->removeParameterMissingOptional(array_search($paramName, $this->parametersObtional));
        }else{
            //Remueve los parametros faltantes
            $this->removeParameterMissing(array_search($paramName, $this->parametersMissing));
        }


        $this->parameters[$paramName] = $value;
    }

    /**
     * Añade todos los parametros de una vez
     * @param array $parameters
     * @throws \Exception
     */
    public function setAllParameters(array $parameters)
    {
        foreach ($parameters as $key => $parameter){
            $this->addParameter($key, $parameter);
        }
    }


    /**
     * Verifica si el parametros ya fue agregado
     * @param $paramName
     * @throws \Exception
     */
    public function checkParameterAlreadyAdded($paramName)
    {
        if(!$this->checkParameterIsMissing($paramName)){
            throw new \Exception("El parametro ya fue agregado" . ": " . $paramName);
        }
    }

    public function checkParameterIsOptional($paramName)
    {
        return in_array($paramName, $this->parametersObtional);
    }

    /**
     * Inicaliza los parametros requeridos
     * @return mixed
     */
    protected abstract function initParametersRequired();

    /**
     * Retorna lo parametros añadidos arma los parametros
     * @return array
     * @throws \Exception
     */
    public function getParameters()
    {
        //Verifica si ya estan todos lo parametros
        if( $this->existParametersMissing() ){
            throw new \Exception("Hacen falta parametros por ingresar requeridos por la logia de negocio.".' '.json_encode($this->parametersMissing));
        }
        return $this->parameters;
    }

    /**
     * Quita un parametros de los parametros faltantes requeridos
     * @param $paramKEY
     */
    protected function removeParameterMissing($paramKEY)
    {
        unset($this->parametersMissing[$paramKEY]);
    }

    /**
     * Quita el parametro de los parametros obcionales
     * @param $paramKEY
     */
    protected function removeParameterMissingOptional($paramKEY)
    {
        unset($this->parametersObtional[$paramKEY]);
    }
    /**
     * Verifica si el parametro hace falta, returna el indice si hace fala o false si no
     * @return int boolean
     */
    public function checkParameterIsMissing($param)
    {
        return in_array($param, $this->parametersMissing) || in_array($param, $this->parametersObtional);
    }

    /**
     * check si parametros es requerido
     * @return bool
     */
    public function checkParametrerIsRequired($param)
    {
        return in_array( $param, $this->parametersRequired);
    }


    /**
     * Vericica si existen parametros requeridos por llenar
     * @return array lista de parametros que faltan
     */
    public function checkParameterMissing()
    {
        if(!$this->existParametersMissing()){
            return null;
        }
        return $this->parametersMissing;
    }

    /**
     * Verifica si existen parametros faltantes
     * @return bool
     */
    protected function existParametersMissing(){
        return count($this->parametersMissing) > 0;
    }

}<file_sep>/tests/TestRequest.php
<?php


namespace FuriosoJack\PayUPaymentSDK\Tests;
use FuriosoJack\PayUPaymentSDK\Parameters\PayUParametersStoreTokenCard;

/**
 * Class TestRequest
 * @package FuriosoJack\PayUPaymentSDK\Tests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class TestRequest
{


    public function testRequestTokeneizer()
    {


    }


}<file_sep>/src/Parameters/PayUParametersDeleteTokenCreditCard.php
<?php


namespace FuriosoJack\PayUPaymentSDK\Parameters;

/**
 * Class PayUParametersDeleteTokenCreditCard
 * @package FuriosoJack\PayUPaymentSDK\Parameters
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayUParametersDeleteTokenCreditCard extends PayUParametersAbstract
{

    /**
     * Inicaliza los parametros requeridos
     * @return mixed
     */
    protected function initParametersRequired()
    {
        $this->parametersRequired = [
            //Ingresa aquí el identificador del pagador.
            PayUParameters::PAYER_ID,
            //Ingresa aquí el identificador del token.
            PayUParameters::TOKEN_ID
        ];

        $this->parametersMissing = $this->parametersRequired;
    }
}<file_sep>/src/Parameters/PayUParametersStoreTokenCard.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Parameters;
use FuriosoJack\PayUPaymentSDK\PayU\util\PayUParameters;

/**
 * Class PayUParametersStoreTokenCard
 * @package FuriosoJack\PayUPaymentSDK\Parameters
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayUParametersStoreTokenCard extends PayUParametersAbstract
{

    /**
     * Inicaliza los parametros requeridos
     * @return mixed
     */
    protected function initParametersRequired()
    {
        $this->parametersRequired = [

            PayUParameters::PAYER_NAME,
            //Ingrese aquí el identificador del pagador.
            PayUParameters::PAYER_ID,
            //Ingrese aquí el documento de identificación del comprador.
            PayUParameters::PAYER_DNI,
            //Ingrese aquí el número de la tarjeta de crédito
            PayUParameters::CREDIT_CARD_NUMBER,
            //Ingrese aquí la fecha de vencimiento de la tarjeta de crédito
            PayUParameters::CREDIT_CARD_EXPIRATION_DATE,
            //Ingrese aquí el nombre de la tarjeta de crédito
            PayUParameters::PAYMENT_METHOD,


        ];

        $this->parametersMissing = $this->parametersRequired;
    }
}<file_sep>/src/Requests/PayURequestConsultToken.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Requests;
use FuriosoJack\PayUPaymentSDK\PayU\api\PayUResponseCode;
use FuriosoJack\PayUPaymentSDK\PayU\PayUTokens;

/**
 * Class PayUConsultToken
 * @package FuriosoJack\PayUPaymentSDK\Requests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayURequestConsultToken extends  PayUBasicRequestAbstract
{

    /**
     * Se define metodo para el envio del request
     */
    public function sendRequest()
    {
        try {
            $this->response = PayUTokens::find(
                $this->parameters->getParameters()
            );
            $this->checkResponse();
        } catch (\Exception $e) {
            $this->errors = $e->getMessage();
        }
    }

    /**
     * Se encrara que la respuesta sea satisfactoria
     */
    protected function checkResponse()
    {
        if($this->response->code != PayUResponseCode::SUCCESS){
            $this->errors = "Response ".$this->response->code;
        }
    }
}<file_sep>/tests/TestCase.php
<?php


namespace FuriosoJack\PayUPaymentSDK\Tests;

/**
 * Class TestCase
 * @package FuriosoJack\PayUPaymentSDK\Tests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class TestCase extends \PHPUnit\Framework\TestCase
{

}<file_sep>/src/Requests/PayURequestSetPayment.php
<?php


namespace FuriosoJack\PayUPaymentSDK\Requests;
use FuriosoJack\PayUPaymentSDK\PayU\api\PayUResponseCode;
use FuriosoJack\PayUPaymentSDK\PayU\PayUPayments;

/**
 * Class PayUSetPayment
 * @package FuriosoJack\PayUPaymentSDK\Requests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayURequestSetPayment extends PayUBasicRequestAbstract
{

    /**
     * Se define metodo para el envio del request
     * @throws \InvalidArgumentException
     * @throws \FuriosoJack\PayUPaymentSDK\PayU\PayUException
     */
    public function sendRequest()
    {
        try {
            $this->response = PayUPayments::doAuthorizationAndCapture(
                $this->parameters->getParameters()
            );

            $this->checkResponse();

        } catch (\Exception $e) {
            $this->errors = $e->getMessage();
        }
    }

    /**
     * Se encrara que la respuesta sea satisfactoria
     */
    protected function checkResponse()
    {
        if($this->response->code != PayUResponseCode::SUCCESS){
            $this->errors = "Response ".$this->response->code;
        }
    }
}<file_sep>/src/Parameters/PayUParametersConsultToken.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Parameters;
use FuriosoJack\PayUPaymentSDK\PayU\util\PayUParameters;

/**
 * Class PayUParametersConsultToken
 * @package FuriosoJack\PayUPaymentSDK\Parameters
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayUParametersConsultToken extends PayUParametersAbstract
{

    protected function initParametersRequired()
    {
        $this->parametersRequired = [
            //Ingresa aquí el identificador del pagador.
            PayUParameters::PAYER_ID,
            //Ingresa aquí el identificador del token.
            PayUParameters::TOKEN_ID,
            //Ingresa aquí la fecha inicial desde donde filtrar con la fecha final hasta donde filtrar.
            //PayUParameters::START_DATE=> "2010-01-01T12:00:00",
            //PayUParameters::END_DATE=> "2015-01-01T12:00:00"
        ];

        $this->parametersMissing = $this->parametersRequired;
    }
}<file_sep>/src/Requests/PayUBasicRequestAbstract.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Requests;
use FuriosoJack\PayUPaymentSDK\Parameters\PayUParametersAbstract;

/**
 * Class PayUBasicRequestAbstract
 * @package FuriosoJack\PayUPaymentSDK\Requests
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
abstract  class PayUBasicRequestAbstract
{

    protected $parameters;
    protected $response;
    protected $errors;
    protected $callBackOnSucess;
    protected $callBackOnError;


    /**
     * Se encarga de setear una clase que herede de PayUParametersAbstract
     * @param PayUParametersAbstract
     */
    public function setParameters(PayUParametersAbstract $parametersClass){
        $this->parameters = $parametersClass;
    }

    public function getResponse()
    {
        return $this->response;
    }

    public function getErrors()
    {
        return $this->errors;
    }

    public function clearErrors(){
        $this->errors = null;
    }
    /**
     * Se encarga de validar si existen errores validando la varibable errors
     * @return bool
     */
    public function thereAreErrors()
    {
        return $this->errors != null ? true : false;
    }

    /**
     * Se define metodo para el envio del request
     */
    public abstract function sendRequest();

    /**
     * Se encrara que la respuesta sea satisfactoria
     */
    protected abstract function checkResponse();

    /**
     * @return mixed
     */
    public function getCallBackOnSucess()
    {
        return $this->callBackOnSucess;
    }

    /**
     * @param mixed $callBackOnSucess
     */
    public function setCallBackOnSucess($callBackOnSucess)
    {
        $this->callBackOnSucess = $callBackOnSucess;
    }

    /**
     * @return mixed
     */
    public function getCallBackOnError()
    {
        return $this->callBackOnError;
    }

    /**
     * @param mixed $callBackOnError
     */
    public function setCallBackOnError($callBackOnError)
    {
        $this->callBackOnError = $callBackOnError;
    }



}<file_sep>/src/Parameters/PayUParametersSetPayment.php
<?php
namespace FuriosoJack\PayUPaymentSDK\Parameters;
use FuriosoJack\PayUPaymentSDK\PayU\util\PayUParameters;

/**
 * Class PayUParametersSetPaymen
 * @package FuriosoJack\PayUPaymentSDK\Parameters
 * @author <NAME> - FuriosoJack <<EMAIL>>
 */
class PayUParametersSetPayment extends PayUParametersAbstract
{

    /**
     * Inicaliza los parametros requeridos
     * @return mixed
     */
    protected function initParametersRequired()
    {
        $this->parametersRequired = [

            //Ingrese aquí el número de cuotas.
            PayUParameters::INSTALLMENTS_NUMBER,

            //Ingrese aquí el nombre del pais.
            //PayUParameters::COUNTRY,
            //Session id del device.
            //PayUParameters::DEVICE_SESSION_ID,
            //IP del pagadador
            //PayUParameters::IP_ADDRESS,
            //Cookie de la sesión actual.
            //PayUParameters::PAYER_COOKIE,
            //Cookie de la sesión actual.
            //PayUParameters::USER_AGENT,

            // -- Comprador
            //Ingrese aquí el nombre del comprador.
            PayUParameters::BUYER_NAME,
            //Ingrese aquí el email del comprador.
            PayUParameters::BUYER_EMAIL,
            //Ingrese aquí el teléfono de contacto del comprador.
            PayUParameters::BUYER_CONTACT_PHONE,
            //Ingrese aquí el documento de contacto del comprador.
            //PayUParameters::BUYER_DNI,
            //Ingrese aquí la dirección del comprador.
            PayUParameters::BUYER_PHONE,

            //Ingrese aquí el nombre del pagador.
            PayUParameters::PAYER_NAME,
            //Ingrese aquí el email del pagador.
            PayUParameters::PAYER_EMAIL,
            //Ingrese aquí el teléfono de contacto del pagador.
            PayUParameters::PAYER_CONTACT_PHONE,
            //Ingrese aquí el documento de contacto del pagador.
            //PayUParameters::PAYER_DNI,
            PayUParameters::PAYER_PHONE,
            //DATOS DEL TOKEN CARD
            PayUParameters::TOKEN_ID,

            //Ingrese aquí el nombre de la tarjeta de crédito
            //VISA||MASTERCARD||AMEX||DINERS
            PayUParameters::PAYMENT_METHOD,

            //Ingrese aquí el identificador de la cuenta.
            PayUParameters::ACCOUNT_ID,
            //Ingrese aquí el código de referencia.
            PayUParameters::REFERENCE_CODE,
            //Ingrese aquí la descripción.
            PayUParameters::DESCRIPTION,

            // -- Valores --
            //Ingrese aquí el valor.
            PayUParameters::VALUE,
            //Ingrese aquí la moneda.
            PayUParameters::CURRENCY

        ];

        $this->parametersMissing = $this->parametersRequired;
    }
}