From: adixon Date: Mon, 2 Feb 2015 21:11:39 +0000 (-0500) Subject: CRM-15714 CiviContribute convert validateCreditCard to validatePaymentInstrument X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=a479fe60be0c16f79b256ef190fa8fa744dda026;p=civicrm-core.git CRM-15714 CiviContribute convert validateCreditCard to validatePaymentInstrument The validateCreditCard function is too restrictive for both SWIPE and DirectDebit payment processors. Convert those calls to a new validatePaymentInstrument that only invokes validateCreditCard for credit card payment processors, and also allows SWIPE processors to override it. --- diff --git a/CRM/Contribute/Form/Contribution/Main.php b/CRM/Contribute/Form/Contribution/Main.php index 243daceaba..5ccaac7b18 100644 --- a/CRM/Contribute/Form/Contribution/Main.php +++ b/CRM/Contribute/Form/Contribution/Main.php @@ -1083,7 +1083,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu if (!empty($self->_paymentFields)) { CRM_Core_Form::validateMandatoryFields($self->_paymentFields, $fields, $errors); } - CRM_Core_Payment_Form::validateCreditCard($fields, $errors); + CRM_Core_Payment_Form::validatePaymentInstrument($fields['payment_processor'], $fields, $errors, $self); foreach (CRM_Contact_BAO_Contact::$_greetingTypes as $greeting) { if ($greetingType = CRM_Utils_Array::value($greeting, $fields)) { diff --git a/CRM/Contribute/Form/UpdateBilling.php b/CRM/Contribute/Form/UpdateBilling.php index aa7070cb08..9d2705d3c9 100644 --- a/CRM/Contribute/Form/UpdateBilling.php +++ b/CRM/Contribute/Form/UpdateBilling.php @@ -234,8 +234,8 @@ class CRM_Contribute_Form_UpdateBilling extends CRM_Core_Form { $errors = array(); CRM_Core_Form::validateMandatoryFields($self->_fields, $fields, $errors); - // make sure that credit card number and cvv are valid - CRM_Core_Payment_Form::validateCreditCard($fields, $errors); + // validate the payment instrument values (e.g. credit card number) + CRM_Core_Payment_Form::validatePaymentInstrument($self->_paymentProcessor['id'], $fields, $errors, $self); return empty($errors) ? TRUE : $errors; } diff --git a/CRM/Core/Payment.php b/CRM/Core/Payment.php index 899c837097..a6b6a03c47 100644 --- a/CRM/Core/Payment.php +++ b/CRM/Core/Payment.php @@ -171,6 +171,17 @@ abstract class CRM_Core_Payment { return FALSE; } + /** + * Default payment instrument validation + * Implement the usual Luhn algorithm via a static function in the CRM_Core_Payment_Form if it's a credit card + * Not a static function, because I need to check for payment_type + */ + public function validatePaymentInstrument($values, &$errors) { + if ($this->_paymentProcessor['payment_type'] == 1) { + CRM_Core_Payment_Form::validateCreditCard($values, $errors); + } + } + /** * Setter for the payment form that wants to use the processor * @deprecated diff --git a/CRM/Core/Payment/Form.php b/CRM/Core/Payment/Form.php index 78d5413742..d682e98002 100644 --- a/CRM/Core/Payment/Form.php +++ b/CRM/Core/Payment/Form.php @@ -316,6 +316,20 @@ class CRM_Core_Payment_Form { } } + /** + * Validate the payment instrument values before passing it to the payment processor + * We want this to be overrideable by the payment processor, and default to using + * this object's validCreditCard for credit cards (implemented as the default in the Payment class). + */ + public static function validatePaymentInstrument($payment_processor_id, $values, &$errors, $form) { + // ignore if we don't have a payment instrument to validate (e.g. backend payments) + if ($payment_processor_id > 0) { + $paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getPayment($payment_processor_id,'live'); + $payment = CRM_Core_Payment::singleton('live', $paymentProcessor, $form); + $payment->validatePaymentInstrument($values, $errors); + } + } + /** * The credit card pseudo constant results only the CC label, not the key ID * So we normalize the name to use it as a CSS class. diff --git a/CRM/Event/Cart/Form/Checkout/Payment.php b/CRM/Event/Cart/Form/Checkout/Payment.php index 7777e51750..b646e12909 100644 --- a/CRM/Event/Cart/Form/Checkout/Payment.php +++ b/CRM/Event/Cart/Form/Checkout/Payment.php @@ -398,8 +398,8 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart { } CRM_Core_Form::validateMandatoryFields($self->_fields, $fields, $errors); - // make sure that credit card number and cvv are valid - CRM_Core_Payment_Form::validateCreditCard($fields, $errors); + // validate payment instrument values (e.g. credit card number) + CRM_Core_Payment_Form::validatePaymentInstrument($self->_paymentProcessor['id'], $fields, $errors, $self); } return empty($errors) ? TRUE : $errors; diff --git a/CRM/Event/Form/Participant.php b/CRM/Event/Form/Participant.php index 3ee04fe61c..881ad5731d 100644 --- a/CRM/Event/Form/Participant.php +++ b/CRM/Event/Form/Participant.php @@ -814,8 +814,8 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment $errorMsg = array(); if (!empty($values['payment_processor_id'])) { - // make sure that credit card number and cvv are valid - CRM_Core_Payment_Form::validateCreditCard($values, $errorMsg); + // make sure that payment instrument values (e.g. credit card number and cvv) are valid + CRM_Core_Payment_Form::validatePaymentInstrument($values['payment_processor_id'], $values, $errorMsg, $self); } if (!empty($values['record_contribution'])) { diff --git a/CRM/Event/Form/Registration/AdditionalParticipant.php b/CRM/Event/Form/Registration/AdditionalParticipant.php index 90200122df..7eaa956eea 100644 --- a/CRM/Event/Form/Registration/AdditionalParticipant.php +++ b/CRM/Event/Form/Registration/AdditionalParticipant.php @@ -565,8 +565,9 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R CRM_Core_Form::validateMandatoryFields($self->_fields, $fields, $errors); - // make sure that credit card number and cvv are valid - CRM_Core_Payment_Form::validateCreditCard($self->_params[0], $errors); + // validate supplied payment instrument values (e.g. credit card number and cvv) + $payment_processor_id = $self->params[0]['payment_processor_id']; + CRM_Core_Payment_Form::validatePaymentInstrument($payment_processor_id, $self->_params[0], $errors, $self); if ($errors) { return FALSE; diff --git a/CRM/Event/Form/Registration/Register.php b/CRM/Event/Form/Registration/Register.php index 968ec60b33..0abef5da29 100644 --- a/CRM/Event/Form/Registration/Register.php +++ b/CRM/Event/Form/Registration/Register.php @@ -930,7 +930,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration { if (!empty($self->_paymentFields)) { CRM_Core_Form::validateMandatoryFields($self->_paymentFields, $fields, $errors); } - CRM_Core_Payment_Form::validateCreditCard($fields, $errors); + CRM_Core_Payment_Form::validatePaymentInstrument($self->_paymentProcessorID, $fields, $errors, $self); } foreach (CRM_Contact_BAO_Contact::$_greetingTypes as $greeting) { diff --git a/CRM/Member/Form/Membership.php b/CRM/Member/Form/Membership.php index 315efb07db..eea3547eec 100644 --- a/CRM/Member/Form/Membership.php +++ b/CRM/Member/Form/Membership.php @@ -859,8 +859,8 @@ WHERE id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )'; } if (!empty($params['payment_processor_id'])) { - // make sure that credit card number and cvv are valid - CRM_Core_Payment_Form::validateCreditCard($params, $errors); + // validate payment instrument (e.g. credit card number) + CRM_Core_Payment_Form::validatePaymentInstrument($params['payment_processor_id'], $params, $errors, $self); } $joinDate = NULL;