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;
}