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.
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)) {
$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;
}
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
}
}
+ /**
+ * 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.
}
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;
$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'])) {
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;
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) {
}
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;