Zen Cart Logo
Forums / Addon Payment Modules / VoicePay - Voice Commerce plug in, slight problem

VoicePay - Voice Commerce plug in, slight problem

Locked

Views: 1,434

Results 1 to 4 of 4
This thread is locked. New replies are disabled.
13 Aug 2010, 4:35 PM
#1
justrimless avatar

justrimless

Zen Follower

Join Date:
Aug 2006
Posts:
127
Plugin Contributions:
0

VoicePay - Voice Commerce plug in, slight problem

Hi,
I have installed a plug in from Voice Pay.
It's API (?) in that I enter the card details on our site and they process the payment in the background.

When I make a purchase the page says 'done' but is blank. The payment shows up in my VoicePay account but the order does not show in my ZenCart.

Has anyone set up VoicePay? There is an 'integration' area in the control panel, do I need to be doing something in there?

Is it something to do with 'callbacks'?

Ta,
Rick

13 Aug 2010, 7:02 PM
#2
justrimless avatar

justrimless

Zen Follower

Join Date:
Aug 2006
Posts:
127
Plugin Contributions:
0

Re: VoicePay - Voice Commerce plug in, slight problem

Looking at what is happening, the address bar needs to have

/index.php?main_page=checkout_process&response=1

for the transaction to report as successful.

The file dealing with the payment process is below.

