diff --git a/CRM/Admin/Form/PaymentProcessor.php b/CRM/Admin/Form/PaymentProcessor.php
index 64fd697ea88a..b6ae84ac26e0 100644
--- a/CRM/Admin/Form/PaymentProcessor.php
+++ b/CRM/Admin/Form/PaymentProcessor.php
@@ -101,6 +101,7 @@ public function preProcess() {
$refreshURL .= "&civicrmDestination=$destination";
}
+ $this->refreshURL = $refreshURL;
$this->assign('refreshURL', $refreshURL);
$this->assign('is_recur', $this->_ppDAO->is_recur);
@@ -385,7 +386,17 @@ public function postProcess() {
$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 e5327240f5ca..2ba7083c41e2 100644
--- a/Civi/Payment/System.php
+++ b/Civi/Payment/System.php
@@ -72,6 +72,34 @@ public function getByProcessor($processor, $force = FALSE) {
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.
*