/**
  * Process payment by sending payment info to Paytrail with REST API.
  *
  * @param array $params name value pair of Payment processor data
  * @param string $component name of CiviCRM component that is using this Payment Processor (contribute or event)
  * @param string $merchantId Paytrail merchant id
  * @param string $merchantSecret Paytrail merchant secret
  * @return Verkkomaksut_Module_Rest_Result REST call result with redirect URL and token
  */
 public function processPayment(&$params, $component, $merchantId, $merchantSecret)
 {
     $this->paytrailConfig->setPaymentProcessorParams($params);
     if ($component != 'contribute' && $component != 'event') {
         CRM_Core_Error::fatal(ts('Component is invalid'));
     }
     // Create payment. Default Paytrail API mode is E1.
     $payment =& $this->createPaymentObject($params, $component);
     $payment->setLocale($this->paytrailConfig->get('locale'));
     // Send request to https://payment.verkkomaksut.fi with Merchant ID and Merchant secret
     $module = new Verkkomaksut_Module_Rest($merchantId, $merchantSecret);
     try {
         $result = $module->processPayment($payment);
     } catch (Verkkomaksut_Exception $e) {
         CRM_Core_Error::fatal("Error contacting Paytrail: " . $e->getMessage() . ". Order number: " . $params['invoiceID']);
         exit;
     }
     return $result;
 }
 /**
  * This method is handles the response that will be invoked (from PaytrailNotify.php) every time
  * a notification or request is sent by the Paytrail Server.
  */
 static function main()
 {
     require_once 'CRM/Utils/Request.php';
     $config = CRM_Core_Config::singleton();
     //Get payment info from civicrm_paytrail_payment_processor_invoice_data table. These are saved to table before payment.
     $invoiceID = $_GET["ORDER_NUMBER"];
     $invoiceData = self::readInvoiceData($invoiceID);
     $contributionPageCmsUrl = $invoiceData['contributionPageCmsUrl'] ?: '';
     $privateData['invoiceID'] = $invoiceData['invoice_id'];
     $privateData['contactID'] = $invoiceData['contact_id'];
     $privateData['contributionID'] = $invoiceData['contribution_id'];
     $privateData['contributionTypeID'] = $invoiceData['contribution_financial_type_id'];
     $privateData['eventID'] = $invoiceData['event_id'];
     $privateData['participantID'] = $invoiceData['participant_id'];
     $privateData['membershipID'] = $invoiceData['membership_id'];
     $privateData['amount'] = $invoiceData['amount'];
     $privateData['qfKey'] = $invoiceData['qfKey'];
     list($mode, $component, $paymentProcessorID, $duplicateTransaction) = self::getContext($privateData);
     $mode = $mode ? 'test' : 'live';
     $paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getPayment($paymentProcessorID, $mode);
     //Validate Paytrail result
     require_once "Verkkomaksut_Module_Rest.php";
     $merchantId = $paymentProcessor['user_name'];
     $merchantSecret = $paymentProcessor['password'];
     $module = new Verkkomaksut_Module_Rest($merchantId, $merchantSecret);
     if ($module->confirmPayment($_GET["ORDER_NUMBER"], $_GET["TIMESTAMP"], $_GET["PAID"], $_GET["METHOD"], $_GET["RETURN_AUTHCODE"])) {
         $success = true;
     } else {
         CRM_Core_Error::debug_log_message("Failure: Paytrail notify is incorrect");
         $success = false;
     }
     $finalUrlAction = $component == 'event' ? 'civicrm/event/register' : 'civicrm/contribute/transact';
     $finalUrlParams = array('qfKey' => $privateData['qfKey']);
     // Redirect our users to the correct url.
     if ($success) {
         // Success. Process the transaction.
         if ($duplicateTransaction == 0) {
             $ipn = self::singleton($mode, $component, $paymentProcessor);
             $amount = (double) $privateData['amount'];
             $transactionId = $_GET["ORDER_NUMBER"];
             $ipn->newOrderNotify($success, $privateData, $component, $amount, $transactionId);
         }
         $finalUrlParams['_qf_ThankYou_display'] = 1;
     } else {
         $finalUrlParams[$component == 'event' ? '_qf_Register_display' : '_qf_Main_display'] = 1;
         $finalUrlParams['cancel'] = 1;
     }
     if ($contributionPageCmsUrl) {
         $queryParams = array_merge(array('page' => 'CiviCRM', 'q' => $finalUrlAction), $finalUrlParams);
         $glue = strpos($contributionPageCmsUrl, '?') === FALSE ? '?' : '&';
         $finalUrl = $contributionPageCmsUrl . $glue . http_build_query($queryParams, null, '&');
         CRM_Utils_System::redirect($finalUrl);
     } else {
         CRM_Utils_System::redirect(CRM_Utils_System::url($finalUrlAction, $finalUrlParams, true, null, false, true));
     }
 }