gui-gui/omnipay-payu-brazil

View on GitHub
src/Message/AbstractRequest.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace Omnipay\PayUBrazil\Message;

use Omnipay\Common\Message\AbstractRequest as BaseAbstractRequest;

/**
 * Abstract Request
 *
 */
abstract class AbstractRequest extends BaseAbstractRequest
{

    protected $liveEndpoint = 'https://api.payulatam.com/payments-api/4.0/service.cgi';
    protected $testEndpoint = 'https://sandbox.api.payulatam.com/payments-api/4.0/service.cgi';
    // protected $testEndpoint = 'http://requestb.in/13hshws1';

   
    public function getEndpoint()
    {
        if ($this->getTestMode()) {
            return $this->testEndpoint;
        }
        return $this->liveEndpoint;
    }

    public function getToken()
    {
        return $this->getParameter('token');
    }

    public function setToken($value)
    {
        return $this->setParameter('token', $value);
    }

    public function getApiKey()
    {
        return $this->getParameter('apiKey');
    }
    
    public function setApiKey($value)
    {
        return $this->setParameter('apiKey', $value);
    }

    public function getApiLogin()
    {
        return $this->getParameter('apiLogin');
    }
    
    public function setApiLogin($value)
    {
        return $this->setParameter('apiLogin', $value);
    }

    public function getMerchantId()
    {
        return $this->getParameter('merchantId');
    }
    
    public function setMerchantId($value)
    {
        return $this->setParameter('merchantId', $value);
    }

    public function getAccountId()
    {
        return $this->getParameter('accountId');
    }
    
    public function setAccountId($value)
    {
        return $this->setParameter('accountId', $value);
    }
    
    public function getOrderReference()
    {
        return $this->getParameter('orderReference');
    }
    
    public function setOrderReference($value)
    {
        return $this->setParameter('orderReference', $value);
    }

    public function getSignature()
    {
        return $this->getParameter('signature');
    }   
    
    public function setSignature()
    {
        $signature = md5($this->getApiKey() . '~' . $this->getMerchantId() . '~' . $this->getTransactionId() . '~' .  $this->getAmount()  . '~' . $this->getCurrency() );

        return $this->setParameter('signature', $signature);
    }

    /**
     * Get Document number (CPF).
     *
     * @return string
     */
    public function getHolderDocumentNumber()
    {
        return $this->getParameter('holderDocumentNumber');
    }

    public function setHolderDocumentNumber($value)
    {
        return $this->setParameter('holderDocumentNumber', preg_replace("/[^0-9]/", '', $value));
    }    

    /**
     * Get Business number (CNPJ).
     *
     * @return string
    */
    public function getHolderBusinessNumber()
    {
        return $this->getParameter('holderBusinessNumber');
    }

    public function setHolderBusinessNumber($value)
    {
        return $this->setParameter('holderBusinessNumber', preg_replace("/[^0-9]/", '', $value));
    }    

    protected function insertBaseRequestData($data)
    {
        $result = array_merge($this->getBaseRequestData(), $data);

        return $result;
    }

    protected function getBaseRequestData()
    {
        $data = array();
        $data['language'] = 'pt';
        $data['command'] = 'SUBMIT_TRANSACTION';
        $data['test'] = $this->getTestMode() ? true : false;

        $data['merchant']['apiKey'] = $this->getApiKey();
        $data['merchant']['apiLogin'] = $this->getApiLogin();

        return $data;
    }

    // protected function getPayerData()
    // {
    //     $card = $this->getCard();
    //     $payer = array();

    //     $payer['fullName'] = $card->getName();
    //     $payer['emailAddress'] = $card->getEmail();
    //     $payer['contactPhone'] = $this->formatPhone($card->getPhone());
        
    //     if(strlen($card->getHolderDocumentNumber()) == 11)
    //     {
    //         $payer['dniNumber'] = $this->formatCpf($card->getHolderDocumentNumber());
    //     }
        
    //     if(strlen($card->getHolderBusinessNumber()) == 14)
    //     {
    //         $payer['cnpj'] = $card->getHolderBusinessNumber();
    //     }

    //     $arrayAddress = $this->formatAddress($card->getAddress1() . ',' . $card->getAddress2());
    //     if(!empty($arrayAddress['street1'])) 
    //     {
    //         $payer['billingAddress'] = $arrayAddress;
    //     }
    //     $payer['billingAddress']['city'] = $card->getCity();
    //     $payer['billingAddress']['state'] = $card->getState();
    //     $payer['billingAddress']['country'] = $card->getCountry();
    //     $payer['billingAddress']['postalCode'] = $this->formatPostCode($card->getPostCode());
    //     $payer['billingAddress']['phone'] = $this->formatPhone($card->getPhone());

