diff --git a/CRM/Core/Payment/OmnipayMultiProcessor.php b/CRM/Core/Payment/OmnipayMultiProcessor.php index 077f24894..b7fd5cf04 100644 --- a/CRM/Core/Payment/OmnipayMultiProcessor.php +++ b/CRM/Core/Payment/OmnipayMultiProcessor.php @@ -283,7 +283,11 @@ public function buildForm(&$form) { 'paymentProcessorId' => $this->_paymentProcessor['id'], 'currency' => $form->getCurrency(), 'is_test' => $this->_is_test, 'title' => $form->getTitle(), + 'validate' => [], ]; + if (is_a($form, 'CRM_Contribute_Form_Contribution_Main')) { + $jsVariables['validate'] = ['entity' => 'ContributionPage', 'params' => ['id' => $form->_id, 'action' => 'submit']]; + } $clientSideCredentials = $this->getProcessorTypeMetadata('client_side_credentials'); if ($clientSideCredentials) { foreach ($clientSideCredentials as $key => $clientSideKey) { diff --git a/Metadata/js/omnipay_PaypalRest.js b/Metadata/js/omnipay_PaypalRest.js index b15f56659..be0897f6f 100644 --- a/Metadata/js/omnipay_PaypalRest.js +++ b/Metadata/js/omnipay_PaypalRest.js @@ -12,6 +12,7 @@ var paymentAmount = calculateTotalFee(); var isRecur = $('#is_recur').is(":checked"); var recurText = isRecur ? ' recurring' : ''; + var validate = CRM.vars.omnipay.validate; return new Promise(function (resolve, reject) { CRM.api3('PaymentProcessor', 'preapprove', { @@ -24,6 +25,7 @@ 'frequency_unit' : frequencyUnit, 'frequency_interval' : frequencyInterval, 'description' : CRM.vars.omnipay.title + ' ' + CRM.formatMoney(paymentAmount) + recurText, + 'validate' : validate, } ).then(function (result) { if (result['is_error'] === 1) { diff --git a/api/v3/PaymentProcessor/Preapprove.php b/api/v3/PaymentProcessor/Preapprove.php index 766799cc5..892bfa580 100644 --- a/api/v3/PaymentProcessor/Preapprove.php +++ b/api/v3/PaymentProcessor/Preapprove.php @@ -9,6 +9,10 @@ * @throws CiviCRM_API3_Exception */ function civicrm_api3_payment_processor_preapprove($params) { + if (!empty($params['validate'])) { + $validation = civicrm_api3($params['validate']['entity'], 'validate', array_merge($params['validate']['params'], $params)); + // @todo - do something clever if it fails + } $processor = Civi\Payment\System::singleton()->getById($params['payment_processor_id']); $processor->setPaymentProcessor(civicrm_api3('PaymentProcessor', 'getsingle', array('id' => $params['payment_processor_id']))); $result = $processor->doPreApproval($params); diff --git a/tests/phpunit/api/PreApproveTest.php b/tests/phpunit/api/PreApproveTest.php index 86e3c4a8c..e326a4d75 100644 --- a/tests/phpunit/api/PreApproveTest.php +++ b/tests/phpunit/api/PreApproveTest.php @@ -67,6 +67,7 @@ public function testPreApproveRest() { 'component' => 'contribute', 'version' => 3, 'email' => 'blah@example.org', + 'validate' => [] ])['values'][0]; $this->assertEquals('EC-9T988732661526452', $preApproval['token']);