PK       ! ¦ßj    (  src/Message/CompletePurchaseResponse.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

use Omnipay\Common\Message\AbstractResponse;

/**
 * New Complete Purchase response
 */
class CompletePurchaseResponse extends CompleteAuthorizeResponse
{
    public function isSuccessful()
    {
        return isset($this->data['decision']) && 'ACCEPT' === $this->data['decision'];
    }

    public function getTransactionId()
    {
        return isset($this->data['req_reference_number']) ? $this->data['req_reference_number'] : null;
    }

    public function getTransactionReference()
    {
        return isset($this->data['transaction_id']) ? $this->data['transaction_id'] : null;
    }

    public function getMessage()
    {
        return isset($this->data['message']) ? $this->data['message'] : null;
    }
}
PK       ! t•¤Þ   Þ     src/Message/CaptureRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

/**
 * Cybersource Capture Request
 * This is a required OmniPay class but I can't see a reference to it in the dev docs
 */
class CaptureRequest extends PurchaseRequest
{

}
PK       ! f-ç®¿  ¿    src/Message/AbstractRequest.phpnu „[µü¤        <?php
namespace Omnipay\Cybersource\Message;

use Omnipay\Common\Message\RequestInterface;

/**
 *
 * @method \Omnipay\Cybersource\Message\Response send()
 */
abstract class AbstractRequest extends \Omnipay\Common\Message\AbstractRequest
{
    protected $liveEndpoint = 'https://secureacceptance.cybersource.com/silent';
    protected $testEndpoint = 'https://testsecureacceptance.cybersource.com/silent';
    protected $endpoint = '';
    protected $isUsOrCanada = false;

    public function sendData($data)
    {
        return $this->response = new Response($this, $data, $this->getEndpoint());
    }

    public function getProfileId()
    {
        return $this->getParameter('profileId');
    }

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

    public function getSecretKey()
    {
        return $this->getParameter('secretKey');
    }

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

    public function getAccessKey()
    {
        return $this->getParameter('accessKey');
    }

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

    public function getTransactionType()
    {
        return $this->getParameter('transactionType');
    }

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

    public function getIsUsOrCanada()
    {
        return $this->getParameter('isUsOrCanada');
    }

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

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

    public function getHttpMethod()
    {
        return 'POST';
    }

    public function getCardTypes()
    {
        return array(
            'visa' => '001',
            'mastercard' => '002',
            'amex' => '003',
            'discover' => '004',
            'diners_club' => '005',
            'carte_blanche' => '006',
            'jcb' => '007',
            'jal' => '021',
            'maestro' => '024',
            'delta' => '031',
            'visa_electron' => '033',
            'dankort' => '034',
            'carte_bleue' => '036',
            'carta_si' => '037',
            'maestro_international' => '042',
            'ge_money_uk_card' => '043'
        );
    }

    public function getCardType()
    {
        $types = $this->getCardTypes();
        $brand = $this->getCard()->getBrand();
        return empty($types[$brand]) ? null : $types[$brand];
    }

    /**
     *
     * @param array $data
     * @param array $fields
     * @param string $secret_key
     *
     * @return string
     */
    public function generateSignature($data, $fields, $secret_key)
    {
        $data_to_sign = array();
        foreach ($fields as $field) {
            $data_to_sign[] = $field . "=" . $data[$field];
        }
        $pairs = implode(',', $data_to_sign);
        return base64_encode(hash_hmac('sha256', $pairs, $secret_key, true));
    }

    public function supportsDeleteCard()
    {
        return false;
    }
}
PK       ! )ð×äÖ   Ö     src/Message/PurchaseRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

/**
 * Cybersource Purchase Request
 */
class PurchaseRequest extends AuthorizeRequest
{
    public function getTransactionType()
    {
        return 'sale';
    }
}
PK       ! ·Tµž  ž  !  src/Message/UpdateCardRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

/**
 * Stripe Update Credit Card Request
 */
class UpdateCardRequest extends AbstractRequest
{
    public function getData()
    {
        $data = array();
        $data['description'] = $this->getDescription();

        if ($this->getToken()) {
            $data['card'] = $this->getToken();
        } elseif ($this->getCard()) {
            $data['card'] = $this->getCardData();
            $data['email'] = $this->getCard()->getEmail();
        }

        $this->validate('cardReference');

        return $data;
    }

    public function getEndpoint()
    {
        return parent::$endpoint . '/token/update';
    }
}
PK       ! í®:r    )  src/Message/CompleteAuthorizeResponse.phpnu „[µü¤        <?php
namespace Omnipay\Cybersource\Message;

use Omnipay\Common\Message\AbstractResponse;

/**
 *
 * @author Rafael Diaz-Tushman
 *
 */
class CompleteAuthorizeResponse extends AbstractResponse
{

    public function isSuccessful()
    {
        return isset($this->data['decision']) && $this->data['decision'] === 'ACCEPT';
    }

    public function getTransactionReference()
    {
        return isset($this->data['transaction_id']) ? $this->data['transaction_id'] : null;
    }

    public function getMerchantTransactionReference()
    {
        return isset($this->data['req_reference_number']) ? $this->data['req_reference_number'] : null;
    }

    public function getMessage()
    {
        return isset($this->data['message']) ? $this->data['message'] : null;
    }

    public function validateSignature($secret_key)
    {
        $signed_field_names_string = isset($this->data['signed_field_names'])
            ? $this->data['signed_field_names'] : null;
        $signed_field_names = explode(",", $signed_field_names_string);

        $signed_data = array();
        foreach ($signed_field_names as $field) {
            $signed_data[] = $field . "=" . $this->data[$field];
        }

        $our_signature = base64_encode(hash_hmac('sha256', implode(",", $signed_data), $secret_key, true));

        if ($our_signature != $this->data['signature']) {
            return false;
        }

        return true;
    }

    public function getCVNCode()
    {
        return isset($this->data['auth_cv_result']) ? $this->data['auth_cv_result'] : null;
    }

    public function getAVSCode()
    {
        return isset($this->data['auth_avs_code']) ? $this->data['auth_avs_code'] : null;
    }

    public function getReasonCode()
    {
        return isset($this->data['reason_code']) ? $this->data['reason_code'] : null;
    }

    public function getInvalidFields()
    {
        $array = array();

        if (!empty($this->data['invalid_fields'])) {
            $array = explode(",", $this->data['invalid_fields']);
        }

        return $array;
    }
}
PK       ! mX(â‹  ‹    src/Message/Response.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

use Omnipay\Common\Message\AbstractResponse;
use Omnipay\Common\Message\RequestInterface;
use Omnipay\Common\Message\RedirectResponseInterface;

/**
 * Cybersource Response
 */
class Response extends AbstractResponse implements RedirectResponseInterface
{
    public function __construct(RequestInterface $request, $data, $redirectUrl)
    {
        $this->request = $request;
        $this->data = $data;
        $this->redirectUrl = $redirectUrl;
    }

    public function isSuccessful()
    {
        return false;
    }

    public function isRedirect()
    {
        return true;
    }

    public function isTransparentRedirect()
    {
        return true;
    }

    public function getRedirectUrl()
    {
        return $this->redirectUrl;
    }

    public function getRedirectMethod()
    {
        return 'POST';
    }

    public function getRedirectData()
    {
        return $this->getData();
    }

    public function getRedirectResponseHiddenFields()
    {
        $hiddenFields = '';
        foreach ($this->getRedirectData() as $key => $value) {
            $hiddenFields .= sprintf(
                '<input type="hidden" name="%1$s" value="%2$s" />',
                htmlentities($key, ENT_QUOTES, 'UTF-8', false),
                htmlentities($value, ENT_QUOTES, 'UTF-8', false)
            ) . "\n";
        }
        return $hiddenFields;
    }
}
PK       ! r4‡á       src/Message/AuthorizeRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

/**
 * Cybersource Authorize Request
 */
class AuthorizeRequest extends AbstractRequest
{

    public function getData()
    {
        $this->validate('currency', 'amount');

        $data = $this->getBaseData() + $this->getTransactionData();
        $data['signed_date_time'] = gmdate("Y-m-d\TH:i:s\Z");
        $data['unsigned_field_names'] = 'card_type,card_number,card_expiry_date';
        $data['signed_field_names'] = implode(',', array_keys($data)) . ',signed_field_names';
        $data['signature'] = $this->signData($data);

        // this is in progress - at this stage let's just pass the
        // cc fields through but really we need to return a form for them to enter it
        $data['card_type'] = $this->getCardType();
        $data['card_number'] = $this->getCard()->getNumber();
        $data['card_expiry_date'] = $this->getCard()->getExpiryDate('m-Y');
        return $data;
    }

    public function signData($data)
    {
        return base64_encode(hash_hmac('sha256', $this->buildDataToSign($data), $this->getSecretKey(), true));
    }

    public function buildDataToSign($data)
    {
        $signedFieldNames = explode(",", $data["signed_field_names"]);
        foreach ($signedFieldNames as $field) {
            $dataToSign[] = $field . "=" . $data[$field];
        }
        return implode(",", $dataToSign);
    }

    public function getRequiredFields()
    {
        $extraFields = $this->getIsUsOrCanada() ? $this->getRequiredFieldsUsAndCanada() : array();
        return array_merge(array(
            'amount',
            'city',
            'country',
            'address1',
            'email',
            'firstName',
            'lastName',
            'currency',
        ), $extraFields);
    }

    public function getRequiredFieldsUsAndCanada()
    {
        return array(
            'postcode',
            'billingState',
        );
    }

    public function getTransactionData()
    {
        return array(
            'reference_number' => $this->getTransactionId(),
            'amount' => $this->getAmount(),
            'currency' => $this->getCurrency(),
            'description' => $this->getDescription(),
            'payment_method' => $this->getPaymentMethod(),
            'bill_to_forename' => $this->getCard()->getFirstName(),
            'bill_to_surname' => $this->getCard()->getLastName(),
            'bill_to_email' => $this->getCard()->getEmail(),
            'bill_to_phone' => $this->getCard()->getBillingPhone(),
            'bill_to_address_line1' => $this->getCard()->getAddress1(),
            'bill_to_address_line2' => $this->getCard()->getAddress2(),
            'bill_to_address_city' => $this->getCard()->getCity(),
            'bill_to_address_state' => $this->getCard()->getBillingState(),
            'bill_to_address_country' => strtoupper($this->getCard()->getCountry()),
            'bill_to_address_postal_code' => $this->getCard()->getPostcode(),
            'bill_to_company_name' => $this->getCard()->getCompany(),
        );
    }

    /**
     * @return array
     */
    public function getBaseData()
    {
        return array(
            'access_key' => $this->getAccessKey(),
            'profile_id' => $this->getProfileId(),
            //@todo allow setting locale
            'locale' => 'en',
            'transaction_uuid' => $this->getUniqueID(),
            'transaction_type' => $this->getTransactionType(),
        );
    }

    /**
     * @return string
     */
    public function getUniqueID()
    {
        return uniqid();
    }

    public function getEndpoint()
    {
        return parent::getEndpoint() . '/pay';
    }

    public function getPaymentMethod()
    {
        return 'card';
    }

    public function getTransactionType()
    {
        return 'authorization';
    }
}
PK       ! ˆ¢sˆ‹  ‹  (  src/Message/CompleteAuthorizeRequest.phpnu „[µü¤        <?php
namespace Omnipay\Cybersource\Message;

/**
 *
 * @author Rafael Diaz-Tushman
 *
 */
class CompleteAuthorizeRequest extends AbstractRequest
{

    public function getData()
    {
        $data = $this->httpRequest->request->all();

        return $data;
    }

    public function sendData($data)
    {
        return $this->response = new CompleteAuthorizeResponse($this, $data);
    }
}
PK       ! I¬W¿Ù  Ù  !  src/Message/CreateCardRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

/**
 * Stripe Create Credit Card Request
 */
class CreateCardRequest extends AbstractRequest
{
    public function getData()
    {
        $data = array();
        $data['description'] = $this->getDescription();

        if ($this->getToken()) {
            $data['card'] = $this->getToken();
        } elseif ($this->getCard()) {
            $data['card'] = $this->getCardData();
            $data['email'] = $this->getCard()->getEmail();
        } else {
            // one of token or card is required
            $this->validate('card');
        }

        return $data;
    }

    public function getEndpoint()
    {
        return parent::$endpoint . '/token/create';
    }
}
PK       ! 2r¥Ë  Ë  '  src/Message/CompletePurchaseRequest.phpnu „[µü¤        <?php

namespace Omnipay\Cybersource\Message;

use Omnipay\Common\Exception\InvalidRequestException;

/**
 * Cybersource Purchase Request
 */
class CompletePurchaseRequest extends AuthorizeRequest
{
    public function getData()
    {
        $data = $this->httpRequest->request->all();
        if ($this->generateSignature(
            $data,
            explode(',', $data['signed_field_names']),
            $this->getSecretKey()
        )
            != $data['signature']) {
            throw new InvalidRequestException('signature mismatch');
        }
        return $data;
    }

    public function sendData($data)
    {
        return $this->response = new CompletePurchaseResponse($this, $data);
    }
}
PK       ! )H»a  a    src/Gateway.phpnu „[µü¤        <?php
namespace Omnipay\Cybersource;

use Omnipay\Common\AbstractGateway;
use Omnipay\Cybersource\Message\PurchaseRequest;
use Omnipay\Cybersource\Message\RefundRequest;

/**
 * CyberSource Secure Acceptance Silent Order POST Gateway
 *
 * @link http:
 * //apps.cybersource.com/library/documentation/dev_guides/Secure_Acceptance_SOP/html/wwhelp/wwhimpl/js/html/wwhelp.htm
 */
class Gateway extends AbstractGateway
{

    public function getName()
    {
        return 'Cybersource';
    }

    public function getDefaultParameters()
    {
        return array(
            'profileId' => '',
            'secretKey' => '',
            'accessKey' => '',
            'testMode' => false,
        );
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\AuthorizeRequest
     */
    public function authorize(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\AuthorizeRequest', $parameters);
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\CaptureRequest
     */
    public function capture(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\CaptureRequest', $parameters);
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\PurchaseRequest
     */
    public function purchase(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\PurchaseRequest', $parameters);
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\CompletePurchaseRequest
     */
    public function completePurchase(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\CompletePurchaseRequest', $parameters);
    }

    /**
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\CompleteAuthorizeRequest
     */
    public function completeAuthorize(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\CompleteAuthorizeRequest', $parameters);
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\CreateCardRequest
     */
    public function createCard(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\CreateCardRequest', $parameters);
    }

    /**
     *
     * @param array $parameters
     * @return \Omnipay\Cybersource\Message\UpdateCardRequest
     */
    public function updateCard(array $parameters = array())
    {
        return $this->createRequest('\Omnipay\Cybersource\Message\UpdateCardRequest', $parameters);
    }

    public function getProfileId()
    {
        return $this->getParameter('profileId');
    }

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

    public function getSecretKey()
    {
        return $this->getParameter('secretKey');
    }

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

    public function getAccessKey()
    {
        return $this->getParameter('accessKey');
    }

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

    public function getTransactionType()
    {
        return $this->getParameter('transactionType');
    }

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

    public function generateSignature($data)
    {
        $data_to_sign = array();
        foreach ($data as $key => $value) {
            $data_to_sign[] = $key . "=" . $value;
        }
        $pairs = implode(',', $data_to_sign);

        return base64_encode(hash_hmac('sha256', $pairs, $this->getSecretKey(), true));
    }
}
PK       ! E:Þ  Þ    composer.jsonnu „[µü¤        {
    "name": "dioscouri/omnipay-cybersource",
    "type": "library",
    "description": "Cybersource support for Omnipay payment processing library",
    "keywords": [
        "cybersource",
        "gateway",
        "merchant",
        "omnipay",
        "pay",
        "payment",
        "purchase"
    ],
    "homepage": "https://github.com/dioscouri/omnipay-cybersource",
    "license": "MIT",
    "authors": [
        {
            "name": "Rafael Diaz-Tushman",
            "email": "rdiaztushman@dioscouri.com"
        }
    ],
    "autoload": {
        "psr-4": { "Omnipay\\Cybersource\\" : "src/" }
    },
    "require": {
        "omnipay/common": "~2.0"
    },
    "require-dev": {
        "omnipay/tests": "~2.0"
    }
}PK         ! ¦ßj    (                src/Message/CompletePurchaseResponse.phpnu „[µü¤        PK         ! t•¤Þ   Þ               Y  src/Message/CaptureRequest.phpnu „[µü¤        PK         ! f-ç®¿  ¿              …  src/Message/AbstractRequest.phpnu „[µü¤        PK         ! )ð×äÖ   Ö               “  src/Message/PurchaseRequest.phpnu „[µü¤        PK         ! ·Tµž  ž  !            ¸  src/Message/UpdateCardRequest.phpnu „[µü¤        PK         ! í®:r    )            §  src/Message/CompleteAuthorizeResponse.phpnu „[µü¤        PK         ! mX(â‹  ‹                src/Message/Response.phpnu „[µü¤        PK         ! r4‡á                 í#  src/Message/AuthorizeRequest.phpnu „[µü¤        PK         ! ˆ¢sˆ‹  ‹  (            K3  src/Message/CompleteAuthorizeRequest.phpnu „[µü¤        PK         ! I¬W¿Ù  Ù  !            .5  src/Message/CreateCardRequest.phpnu „[µü¤        PK         ! 2r¥Ë  Ë  '            X8  src/Message/CompletePurchaseRequest.phpnu „[µü¤        PK         ! )H»a  a              z;  src/Gateway.phpnu „[µü¤        PK         ! E:Þ  Þ              K  composer.jsonnu „[µü¤        PK      Ò  5N    