From 3eecd5bcda69088fef467e0975b98d0c598927cd Mon Sep 17 00:00:00 2001 From: Matthew Wire Date: Mon, 29 Jan 2018 20:40:53 +0700 Subject: [PATCH] Check configuration of payment processors when saving config --- CRM/Admin/Form/PaymentProcessor.php | 13 ++++++++++++- Civi/Payment/System.php | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/CRM/Admin/Form/PaymentProcessor.php b/CRM/Admin/Form/PaymentProcessor.php index 64fd697ea8..b6ae84ac26 100644 --- a/CRM/Admin/Form/PaymentProcessor.php +++ b/CRM/Admin/Form/PaymentProcessor.php @@ -101,6 +101,7 @@ class CRM_Admin_Form_PaymentProcessor extends CRM_Admin_Form { $refreshURL .= "&civicrmDestination=$destination"; } + $this->refreshURL = $refreshURL; $this->assign('refreshURL', $refreshURL); $this->assign('is_recur', $this->_ppDAO->is_recur); @@ -385,7 +386,17 @@ class CRM_Admin_Form_PaymentProcessor extends CRM_Admin_Form { $this->updatePaymentProcessor($values, $domainID, FALSE); $this->updatePaymentProcessor($values, $domainID, TRUE); - CRM_Core_Session::setStatus(ts('Payment processor %1 has been saved.', array(1 => "{$values['name']}")), ts('Saved'), 'success'); + + $processor = civicrm_api3('payment_processor', 'getsingle', array('name' => $values['name'], 'is_test' => 0)); + $errors = Civi\Payment\System::singleton()->checkProcessorConfig($processor); + if ($errors) { + CRM_Core_Session::setStatus($errors, 'Payment processor configuration invalid', 'error'); + Civi::log()->error('Payment processor configuration invalid: ' . $errors); + CRM_Core_Session::singleton()->pushUserContext($this->refreshURL); + } + else { + CRM_Core_Session::setStatus(ts('Payment processor %1 has been saved.', array(1 => "{$values['name']}")), ts('Saved'), 'success'); + } } /** diff --git a/Civi/Payment/System.php b/Civi/Payment/System.php index e5327240f5..2ba7083c41 100644 --- a/Civi/Payment/System.php +++ b/Civi/Payment/System.php @@ -72,6 +72,34 @@ class System { return $this->cache[$id]; } + /** + * Execute checkConfig() on the payment processor Object. + * This function creates a new instance of the processor object and returns the output of checkConfig + * + * @param array $processor + * + * @return string|NULL + * + * @throws \CRM_Core_Exception + */ + public function checkProcessorConfig($processor) { + $ext = \CRM_Extension_System::singleton()->getMapper(); + if ($ext->isExtensionKey($processor['class_name'])) { + $paymentClass = $ext->keyToClass($processor['class_name'], 'payment'); + require_once $ext->classToPath($paymentClass); + } + else { + $paymentClass = 'CRM_Core_' . $processor['class_name']; + if (empty($paymentClass)) { + throw new \CRM_Core_Exception('no class provided'); + } + require_once str_replace('_', DIRECTORY_SEPARATOR, $paymentClass) . '.php'; + } + + $processorObject = new $paymentClass(!empty($processor['is_test']) ? 'test' : 'live', $processor); + return $processorObject->checkConfig(); + } + /** * Get payment processor by it's ID. * -- 2.25.1