You are here

function _commerce_amex_process_transaction in Commerce American Express Payment Gateway (Amex) 7

Parameters

unknown $order:

unknown $transaction:

string $use3Dsecure:

Return value

unknown

2 calls to _commerce_amex_process_transaction()
commerce_amex_3d_secure_callback in ./commerce_amex.module
Process callback response from merchant server
commerce_amex_hosted_redirect_form_submit in ./commerce_amex.module
Payment method callback: redirect form submit.

File

./commerce_amex.module, line 1529
Implements American Express payment gateway for use in Drupal Commerce.

Code

function _commerce_amex_process_transaction($order, $transaction, $use3Dsecure = FALSE) {

  // Get the payment method.
  $instance_id = $transaction->instance_id;
  $payment_method = commerce_payment_method_instance_load($instance_id);

  // Format order total for transaction.
  $amount = commerce_currency_amount_to_decimal($transaction->amount, $transaction->currency_code);
  $order_amount = number_format($amount, 2, '.', '');
  $data = new stdClass();
  $data->apiOperation = $payment_method['settings']['txn_type'];

  // Drupal Commerce Solution ID.
  $data->partnerSolutionId = '3304010';
  $data->sourceOfFunds['session'] = $transaction->remote_id;
  if ($transaction->data['owner']) {
    $data->sourceOfFunds['provided']['card']['holder']['lastName'] = $transaction->data['owner'];
  }
  if (isset($transaction->data['cardonfile_selected']) && ($cardonfile = commerce_cardonfile_load($transaction->data['cardonfile_selected']))) {
    $data->sourceOfFunds['token'] = $cardonfile->remote_id;
    $data->sourceOfFunds['provided']['card']['holder']['lastName'] = $cardonfile->card_name;
  }
  $data->sourceOfFunds['type'] = 'CARD';
  $data->transaction['amount'] = $order_amount;
  $data->transaction['currency'] = $transaction->currency_code;
  $data->transaction['reference'] = $transaction->transaction_id;
  if (isset($payment_method['settings']['continuous']) && $payment_method['settings']['continuous']) {
    $data->transaction['frequency'] = 'RECURRING';
  }
  if ($use3Dsecure) {
    $data->{'3DSecureId'} = $transaction->transaction_id;
  }
  $data->order['reference'] = $order->order_id;

  // Add the addresses to the data object.
  $data = _commerce_amax_add_addresses($data, $order);
  $url = $payment_method['settings']['txn_url'] . AMEX_TXN_PATH . $payment_method['settings']['merchant_id'] . '/order/' . (10000000000 + $transaction->transaction_id) . '/transaction/' . $transaction->transaction_id;
  $result = _commerce_amex_put_request($url, $payment_method['settings']['merchant_id'], $payment_method['settings']['password'], $data);
  $transaction->payload = $result;
  switch ($result->result) {
    case 'SUCCESS':
      if (isset($result->response->risk->gatewayCode) && $result->response->risk->gatewayCode == 'REVIEW') {
        $transaction->status = COMMERCE_PAYMENT_STATUS_AMEX_REVIEW;
        $transaction->remote_status = $result->response->risk->gatewayCode;
        $transaction->message = l(t('Visit Amex to Review'), $payment_method['settings']['txn_url'] . '/ma');
      }
      else {
        switch ($payment_method['settings']['txn_type']) {
          case AMEX_OP_AUTH:
            $transaction->status = COMMERCE_PAYMENT_STATUS_PENDING;
            break;
          case AMEX_OP_PAY:
            $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS;
        }
        $transaction->remote_status = $result->response->gatewayCode;
        $transaction->message = $result->response->acquirerMessage;
      }
      drupal_set_message(t('Transaction was processed succesfully'));
      if (isset($transaction->data['cardonfile_store']) && $transaction->data['cardonfile_store']) {
        commerce_amex_cardonfile_save($order, $payment_method, $transaction);
      }
      break;
    case 'PENDING':
      $transaction->status = COMMERCE_PAYMENT_STATUS_PENDING;
      $transaction->remote_status = $result->response->gatewayCode;
      $transaction->message = $result->response->acquirerMessage;
      drupal_set_message(t('Transaction pending'));
      break;
    case 'FAILURE':
      $transaction->status = COMMERCE_PAYMENT_STATUS_FAILURE;
      $transaction->remote_status = $result->response->gatewayCode;
      $transaction->message = $result->response->gatewayCode;
      drupal_set_message(t('%message Your credit/debit card was not charged. Please try again later.', array(
        '%message' => $transaction->message,
      )), 'warning');
      break;
    case 'UNKNOWN':
      drupal_set_message(t('There was a problem processing your transaction. Your credit/debit card was not charged. Please try again later.'), 'warning');
      break;
    case 'ERROR':
      $transaction = _commerce_amex_error_process($result, $transaction);
      drupal_set_message(t('There was a problem processing your transaction. Your credit/debit card was not charged. Please try again later.'), 'warning');
      commerce_payment_redirect_pane_previous_page($order);
      break;
  }
  commerce_payment_transaction_save($transaction);
  return $transaction;
}