/** * Handle the reception of notification from the payment gateway * * @param string $extensionName Name of the extension * @param string $ownerName Name of the owner * @param array $data Data to fill out Payment form * @param array &$logData Log data for payment api * * @return bool paid status */ public function handleCallback($extensionName, $ownerName, $data, &$logData) { $post = JFactory::getApplication()->input->post->getArray(); $postData = array(); // Read the post from PayPal system and add 'cmd' $postData[] = 'cmd=_notify-validate'; foreach ($post as $key => $value) { $value = urlencode(stripslashes($value)); $postData[] = "{$key}={$value}"; } $request = implode('&', $postData); $response = $this->getRequestFromGateway($request); if (strcmp($response, "VERIFIED") == 0) { /* Check the payment_status is Completed check that txn_id has not been previously processed check that receiver_email is your Primary PayPal email check that payment_amount/payment_currency are correct */ $payment = $this->getPaymentByExtensionOrderData($extensionName, $data); if ($post['mc_gross'] != $payment->amount_total) { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_ERROR_PRICE_MISMATCH', $extensionName, $this->paymentName, $payment->amount_total, $post['mc_gross']); RApiPaymentHelper::logToFile($this->paymentName, $extensionName, $data, $isValid = false, $statusText); $logData['status'] = RApiPaymentStatus::getStatusCreated(); $logData['message_text'] = $statusText; return false; } elseif ($post['mc_currency'] != $payment->currency) { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_ERROR_CURRENCY_MISMATCH', $extensionName, $this->paymentName, $payment->currency, $post['mc_currency']); RApiPaymentHelper::logToFile($this->paymentName, $extensionName, $data, $isValid = false, $statusText); $logData['status'] = RApiPaymentStatus::getStatusCreated(); $logData['message_text'] = $statusText; return false; } // We are clear to log successful payment log now // Paypal have very similar structure of Status response so we can actually get them directly $logData['status'] = RApiPaymentStatus::getStatus($post['payment_status']); if ($logData['status'] == RApiPaymentStatus::getStatusCompleted()) { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_SUCCESSFUL', $extensionName, $this->paymentName); } else { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_CALLBACK_STATUS', $extensionName, $logData['status'], $this->paymentName); } RApiPaymentHelper::logToFile($this->paymentName, $extensionName, $data, $isValid = true, $statusText); } elseif (strcmp($response, "INVALID") == 0) { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_ERROR_IN_PAYMENT_GATEWAY', $extensionName, $this->paymentName, 'INVALID IPN'); RApiPaymentHelper::logToFile($this->paymentName, $extensionName, $data, $isValid = false, $statusText); $logData['status'] = RApiPaymentStatus::getStatusCreated(); $logData['message_text'] = $statusText; return false; } else { $statusText = JText::sprintf('LIB_REDCORE_PAYMENT_ERROR_IN_PAYMENT_GATEWAY', $extensionName, $this->paymentName, 'HTTP ERROR'); RApiPaymentHelper::logToFile($this->paymentName, $extensionName, $data, $isValid = false, $statusText); $logData['status'] = RApiPaymentStatus::getStatusCreated(); $logData['message_text'] = $statusText; return false; } $logData['message_text'] = $statusText; $logData['currency'] = $payment->currency; $logData['amount'] = $payment->amount_total; $logData['transaction_id'] = $data['txn_id']; return true; }