/**
  * Builds a create credit card token request
  *
  * @param parameters The parameters to be sent to the server
  * @param string $lang language of request see SupportedLanguages class
  * @return the request built
  */
 public static function buildGetCreditCardTokensRequest($parameters, $lang)
 {
     if (!isset($lang)) {
         $lang = PayU::$language;
     }
     $request = CommonRequestUtil::buildCommonRequest($lang, PayUCommands::GET_TOKENS);
     $creditCardTokenInformation = new stdClass();
     $creditCardTokenInformation->creditCardTokenId = CommonRequestUtil::getParameter($parameters, PayUParameters::TOKEN_ID);
     $creditCardTokenInformation->payerId = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_ID);
     $startDate = CommonRequestUtil::getParameter($parameters, PayUParameters::START_DATE);
     if ($startDate != null && CommonRequestUtil::isValidDate($startDate, PayUConfig::PAYU_DATE_FORMAT, PayUParameters::EXPIRATION_DATE)) {
         $creditCardTokenInformation->startDate = $startDate;
     }
     $endDate = CommonRequestUtil::getParameter($parameters, PayUParameters::END_DATE);
     if ($endDate != null && CommonRequestUtil::isValidDate($endDate, PayUConfig::PAYU_DATE_FORMAT, PayUParameters::EXPIRATION_DATE)) {
         $creditCardTokenInformation->endDate = $endDate;
     }
     $request->creditCardTokenInformation = $creditCardTokenInformation;
     return $request;
 }
 /**
  * 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;
 }
 /**
  * Build a payer object to be added to payment request
  * @param array $parameters
  * @return return a payer
  */
 private static function buildPayer($parameters)
 {
     $payer = new stdClass();
     $payer->fullName = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_NAME);
     $payer->emailAddress = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_EMAIL);
     $payer->cnpj = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_CNPJ);
     $payer->contactPhone = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_CONTACT_PHONE);
     $payer->dniNumber = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_DNI);
     $payer->businessName = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_BUSINESS_NAME);
     $payerBirthDay = CommonRequestUtil::getParameter($parameters, PayUParameters::PAYER_BIRTHDATE);
     if (isset($payerBirthDay) && CommonRequestUtil::isValidDate($payerBirthDay, PayUConfig::PAYU_DAY_FORMAT, PayUParameters::PAYER_BIRTHDATE)) {
         $payer->birthdate = $payerBirthDay;
     }
     $payer->billingAddress = RequestPaymentsUtil::buildAddress($parameters);
     return $payer;
 }