You are here

function _uc_cybersource_post_charge in Ubercart 5

Same name and namespace in other branches
  1. 6.2 payment/uc_cybersource/uc_cybersource.module \_uc_cybersource_post_charge()
  2. 7.3 payment/uc_cybersource/uc_cybersource.module \_uc_cybersource_post_charge()
1 call to _uc_cybersource_post_charge()
uc_cybersource_charge in payment/uc_cybersource/uc_cybersource.module

File

payment/uc_cybersource/uc_cybersource.module, line 290
A module used for CyberSource's Silent Order POST method of payment.

Code

function _uc_cybersource_post_charge($order, $amount, $data, $cc_type, $country) {

  // Check for cURL support.
  if (!function_exists('curl_init')) {
    drupal_set_message(t('Cybersource requires cURL.  Please talk to your system administrator to get this configured.'));
    return array(
      'success' => FALSE,
    );
  }

  // Include the HOP.php per the module instructions.
  $hop = drupal_get_path('module', 'uc_cybersource') . '/HOP.php';
  if (!file_exists($hop)) {
    drupal_set_message(t('Silent Order POST requires the HOP.php provided by CyberSource.'));
    return array(
      'success' => FALSE,
    );
  }
  require_once $hop;
  $request = array(
    'billTo_firstName' => $order->billing_first_name,
    'billTo_lastName' => $order->billing_last_name,
    'billTo_street1' => $order->billing_street1,
    'billTo_city' => $order->billing_city,
    'billTo_country' => $country[0]['country_iso_code_2'],
    'billTo_state' => uc_get_zone_code($order->billing_zone),
    'billTo_postalCode' => $order->billing_postal_code,
    'billTo_email' => $order->primary_email,
    'card_accountNumber' => $order->payment_details['cc_number'],
    'card_cardType' => $cc_type,
    'card_expirationMonth' => $order->payment_details['cc_exp_month'],
    'card_expirationYear' => $order->payment_details['cc_exp_year'],
  );
  if (variable_get('uc_credit_cvv_enabled', TRUE)) {
    $request['card_cvNumber'] = $order->payment_details['cc_cvv'];
  }
  $currency = variable_get('uc_cybersource_currency', 'usd');
  $merchantID = getMerchantID();
  $timestamp = getmicrotime();
  $data = $merchantID . $amount . $currency . $timestamp;
  $pub = getPublicKey();
  $serialNumber = getSerialNumber();
  $pub_digest = hopHash($data, $pub);
  $request['amount'] = $amount;
  $request['currency'] = $currency;
  $request['merchantID'] = $merchantID;
  $request['orderNumber'] = $order_id;
  $request['orderPage_timestamp'] = $timestamp;
  $request['orderPage_ignoreAVS'] = variable_get('uc_cybersource_avs', 'true') == 'true' ? 'false' : 'true';
  $request['orderPage_signaturePublic'] = $pub_digest;
  $request['orderPage_version'] = '4';
  $request['orderPage_serialNumber'] = $serialNumber;
  $request['orderPage_transactionType'] = variable_get('uc_cybersource_transaction_type', 'sale');
  $data = '';
  while (list($key, $value) = each($request)) {
    $data .= $key . '=' . urlencode(ereg_replace(',', '', $value)) . '&';
  }
  $data = substr($data, 0, -1);
  if (variable_get('uc_cybersource_server', 'test') == 'test') {
    $url = 'https://orderpagetest.ic3.com/hop/ProcessOrder.do';
  }
  else {
    $url = 'https://orderpage.ic3.com/hop/ProcessOrder.do';
  }
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_VERBOSE, 0);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_NOPROGRESS, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
  $response = curl_exec($ch);
  if ($error = curl_error($ch)) {
    watchdog('uc_cybersource', $error, WATCHDOG_ERROR);
  }
  curl_close($ch);
  if (preg_match_all('`name=".+" value=".+"`', $response, $pairs) > 0) {
    for ($i = 0; $i < count($pairs[0]); $i++) {
      list($name, $value) = explode('" value="', substr($pairs[0][$i], 6, strlen($pairs[0][$i]) - 7));
      $nvp[$name] = $value;
    }

    // Create the order and payment ledger comments.
    $o_comment = t('<b>Credit card !type:</b> !amount<br /><b>Decision: @decision</b><br /><b>Reason:</b> !reason', array(
      '!type' => variable_get('uc_cybersource_transaction_type', 'sale'),
      '!amount' => uc_currency_format($nvp['orderAmount']),
      '@decision' => $nvp['decision'],
      '!reason' => _parse_cs_reason_code($nvp['reasonCode']),
    ));
    $p_comment = t('!id<br />!decision, Reason: !reason', array(
      '!id' => $nvp['orderPage_serialNumber'],
      '!decision' => $nvp['decision'],
      '!reason' => $nvp['reasonCode'],
    ));
    if (!empty($nvp['ccAuthReply_avsCode'])) {
      $o_comment .= t('<br /><b>AVS:</b> !avs', array(
        '!avs' => _parse_cs_avs_code($nvp['ccAuthReply_avsCode']),
      ));
      $p_comment .= t(', AVS: @avs', array(
        '@avs' => $nvp['ccAuthReply_avsCode'],
      ));
    }
    if (!empty($nvp['ccAuthReply_cvCode'])) {
      $o_comment .= t('<br /><b>CVV:</b> !cvv', array(
        '!cvv' => _parse_cs_cvv_code($nvp['ccAuthReply_cvCode']),
      ));
      $p_comment .= t(', CVV: @cvv', array(
        '@cvv' => $nvp['ccAuthReply_cvCode'],
      ));
    }
    uc_order_comment_save($order_id, $user->uid, $o_comment, 'admin');
    if ($nvp['decision'] == 'ACCEPT') {
      $result = array(
        'success' => TRUE,
        'comment' => $p_comment,
        'message' => $o_comment,
        'uid' => $user->uid,
      );
    }
    else {
      $result = array(
        'success' => FALSE,
        'comment' => $p_comment,
        'message' => $o_comment,
        'uid' => $user->uid,
      );
    }
  }
  else {
    $result = array(
      'success' => FALSE,
      'message' => t('No response returned from CyberSource.'),
    );
  }
  return $result;
}