You are here

private function WebformCivicrmPostProcess::submitIPNPayment in Webform CiviCRM Integration 8.5

Call IPN payment processor to redirect to payment site

1 call to WebformCivicrmPostProcess::submitIPNPayment()
WebformCivicrmPostProcess::postSave in src/WebformCivicrmPostProcess.php
Process webform submission after it is has been saved. Called by the following hooks:

File

src/WebformCivicrmPostProcess.php, line 2084
Front-end form validation and post-processing.

Class

WebformCivicrmPostProcess

Namespace

Drupal\webform_civicrm

Code

private function submitIPNPayment() {
  $utils = \Drupal::service('webform_civicrm.utils');
  $params = $this->data['contribution'][1]['contribution'][1];
  $processor_type = $utils
    ->wf_civicrm_api('payment_processor', 'getsingle', [
    'id' => $params['payment_processor_id'],
  ]);
  $paymentProcessor = \Civi\Payment\System::singleton()
    ->getById($params['payment_processor_id']);

  // Ideally we would pass the correct id for the test processor through but that seems not to be the
  // case so load it here.
  if (!empty($params['is_test'])) {
    $paymentProcessor = \Civi\Payment\System::singleton()
      ->getByName($processor_type['name'], TRUE);
  }

  // Add contact details to params (most processors want a first_name and last_name)
  $contact = $utils
    ->wf_civicrm_api('contact', 'getsingle', [
    'id' => $this->ent['contact'][1]['id'],
  ]);
  $params += $contact;
  $params['contributionID'] = $params['id'] = $this->ent['contribution'][1]['id'];

  // Generate a fake qfKey in case payment processor redirects to contribution thank-you page
  $params['qfKey'] = $this
    ->getQfKey();
  $params['contactID'] = $params['contact_id'];
  $params['currency'] = $params['currencyID'] = wf_crm_aval($this->data, "contribution:1:currency");
  $params['total_amount'] = round($this->totalContribution, 2);

  // Some processors want this one way, some want it the other
  $params['amount'] = $params['total_amount'];
  $params['financial_type_id'] = wf_crm_aval($this->data, 'contribution:1:contribution:1:financial_type_id');
  $params['source'] = $this->settings['new_contact_source'];
  $params['item_name'] = $params['description'] = t('Webform Payment: @title', [
    '@title' => $this->node
      ->label(),
  ]);
  if (method_exists($paymentProcessor, 'setSuccessUrl')) {
    $paymentProcessor
      ->setSuccessUrl($this
      ->getIpnRedirectUrl('success'));
    $paymentProcessor
      ->setCancelUrl($this
      ->getIpnRedirectUrl('cancel'));
  }
  try {
    $paymentProcessor
      ->doPayment($params);
  } catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
    drupal_set_message(ts('Payment approval failed with message: ') . $e
      ->getMessage(), 'error');
    \CRM_Utils_System::redirect($this
      ->getIpnRedirectUrl('cancel'));
  }
}