    //     return $payer;
    // }

    protected function getBuyerData()
    {
        $card = $this->getCard();
        $buyer = array();

        $buyer['fullName'] = $card->getName();
        $buyer['emailAddress'] = $card->getEmail();
        $buyer['contactPhone'] = $this->formatPhone($card->getShippingPhone());

        if(strlen($this->getHolderDocumentNumber()) == 11)
        {
            $buyer['dniNumber'] = $this->formatCpf($this->getHolderDocumentNumber());
        }
        
        if(strlen($this->getHolderBusinessNumber()) == 14)
        {
            $buyer['cnpj'] = $this->getHolderBusinessNumber();
        }

        $arrayAddress = $this->formatAddress($card->getShippingAddress1() . ',' . $card->getShippingAddress2());
        if(!empty($arrayAddress['street1'])) 
        {
            $buyer['shippingAddress'] = $arrayAddress;
        }
        $buyer['shippingAddress']['city'] = $card->getShippingCity();
        $buyer['shippingAddress']['state'] = $card->getShippingState();
        $buyer['shippingAddress']['country'] = $card->getShippingCountry();
        $buyer['shippingAddress']['postalCode'] = $this->formatPostCode($card->getShippingPostCode());
        $buyer['shippingAddress']['phone'] = $this->formatPhone($card->getShippingPhone());

        return $buyer;
    }

    protected function getCardData()
    {
        $card = $this->getCard();
        $data = array();
        
        $card->validate();

        $data['number'] = $card->getNumber();
        $data['securityCode'] = $card->getCvv();
        $data['expirationDate'] = $card->getExpiryYear() . '/' . sprintf('%02d',$card->getExpiryMonth());
        $data['name'] = $card->getName();

        return $data;
    }

    protected function formatAddress($address)
    {
        $result = array();
        $explode = array_map('trim', explode(',', $address));
        
        if(count($explode) >= 3)
        {
            $result['street1'] = implode(' ', array_slice($explode, 0, -1) );
            $result['street2'] = end($explode);
        }
        else 
        {
            $result['street1'] = $explode[0];
            $result['street2'] = isset($explode[1]) ? $explode[1] : '';
        }

        return $result;
    }

    protected function formatPostCode($postCode)
    {
        return vsprintf("%s%s%s%s%s-%s%s%s", str_split(preg_replace("/[^0-9]/", "", $postCode)));
    }

    // CPF formatter
    protected function formatCpf($number)
    {
        return vsprintf("%s%s%s.%s%s%s.%s%s%s-%s%s", str_split(preg_replace("/[^0-9]/", "", $number)));
    }

    protected function formatPhone($phoneNumber)
    {
        $arrayPhone = array();
        $phone = preg_replace("/[^0-9]/", "", $phoneNumber);
        if(substr( $phone, 0, 1 ) === "0"){
            $arrayPhone['ddd'] = substr($phone, 1, 2);
            $arrayPhone['number'] = substr($phone, 3);
        } elseif (strlen($phone) < 10 ) {
            $arrayPhone['ddd'] = '00';
            $arrayPhone['number'] = $phone;
        } else {
            $arrayPhone['ddd'] = substr($phone, 0, 2);
            $arrayPhone['number'] = substr($phone, 2);
        }
        
        return '(' . $arrayPhone['ddd'] . ')' . (strlen($arrayPhone['number']) >= 8 ? $arrayPhone['number'] : '00000000');
    }
    
    public function getHttpMethod()
    {
        return 'POST';
    }

    public function sendData($data)
    {
        // don't throw exceptions for 4xx errors
        $this->httpClient->getEventDispatcher()->addListener(
            'request.error',
            function ($event) {
                if ($event['response']->isClientError()) {
                    $event->stopPropagation();
                }
            }
        );

        $httpRequest = $this->httpClient->createRequest(
            $this->getHttpMethod(),
            $this->getEndpoint(),
            null,
            json_encode($this->insertBaseRequestData($data)),
            $this->getOptions()
        );

        $httpRequest->setHeader('Content-Type', 'application/json');
        $httpRequest->setHeader('Accept', 'application/json');

        $httpResponse = $httpRequest->send();

        return $this->createResponse($httpResponse->json());
    }

    protected function getOptions()
    {
        return array();
    }

    protected function createResponse($data)
    {
        return $this->response = new Response($this, $data);
    }


}