/**
  * Build a transaction object to be added to payment request
  * @param array $parameters the parameters to build a transaction
  * @param strng $lang to be used
  * @return the transaction built
  * @throws InvalidArgumentException if any paramter is invalid
  * 
  */
 private static function buildTransactionRequest($parameters, $lang)
 {
     $transaction = new stdClass();
     $order = null;
     $transaction->paymentCountry = CommonRequestUtil::getParameter($parameters, PayUParameters::COUNTRY);
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::ORDER_ID) == null) {
         $signature = null;
         if (CommonRequestUtil::getParameter($parameters, PayUParameters::SIGNATURE) != null) {
             $signature = CommonRequestUtil::getParameter($parameters, PayUParameters::SIGNATURE);
         }
         $merchantId = PayU::$merchantId;
         $order = RequestPaymentsUtil::buildOrderRequest($parameters, $lang);
         if ($signature == null && $merchantId != null) {
             $signature = SignatureUtil::buildSignature($order, $merchantId, PayU::$apiKey, SignatureUtil::MD5_ALGORITHM);
         }
         $order->signature = $signature;
         $transaction->order = $order;
     } else {
         $orderId = CommonRequestUtil::getParameter($parameters, PayUParameters::ORDER_ID);
         $order = new stdClass();
         $order->orderId($orderId);
         $transaction . setOrder($order);
     }
     $transaction->order->buyer = RequestPaymentsUtil::buildBuyer($parameters);
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_IP_ADDRESS) != null) {
         $transaction->ipAddress = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_IP_ADDRESS);
     } else {
         $transaction->ipAddress = RequestPaymentsUtil::getIpAddress();
     }
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_COOKIE) != null) {
         $transaction->cookie = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_COOKIE);
     } else {
         $transaction->cookie = 'cookie_' . microtime();
     }
     $transaction->userAgent = sprintf("%s %s", PayU::API_NAME, PayU::API_VERSION);
     $transaction->source = PayU::API_CODE_NAME;
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::CREDIT_CARD_NUMBER) != null) {
         $transaction->creditCard = RequestPaymentsUtil::buildCreditCardTransaction($transaction, $parameters);
     } else {
         if (CommonRequestUtil::getParameter($parameters, PayUParameters::TOKEN_ID) != null) {
             $transaction->creditCard = RequestPaymentsUtil::buildCreditCardForToken($parameters);
         }
     }
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::INSTALLMENTS_NUMBER) != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::TRANSACTION_INSTALLMENTS_NUMBER, CommonRequestUtil::getParameter($parameters, PayUParameters::INSTALLMENTS_NUMBER));
     }
     $expirationDate = CommonRequestUtil::getParameter($parameters, PayUParameters::EXPIRATION_DATE);
     if (isset($expirationDate) && CommonRequestUtil::isValidDate($expirationDate, PayUConfig::PAYU_DATE_FORMAT, PayUParameters::EXPIRATION_DATE)) {
         $transaction->expirationDate = $expirationDate;
     }
     $transaction->creditCardTokenId = CommonRequestUtil::getParameter($parameters, PayUParameters::TOKEN_ID);
     $paymentMethod = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYMENT_METHOD);
     if (!PaymentMethods::isValidPaymentMethod($paymentMethod)) {
         throw new InvalidArgumentException(sprintf("The payment method value %s sent in parameter %s is invalid", $paymentMethod, PayUParameters::PAYMENT_METHOD));
     }
     $transaction->paymentMethod = $paymentMethod;
     $transaction->payer = RequestPaymentsUtil::buildPayer($parameters);
     $transaction->order = $order;
     return $transaction;
 }
 /**
  * Adds the extra parameters required by the PSE payment method
  *
  * @param transaction
  * @param parameters
  * @throws InvalidParametersException
  */
 private static function addPSEExtraParameters($transaction, $parameters)
 {
     // PSE reference identification 1
     $pseReference1 = CommonRequestUtil::getParameter($parameters, PayUParameters::IP_ADDRESS);
     // PSE reference identification 2
     $pseReference2 = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_DOCUMENT_TYPE);
     // PSE reference identification 3
     $pseReference3 = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_DNI);
     // PSE user type N-J (Natural or Legal)
     $pseUserType = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_PERSON_TYPE);
     // PSE financial institution code (Bank code)
     $pseFinancialInstitutionCode = CommonRequestUtil::getParameter($parameters, PayUParameters::PSE_FINANCIAL_INSTITUTION_CODE);
     // PSE financial institution name (Bank Name)
     $pseFinancialInstitutionName = CommonRequestUtil::getParameter($parameters, PayUParameters::PSE_FINANCIAL_INSTITUTION_NAME);
     if ($pseFinancialInstitutionCode != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::FINANCIAL_INSTITUTION_CODE, $pseFinancialInstitutionCode);
     }
     if ($pseFinancialInstitutionName != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::FINANCIAL_INSTITUTION_NAME, $pseFinancialInstitutionName);
     }
     if ($pseUserType != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::USER_TYPE, $pseUserType);
     }
     if ($pseReference1 != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::PSE_REFERENCE1, $pseReference1);
     }
     if ($pseReference2 != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::PSE_REFERENCE2, $pseReference2);
     }
     if ($pseReference3 != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::PSE_REFERENCE3, $pseReference3);
     }
     return $transaction;
 }