/** * Validate PayPal transaction * * @param array $data * @param string $currency * @param Crowdfunding\Payment\Session $paymentSession * * @return array|null */ protected function validateData($data, $currency, $paymentSession) { $parentId = Joomla\Utilities\ArrayHelper::getValue($data, 'parent_txn_id', '', 'string'); if ($parentId !== '') { $transaction = new Crowdfunding\Transaction(JFactory::getDbo()); $transaction->load(array('txn_id' => $parentId)); $investorId = (int) $transaction->getInvestorId(); $projectId = (int) $transaction->getProjectId(); $rewardId = (int) $transaction->getRewardId(); } else { $investorId = (int) $paymentSession->getUserId(); $projectId = (int) $paymentSession->getProjectId(); $rewardId = $paymentSession->isAnonymous() ? 0 : (int) $paymentSession->getRewardId(); } $txnDate = Joomla\Utilities\ArrayHelper::getValue($data, 'payment_date'); $date = new JDate($txnDate); // Get additional information from transaction. $extraData = $this->prepareExtraData($data); // Prepare transaction data $transaction = array('investor_id' => $investorId, 'project_id' => $projectId, 'reward_id' => $rewardId, 'service_provider' => $this->serviceProvider, 'service_alias' => $this->serviceAlias, 'txn_id' => Joomla\Utilities\ArrayHelper::getValue($data, 'txn_id', '', 'string'), 'parent_txn_id' => $parentId, 'txn_amount' => Joomla\Utilities\ArrayHelper::getValue($data, 'mc_gross', 0, 'float'), 'txn_currency' => Joomla\Utilities\ArrayHelper::getValue($data, 'mc_currency', '', 'string'), 'txn_status' => JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'payment_status', '', 'string')), 'txn_date' => $date->toSql(), 'status_reason' => $this->getStatusReason($data), 'extra_data' => $extraData); // Check Project ID and Transaction ID if (!$transaction['project_id'] or !$transaction['txn_id']) { // Log data in the database $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_TRANSACTION_DATA'), $this->debugType, $transaction); return null; } // Check currency if (strcmp($transaction['txn_currency'], $currency) !== 0) { // Log data in the database $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_TRANSACTION_CURRENCY'), $this->debugType, array('TRANSACTION DATA' => $transaction, 'CURRENCY' => $currency)); return null; } // Check receiver $allowedReceivers = array(JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'business')), JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'receiver_email')), JString::strtolower(Joomla\Utilities\ArrayHelper::getValue($data, 'receiver_id'))); if ($this->params->get('paypal_sandbox', 1)) { $receiver = JString::strtolower(JString::trim($this->params->get('paypal_sandbox_business_name'))); } else { $receiver = JString::strtolower(JString::trim($this->params->get('paypal_business_name'))); } if (!in_array($receiver, $allowedReceivers, true)) { // Log data in the database $this->log->add(JText::_($this->textPrefix . '_ERROR_INVALID_RECEIVER'), $this->debugType, array('TRANSACTION DATA' => $data, 'RECEIVER' => $receiver, 'RECEIVER DATA' => $allowedReceivers)); return null; } return $transaction; }