/** * Overrides FieldPluginBase::render(). */ public function render(ResultRow $values) { // Initialize the encryption key and class. $key = uc_credit_encryption_key(); $crypt = new Encryption(); $data = unserialize($values->{$this->field_alias}); if (isset($data['cc_data'])) { $cc_data = $crypt->decrypt($key, $data['cc_data']); if (strpos($cc_data, ':') === FALSE) { $cc_data = base64_decode($cc_data); } $cc_data = unserialize($cc_data); if (isset($cc_data[$this->definition['cc field']])) { return $cc_data[$this->definition['cc field']]; } } }
/** * {@inheritdoc} */ public function cartProcess(OrderInterface $order, array $form, FormStateInterface $form_state) { $credit_config = \Drupal::config('uc_credit.settings'); if (!$form_state->hasValue(['panes', 'payment', 'details', 'cc_number'])) { return; } // Fetch the CC details from the $_POST directly. $cc_data = $form_state->getValue(['panes', 'payment', 'details']); $cc_data['cc_number'] = str_replace(' ', '', $cc_data['cc_number']); array_walk($cc_data, '\\Drupal\\Component\\Utility\\SafeMarkup::checkPlain'); // Recover cached CC data in // $form_state->getValue(['panes', 'payment', 'details']) if it exists. if ($form_state->hasValue(['panes', 'payment', 'details', 'payment_details_data'])) { $cache = uc_credit_cache('save', $form_state->getValue(['panes', 'payment', 'details', 'payment_details_data'])); } // Account for partial CC numbers when masked by the system. if (substr($cc_data['cc_number'], 0, strlen(t('(Last4)'))) == t('(Last4)')) { // Recover the number from the encrypted data in the form if truncated. if (isset($cache['cc_number'])) { $cc_data['cc_number'] = $cache['cc_number']; } else { $cc_data['cc_number'] = ''; } } // Account for masked CVV numbers. if (!empty($cc_data['cc_cvv']) && $cc_data['cc_cvv'] == str_repeat('-', strlen($cc_data['cc_cvv']))) { // Recover the number from the encrypted data in $_POST if truncated. if (isset($cache['cc_cvv'])) { $cc_data['cc_cvv'] = $cache['cc_cvv']; } else { $cc_data['cc_cvv'] = ''; } } // Go ahead and put the CC data in the payment details array. $order->payment_details = $cc_data; // Default our value for validation. $return = TRUE; // Make sure an owner value was entered. if ($credit_config->get('uc_credit_owner_enabled') && empty($cc_data['cc_owner'])) { $form_state->setErrorByName('panes][payment][details][cc_owner', t('Enter the owner name as it appears on the card.')); $return = FALSE; } // Validate the CC number if that's turned on/check for non-digits. if ($credit_config->get('uc_credit_validate_numbers') && !_uc_credit_valid_card_number($cc_data['cc_number']) || !ctype_digit($cc_data['cc_number'])) { $form_state->setErrorByName('panes][payment][details][cc_number', t('You have entered an invalid credit card number.')); $return = FALSE; } // Validate the start date (if entered). if ($credit_config->get('uc_credit_start_enabled') && !_uc_credit_valid_card_start($cc_data['cc_start_month'], $cc_data['cc_start_year'])) { $form_state->setErrorByName('panes][payment][details][cc_start_month', t('The start date you entered is invalid.')); $form_state->setErrorByName('panes][payment][details][cc_start_year'); $return = FALSE; } // Validate the card expiration date. if (!_uc_credit_valid_card_expiration($cc_data['cc_exp_month'], $cc_data['cc_exp_year'])) { $form_state->setErrorByName('panes][payment][details][cc_exp_month', t('The credit card you entered has expired.')); $form_state->setErrorByName('panes][payment][details][cc_exp_year'); $return = FALSE; } // Validate the issue number (if entered). With issue numbers, '01' is // different from '1', but is_numeric() is still appropriate. if ($credit_config->get('uc_credit_issue_enabled') && !_uc_credit_valid_card_issue($cc_data['cc_issue'])) { $form_state->setErrorByName('panes][payment][details][cc_issue', t('The issue number you entered is invalid.')); $return = FALSE; } // Validate the CVV number if enabled. if ($credit_config->get('uc_credit_cvv_enabled') && !_uc_credit_valid_cvv($cc_data['cc_cvv'])) { $form_state->setErrorByName('panes][payment][details][cc_cvv', t('You have entered an invalid CVV number.')); $return = FALSE; } // Validate the bank name if enabled. if ($credit_config->get('uc_credit_bank_enabled') && empty($cc_data['cc_bank'])) { $form_state->setErrorByName('panes][payment][details][cc_bank', t('You must enter the issuing bank for that card.')); $return = FALSE; } // Initialize the encryption key and class. $key = uc_credit_encryption_key(); $crypt = new Encryption(); // Store the encrypted details in the session for the next pageload. // We are using base64_encode() because the encrypt function works with a // limited set of characters, not supporting the full Unicode character // set or even extended ASCII characters that may be present. // base64_encode() converts everything to a subset of ASCII, ensuring that // the encryption algorithm does not mangle names. $_SESSION['sescrd'] = $crypt->encrypt($key, base64_encode(serialize($order->payment_details))); // Log any errors to the watchdog. uc_store_encryption_errors($crypt, 'uc_credit'); // If we're going to the review screen, set a variable that lets us know // we're paying by CC. if ($return) { $_SESSION['cc_pay'] = TRUE; } return $return; }