Skip to content

Commit fd82f74

Browse files
Add basic validation
This has the effect of disabling the paypal buttons until basic validate passes. The goal here is to prevent the scenario where someone clicks on the paypal button, authorizes the payment and then has to re-authorize due to the form submission not being accepted. We REALLY don't want to take their authorization until the form is correct. Note that there is an api we could use (ContributionPage.validate ['action' => 'create', 'id' => x] This attempt #98 was against the previous version of paypal smartbuttons but it demonstrates the api I couldn't find any evidence of being able to listen to when a form is valid - posts like this jquery-validation/jquery-validation#1996 suggest the method I used. The easiest way to test this is by submitting the form as an anonymous user without entering an email - you should not be able to launch the paypal form and there should be red writing next to the field. Paypal documentation on it https://developer.paypal.com/docs/checkout/integration-features/validation/?mark=validat#synchronous-validation Note the async mode is BAD - it launches the modal & does the check while loading. Avoid. Perhaps we could only render the paypal button when valid - like they suggest - but then switching back & forth with valid & invalid gets hard. Am on the fence about hiding Unfortunately without a core patch you will ALSO get an alert. I am proposing a core patch along side this which will suppress it in core. Really I think it would be best to put the message down by the paypal button (possibly hiding it) but because of the need to call it at the start it needs to be less nasty.
1 parent d5abce6 commit fd82f74

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

Metadata/js/omnipay_PaypalRest.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,27 @@
55

66
function renderPaypal() {
77
paypal.Buttons({
8+
9+
10+
onInit: function(data, actions) {
11+
// Set up the buttons.
12+
if (form.valid()) {
13+
actions.enable()
14+
}
15+
else {
16+
actions.disable();
17+
}
18+
19+
form.on('blur keyup change', 'input', function (event) {
20+
if (form.valid()) {
21+
actions.enable()
22+
}
23+
else {
24+
actions.disable();
25+
}
26+
});
27+
},
28+
829
createBillingAgreement: function (data, actions) {
930

1031
var frequencyInterval = $('#frequency_interval').val() || 1;
@@ -65,7 +86,7 @@
6586
}
6687

6788
var paypalScriptURL = 'https://www.paypal.com/sdk/js?client-id=' + CRM.vars.omnipay.client_id + '&currency=' + CRM.vars.omnipay.currency + '&commit=false&vault=true';
68-
CRM.loadScript(paypalScriptURL, false)
69-
.done(renderPaypal);
89+
CRM.loadScript(paypalScriptURL, false).done(renderPaypal);
90+
7091

7192
})(CRM.$);

info.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<url desc="Licensing">http://civicrm.org/licensing</url>
1616
</urls>
1717
<releaseDate>2019-07-07</releaseDate>
18-
<version>3.6</version>
18+
<version>3.7</version>
1919
<develStage>stable</develStage>
2020
<compatibility>
21-
<ver>5.13</ver>
21+
<ver>5.17</ver>
2222
</compatibility>
2323
<comments>This module integrates the omnipay library with CiviCRM. This release is for Omnipay 3.x and requires php 7.1. All new development will be here but 2.x series will continue to work.</comments>
2424
<civix>

omnipaymultiprocessor.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ function omnipaymultiprocessor_civicrm_alterSettingsFolders(&$metaDataFolders) {
101101

102102
function omnipaymultiprocessor_civicrm_preProcess($formName, &$form) {
103103
if ($formName === 'CRM_Contribute_Form_Contribution_Main') {
104+
$form->assign('isJsValidate', TRUE);
105+
CRM_Core_Resources::singleton()->addVars('form', ['suppressAlerts' => 1]);
104106
if (!empty($form->_values['is_recur'])) {
105107
$recurOptions = [
106108
'is_recur_interval' => $form->_values['is_recur_interval'],

0 commit comments

Comments
 (0)