<?php

  class gateway_services_cc {
    var $code, $title, $description, $enabled;

// class constructor
    function gateway_services_cc() {
      global $order;

      $this->code = 'gateway_services_cc';
      $this->title = MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_TITLE;
      $this->public_title = MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_PUBLIC_TITLE;
      $this->description = MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_DESCRIPTION;
      $this->enabled = ((MODULE_PAYMENT_GATEWAY_SERVICES_CC_STATUS == 'True') ? true : false);
      $this->sort_order = MODULE_PAYMENT_GATEWAY_SERVICES_CC_SORT_ORDER;

      if ((int)MODULE_PAYMENT_GATEWAY_SERVICES_CC_ORDER_STATUS_ID > 0) {
        $this->order_status = MODULE_PAYMENT_GATEWAY_SERVICES_CC_ORDER_STATUS_ID;
      }

      if (is_object($order)) $this->update_status();

      $this->form_action_url = base64_decode('aHR0cHM6Ly9zZWN1cmUubmV0d29ya21lcmNoYW50cy5jb20vZ3cvYXBpL3RyYW5zYWN0LnBocA==');
    }

// class methods
    function update_status() {
      global $order;
    }

    function javascript_validation() {
      $js = '  if (payment_value == "' . $this->code . '") {' . "\n" .
            '    var cc_owner = document.checkout_payment.gateway_services_cc_cc_owner.value;' . "\n" .
            '    var cc_number = document.checkout_payment.gateway_services_cc_cc_number.value;' . "\n" .
            '    if (cc_owner == "" || cc_owner.length < ' . CC_OWNER_MIN_LENGTH . ') {' . "\n" .
            '      error_message = error_message + "' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_JS_CC_OWNER . '";' . "\n" .
            '      error = 1;' . "\n" .
            '    }' . "\n" .
            '    if (cc_number == "" || cc_number.length < ' . CC_NUMBER_MIN_LENGTH . ') {' . "\n" .
            '      error_message = error_message + "' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_JS_CC_NUMBER . '";' . "\n" .
            '      error = 1;' . "\n" .
            '    }' . "\n";

      if (MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Required') {
          $js.= '    var cc_csc = document.checkout_payment.gateway_services_cc_cc_csc.value;' . "\n" .
                '    if (cc_csc == "" || (cc_csc.length != 3 && cc_csc.length != 4)) {' . "\n" .
                '      error_message = error_message + "' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_JS_CSC . '";' . "\n" .
                '      error = 1;' . "\n" .
                '    }' . "\n";
      } else if (MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Optional') {
          $js.= '    var cc_csc = document.checkout_payment.gateway_services_cc_cc_csc.value;' . "\n" .
                '    if (cc_csc != "" && cc_csc.length != 3 && cc_csc.length != 4) {' . "\n" .
                '      error_message = error_message + "' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_JS_CSC . '";' . "\n" .
                '      error = 1;' . "\n" .
                '    }' . "\n";
      }

      $js.= '  }' . "\n";

      return $js;
    }

    function selection() {
      global $order;

      for ($i=1; $i<13; $i++) {
        $expires_month[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
      }

      $today = getdate();
      for ($i=$today['year']; $i < $today['year']+10; $i++) {
        $expires_year[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
      }
      $selection = array('id' => $this->code,
                         'module' => $this->public_title,
                         'fields' => array(array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_OWNER,
                                                 'field' => zen_draw_input_field('gateway_services_cc_cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
                                           array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_NUMBER,
                                                 'field' => zen_draw_input_field('gateway_services_cc_cc_number')),
                                           array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_EXPIRES,
                                                 'field' => zen_draw_pull_down_menu('gateway_services_cc_cc_expires_month', $expires_month) . ' ' . zen_draw_pull_down_menu('gateway_services_cc_cc_expires_year', $expires_year))));

      if (MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Required' ||
          MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Optional' ) {


        $selection['fields'][] = array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CARD_SECURITY_CODE,
                                       'field' => zen_draw_input_field('gateway_services_cc_cc_csc', '', 'size="4" maxlength="4"') . ' <small>' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CSC_DESCRIPTION . '</small>');

      }

      return $selection;
    }

    function pre_confirmation_check() {
      global $_POST;

      include(DIR_WS_CLASSES . 'cc_validation.php');

      $cc_validation = new cc_validation();
      $result = @$cc_validation->validate($_POST['gateway_services_cc_cc_number'], $_POST['gateway_services_cc_cc_expires_month'], $_POST['gateway_services_cc_cc_expires_year'], $_POST['gateway_services_cc_cc_csc']);
      $error = '';
      switch ($result) {
        case -1:
          $error = sprintf(TEXT_CCVAL_ERROR_UNKNOWN_CARD, substr($cc_validation->cc_number, 0, 4));
          break;
        case -2:
        case -3:
        case -4:
          $error = TEXT_CCVAL_ERROR_INVALID_DATE;
          break;
        case -5:
          $error = MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_ERROR_CSC;
          break;
        case false:
          $error = TEXT_CCVAL_ERROR_INVALID_NUMBER;
          break;
      }

      if ( ($result == false) || ($result < 1) ) {
        $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode($error) . '&gateway_services_cc_cc_owner=' . urlencode($_POST['gateway_services_cc_cc_owner']) . '&gateway_services_cc_cc_expires_month=' . $_POST['gateway_services_cc_cc_expires_month'] . '&gateway_services_cc_cc_expires_year=' . $_POST['gateway_services_cc_cc_expires_year'] . '&gateway_services_cc_cc_csc=' . $_POST['gateway_services_cc_cc_csc'];

        zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
      }

      if ( MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Required' ||
          (MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION == 'Optional' && $_POST['gateway_services_cc_cc_csc']!="") ) {
        if ((strlen(trim($_POST['gateway_services_cc_cc_csc']))!=4 && $cc_validation->cc_type=='American Express') || (strlen(trim($_POST['gateway_services_cc_cc_csc']))!=3 && $cc_validation->cc_type!='American Express')) {
            $payment_error_return = 'payment_error=' . $this->code . '&error=' . MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_ERROR_CSC . '&gateway_services_cc_cc_number=' . urlencode($_POST['gateway_services_cc_cc_number']) . '&gateway_services_cc_cc_owner=' . urlencode($_POST['gateway_services_cc_cc_owner']) . '&gateway_services_cc_cc_expires_month=' . $_POST['gateway_services_cc_cc_expires_month'] . '&gateway_services_cc_cc_expires_year=' . $_POST['gateway_services_cc_cc_expires_year'] . '&gateway_services_cc_cc_csc=' . urlencode($_POST['gateway_services_cc_cc_csc']);
            zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
        }
      }

      $this->cc_card_type = $cc_validation->cc_type;
      $this->cc_card_number = $cc_validation->cc_number;
      $this->cc_expiry_month = $cc_validation->cc_expiry_month;
      $this->cc_expiry_year = $cc_validation->cc_expiry_year;
      $this->cc_csc = $_POST['gateway_services_cc_cc_csc'];
    }

    function confirmation() {
      global $_POST;

      $confirmation = array('title' => $this->public_title . ': ' . $this->cc_card_type,
                            'fields' => array(array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_OWNER,
                                                    'field' => $_POST['gateway_services_cc_cc_owner']),
                                              array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_NUMBER,
                                                    'field' => substr($this->cc_card_number, 0, 4) . str_repeat('X', (strlen($this->cc_card_number) - 8)) . substr($this->cc_card_number, -4)),
                                              array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CREDIT_CARD_EXPIRES,
                                                    'field' => strftime('%B, %Y', mktime(0,0,0,$_POST['gateway_services_cc_cc_expires_month'], 1, '20' . $_POST['gateway_services_cc_cc_expires_year']))),
                                              array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_CARD_SECURITY_CODE,
                                                    'field' => str_repeat('X', strlen($this->cc_csc))),
                                              ));

      return $confirmation;
    }

    function process_button() {
      global $order, $customer_id;

      if (MODULE_PAYMENT_GATEWAY_SERVICES_CC_TXN_OPTION=='Authorization only') {
        $type = 'auth';
      } else {
        $type = 'sale';
      }

      $serverTZ = getenv("TZ");
      if (empty($serverTZ)) {
          $serverTZ = ini_get('date.timezone');
      }
      putenv("TZ=UTC");
      $transaction_time = date("YmdHis",time());
      if (!empty($serverTZ)) {
         putenv("TZ=".$serverTZ);
      }

      $product_string = '';
      $hash_string = md5("|".number_format($order->info['total'], 2).'|'.$transaction_time.'|'.MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEY);
      foreach ($order->products as $key => $infoArray) {
          $product_string .= zen_draw_hidden_field('product_quantity_'.($key+1), $infoArray['qty']) .
                     zen_draw_hidden_field('product_amount_'.($key+1), $infoArray['final_price']) .
                     zen_draw_hidden_field('product_sku_'.($key+1), $infoArray['model'] ? $infoArray['model'] : $infoArray['name']);
          if (count($infoArray['attributes'])>0) {
              $description_string = $infoArray['model'] ? 'Name: '.$infoArray['name'].'; ' : '';
              for ($a=0; $a<count($infoArray['attributes']);$a++) {
                  $description_string .= $infoArray['attributes'][$a]['option']. ': ' .$infoArray['attributes'][$a]['value'] . '; ';
              }
              $product_string .= zen_draw_hidden_field('product_description_'.($key+1), substr($description_string, 0, -2));
          }
      }

      $process_button_string = zen_draw_hidden_field('key_id', MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEYID) .
                               zen_draw_hidden_field('ccnumber', $this->cc_card_number) .
                               zen_draw_hidden_field('ccexp', $this->cc_expiry_month . substr($this->cc_expiry_year, -2)) .
                               zen_draw_hidden_field('cvv', $this->cc_csc) .
                               zen_draw_hidden_field('amount', number_format($order->info['total'], 2)) .
                               zen_draw_hidden_field('tax', number_format($order->info['tax'], 2)) .
                               zen_draw_hidden_field('shipping', number_format($order->info['shipping_cost'], 2)) .
                               zen_draw_hidden_field('redirect', zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', true)) .
                               zen_draw_hidden_field('type', $type) .
                               zen_draw_hidden_field('customerid', $customer_id) .
                               zen_draw_hidden_field('firstname', $order->billing['firstname']) .
                               zen_draw_hidden_field('lastname', $order->billing['lastname']) .
                               zen_draw_hidden_field('address1', $order->billing['street_address']) .
                               zen_draw_hidden_field('city', $order->billing['city']) .
                               zen_draw_hidden_field('state', $order->billing['state']) .
                               zen_draw_hidden_field('zip', $order->billing['postcode']) .
                               zen_draw_hidden_field('country', $order->billing['country']['title']) .
                               zen_draw_hidden_field('phone', $order->customer['telephone']) .
                               zen_draw_hidden_field('email', $order->customer['email_address']) .
                               zen_draw_hidden_field('shipping_firstname', $order->delivery['firstname']) .
                               zen_draw_hidden_field('shipping_lastname', $order->delivery['lastname']) .
                               zen_draw_hidden_field('shipping_address1', $order->delivery['street_address']) .
                               zen_draw_hidden_field('shipping_city', $order->delivery['city']) .
                               zen_draw_hidden_field('shipping_state', $order->delivery['state']) .
                               zen_draw_hidden_field('shipping_zip', $order->delivery['postcode']) .
                               zen_draw_hidden_field('shipping_country', $order->delivery['country']['title']) .
                               zen_draw_hidden_field('currency', $order->info['currency']) .
                               zen_draw_hidden_field('ipaddress', $_SERVER['REMOTE_ADDR']) .
                               zen_draw_hidden_field('hash', $hash_string) .
                               zen_draw_hidden_field('time', $transaction_time) .
                               $product_string .
                               zen_draw_hidden_field(zen_session_name(), zen_session_id());

      return $process_button_string;
    }

    function before_process() {

      if ($_GET['response'] == '1') return;
      if ($_GET['response'] == '2') {
        zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_DECLINED_MESSAGE), 'SSL', true, false));
      }
      // Code 3 is an error - but anything else is an error too (IMHO)
        zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_ERROR_MESSAGE), 'SSL', true, false));
    }

    function after_process() {
      return false;
    }

    function get_error() {

      $error = array('title' => MODULE_PAYMENT_GATEWAY_SERVICES_CC_TEXT_ERROR,
                     'error' => stripslashes(urldecode($_GET['error'])));

      return $error;
    }

    function check() {
        global $db;
      if (!isset($this->_check)) {
        $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_STATUS'");
        $this->_check = $check_query->RecordCount();
      }
      return $this->_check;
    }

    function install() {
        global $db;
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Credit Card Payment Module', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_STATUS', 'True', 'Do you want to accept Credit Card payments?', '6', '0', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Key ID', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEYID', '449510', 'The security key id used for the gateway service', '6', '0', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Key', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEY', '\!b2#I/wu%)4_tUdpAxO|GDWW?20:V.w', 'The security key used for the gateway service', '6', '0', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('CSC Option', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION', 'Hidden', 'Set how you want to handle the card security code (commonly known as CVV)', '6', '0', 'zen_cfg_select_option(array(\'Hidden\', \'Optional\', \'Required\'), ', now())");
        $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Type', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_TXN_OPTION', 'Sale', 'Set how you want to process order transactions', '6', '0', 'zen_cfg_select_option(array(\'Sale\', \'Authorization only\'), ', now())");
    }

    function remove() {
      global $db;
      $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }

    function keys() {
      return array('MODULE_PAYMENT_GATEWAY_SERVICES_CC_STATUS', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEYID', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_KEY', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_ORDER_STATUS_ID', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_SORT_ORDER', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_CSC_OPTION', 'MODULE_PAYMENT_GATEWAY_SERVICES_CC_TXN_OPTION');
    }
  }

Any input appreciated.

24 Aug 2010, 8:06 AM
#3
numinix avatar

numinix

Totally Zenned

Join Date:
Apr 2007
Location:
Vancouver, Canada
Posts:
1,566
Plugin Contributions:
58

Re: VoicePay - Voice Commerce plug in, slight problem

We're getting the blank page too after upgrading to 1.3.9. What version are you using?

There is no PHP error.

24 Aug 2010, 9:08 AM
#4
justrimless avatar

justrimless

Zen Follower

Join Date:
Aug 2006
Posts:
127
Plugin Contributions:
0

Re: VoicePay - Voice Commerce plug in, slight problem

We are running 1.3.7

We ended up making moderations to the authorize.net (AIM) module by changing the authorizenet_aim.php file to point at the correct address.
If you do this you will need different login details, the support at Voice Pay are prompt and helpful, i'd drop them an email.