/**
  * 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::IP_ADDRESS) != null) {
         $transaction->ipAddress = CommonRequestUtil::getParameter($parameters, PayUParameters::IP_ADDRESS);
     }
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_COOKIE) != null) {
         $transaction->cookie = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_COOKIE);
     } else {
         $transaction->cookie = 'cookie_' . microtime();
     }
     $transaction->deviceSessionId = CommonRequestUtil::getParameter($parameters, PayUParameters::DEVICE_SESSION_ID);
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::USER_AGENT) != null) {
         $transaction->userAgent = CommonRequestUtil::getParameter($parameters, PayUParameters::USER_AGENT);
     } else {
         $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));
     }
     if (CommonRequestUtil::getParameter($parameters, PayUParameters::RESPONSE_URL) != null) {
         $transaction = RequestPaymentsUtil::addExtraParameter($transaction, PayUKeyMapName::RESPONSE_URL, CommonRequestUtil::getParameter($parameters, PayUParameters::RESPONSE_URL));
     }
     $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);
     // PSE extra parameters
     if ("PSE" == $paymentMethod) {
         $transaction = RequestPaymentsUtil::addPSEExtraParameters($transaction, $parameters);
     }
     $transaction->paymentMethod = $paymentMethod;
     $transaction->payer = RequestPaymentsUtil::buildPayer($parameters);
     $transaction->order = $order;
     return $transaction;
 }