$option = trim($pieces[0]);
        $value = trim($pieces[1]);
        $config_values[$option] = $value;
    }
}
fclose($fp);
$merchant_id = $config_values['CONFIG_MERCHANT_ID'];
$merchant_key = $config_values['CONFIG_MERCHANT_KEY'];
$server_type = $config_values['CONFIG_SERVER_TYPE'];
$currency = $config_values['CONFIG_CURRENCY'];
$Gresponse = new GoogleResponse($merchant_id, $merchant_key);
$Grequest = new GoogleRequest($merchant_id, $merchant_key, $server_type, $currency);
//serial-number
//Setup the log file
$Gresponse->SetLogFiles(RESPONSE_HANDLER_ERROR_LOG_FILE, RESPONSE_HANDLER_LOG_FILE, L_ALL);
$Grequest->SetLogFiles(RESPONSE_HANDLER_ERROR_LOG_FILE, RESPONSE_HANDLER_LOG_FILE, L_ALL);
//How to grab the serial number!!!!
/* $serial = $_POST["serial-number"];
  $Gresponse->log->LogResponse("serial:" . $serial);

  if ($serial != null) {
  $Grequest->SendNotificationRequest($serial);
  $Gresponse->SendAck($serial);
  return;
  } */
// Retrieve the XML sent in the HTTP POST request to the ResponseHandler
$xml_response = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : file_get_contents("php://input");
if (get_magic_quotes_gpc()) {
    $xml_response = stripslashes($xml_response);
}
list($root, $data) = $Gresponse->GetParsedXML($xml_response);
Esempio n. 2
0
function google_checkout_state_change($check_status, $status, $oID, $cust_notify, $notify_comments)
{
    global $db, $messageStack, $orders_statuses;
    define('API_CALLBACK_ERROR_LOG', DIR_FS_CATALOG . "/googlecheckout/logs/response_error.log");
    define('API_CALLBACK_MESSAGE_LOG', DIR_FS_CATALOG . "/googlecheckout/logs/response_message.log");
    include_once DIR_FS_CATALOG . '/includes/modules/payment/googlecheckout.php';
    include_once DIR_FS_CATALOG . '/googlecheckout/library/googlerequest.php';
    require_once DIR_FS_CATALOG . '/googlecheckout/library/configuration/google_configuration.php';
    require_once DIR_FS_CATALOG . '/googlecheckout/library/configuration/google_configuration_keys.php';
    $config = new GoogleConfigurationKeys();
    $googlecheckout = new googlecheckout();
    $google_request = new GoogleRequest($googlecheckout->merchantid, $googlecheckout->merchantkey, MODULE_PAYMENT_GOOGLECHECKOUT_MODE == 'https://sandbox.google.com/checkout/' ? "sandbox" : "production", DEFAULT_CURRENCY);
    $google_request->SetLogFiles(API_CALLBACK_ERROR_LOG, API_CALLBACK_MESSAGE_LOG);
    $google_answer = tep_db_fetch_array(tep_db_query("SELECT go.google_order_number, go.order_amount, o.customers_email_address, gc.buyer_id, o.customers_id\n                                  FROM " . $googlecheckout->table_order . " go \n                                  inner join " . TABLE_ORDERS . " o on go.orders_id = o.orders_id\n                                  inner join " . $googlecheckout->table_name . " gc on gc.customers_id = o.customers_id\n                                  WHERE go.orders_id = '" . (int) $oID . "'\n                                  group by o.customers_id order by o.orders_id desc"));
    $google_order = $google_answer['google_order_number'];
    $amount = $google_answer['order_amount'];
    // If status update is from Google New -> Google Processing on the Admin UI
    // this invokes the processing-order and charge-order commands
    // 1->Google New, 2-> Google Processing
    if ($check_status['orders_status'] == GC_STATE_NEW && $status == GC_STATE_PROCESSING && $google_order != '') {
        list($curl_status, ) = $google_request->SendChargeOrder($google_order, $amount);
        if ($curl_status != 200) {
            $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_CHARGE_ORDER, 'error');
        } else {
            $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_CHARGE_ORDER, 'success');
        }
        list($curl_status, ) = $google_request->SendProcessOrder($google_order);
        if ($curl_status != 200) {
            $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_PROCESS_ORDER, 'error');
        } else {
            $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_PROCESS_ORDER, 'success');
        }
    } else {
        if (($check_status['orders_status'] == GC_STATE_PROCESSING || $check_status['orders_status'] == GC_STATE_REFUNDED) && ($status == GC_STATE_SHIPPED || $status == GC_STATE_SHIPPED_REFUNDED) && $google_order != '') {
            $carrier = $tracking_no = "";
            // Add tracking Data
            if (isset($_POST['carrier_select']) && $_POST['carrier_select'] != 'select' && isset($_POST['tracking_number']) && !empty($_POST['tracking_number'])) {
                $carrier = $_POST['carrier_select'];
                $tracking_no = $_POST['tracking_number'];
                $comments = GOOGLECHECKOUT_STATE_STRING_TRACKING . "\n" . GOOGLECHECKOUT_STATE_STRING_TRACKING_CARRIER . $_POST['carrier_select'] . "\n" . GOOGLECHECKOUT_STATE_STRING_TRACKING_NUMBER . $_POST['tracking_number'] . "";
                tep_db_query("insert into " . TABLE_ORDERS_STATUS_HISTORY . "\n                  (orders_id, orders_status_id, date_added, customer_notified, comments)\n                  values ('" . (int) $oID . "',\n                  '" . tep_db_input($check_status['orders_status'] == GC_STATE_REFUNDED ? GC_STATE_SHIPPED_REFUNDED : GC_STATE_SHIPPED) . "',\n                  now(),\n                  '" . tep_db_input($cust_notify) . "',\n                  '" . tep_db_input($comments) . "')");
            }
            list($curl_status, ) = $google_request->SendDeliverOrder($google_order, $carrier, $tracking_no, $cust_notify == 1 ? "true" : "false");
            if ($curl_status != 200) {
                $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_DELIVER_ORDER, 'error');
            } else {
                $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_DELIVER_ORDER, 'success');
            }
            list($curl_status, ) = $google_request->SendArchiveOrder($google_order);
            if ($curl_status != 200) {
                $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_ARCHIVE_ORDER, 'error');
            } else {
                $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_ARCHIVE_ORDER, 'success');
            }
        } else {
            if ($check_status['orders_status'] != GC_STATE_CANCELED && $status == GC_STATE_CANCELED && $google_order != '') {
                if ($check_status['orders_status'] != GC_STATE_NEW) {
                    list($curl_status, ) = $google_request->SendRefundOrder($google_order, 0, GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED);
                    if ($curl_status != 200) {
                        $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_REFUND_ORDER, 'error');
                    } else {
                        $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_REFUND_ORDER, 'success');
                    }
                } else {
                    // Tell google witch is the OSC's internal order Number
                    list($curl_status, ) = $google_request->SendMerchantOrderNumber($google_order, $oID);
                    if ($curl_status != 200) {
                        $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_MERCHANT_ORDER_NUMBER, 'error');
                    } else {
                        $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_MERCHANT_ORDER_NUMBER, 'success');
                    }
                }
                // Is the order is not archive, I do it
                if ($check_status['orders_status'] != GC_STATE_SHIPPED && $check_status['orders_status'] != GC_STATE_SHIPPED_REFUNDED) {
                    list($curl_status, ) = $google_request->SendArchiveOrder($google_order);
                    if ($curl_status != 200) {
                        $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_ARCHIVE_ORDER, 'error');
                    } else {
                        $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_ARCHIVE_ORDER, 'success');
                    }
                }
                // Cancel the order
                list($curl_status, ) = $google_request->SendCancelOrder($google_order, GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED, $notify_comments);
                if ($curl_status != 200) {
                    $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_CANCEL_ORDER, 'error');
                } else {
                    $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_CANCEL_ORDER, 'success');
                }
            } else {
                if ($google_order != '' && $check_status['orders_status'] != $status) {
                    $statuses = array();
                    foreach ($orders_statuses as $status_array) {
                        $statuses[$status_array['id']] = $status_array['text'];
                    }
                    $messageStack->add_session(sprintf(GOOGLECHECKOUT_ERR_INVALID_STATE_TRANSITION, $statuses[$check_status['orders_status']], $statuses[$status], $statuses[$check_status['orders_status']]), 'error');
                }
            }
        }
    }
    // Send Buyer's message
    if ($cust_notify == 1 && isset($notify_comments) && !empty($notify_comments)) {
        $cust_notify_ok = '0';
        $use_cart_messaging = gc_get_configuration_value($config->useCartMessaging()) == 'True';
        if (!(strlen(htmlentities(strip_tags($notify_comments))) > GOOGLE_MESSAGE_LENGTH && $use_cart_messaging)) {
            list($curl_status, ) = $google_request->sendBuyerMessage($google_order, $notify_comments, "true");
            if ($curl_status != 200) {
                $messageStack->add_session(GOOGLECHECKOUT_ERR_SEND_MESSAGE_ORDER, 'error');
                $cust_notify_ok = '0';
            } else {
                $messageStack->add_session(GOOGLECHECKOUT_SUCCESS_SEND_MESSAGE_ORDER, 'success');
                $cust_notify_ok = '1';
            }
            if (strlen(htmlentities(strip_tags($notify_comments))) > GOOGLE_MESSAGE_LENGTH) {
                $messageStack->add_session(sprintf(GOOGLECHECKOUT_WARNING_CHUNK_MESSAGE, GOOGLE_MESSAGE_LENGTH), 'warning');
            }
        }
        // Cust notified
        return $cust_notify_ok;
    }
    // Cust notified
    return '0';
}
Esempio n. 3
0
/**
 * Process an <order-state-change-notification>.
 */
function process_order_state_change_notification($google_response, $google_checkout)
{
    list($root, $gc_data) = $google_response->GetParsedXML();
    $new_financial_state = $gc_data[$root]['new-financial-order-state']['VALUE'];
    $new_fulfillment_state = $gc_data[$root]['new-fulfillment-order-state']['VALUE'];
    $previous_financial_state = $gc_data[$root]['previous-financial-order-state']['VALUE'];
    $previous_fulfillment_state = $gc_data[$root]['previous-fulfillment-order-state']['VALUE'];
    $google_order_number = $gc_data[$root]['google-order-number']['VALUE'];
    $google_order = tep_db_fetch_array(tep_db_query("select orders_id from " . $google_checkout->table_order . " where google_order_number = '" . gc_make_sql_string($google_order_number) . "'"));
    // Handle change in financial state.
    $do_financial_state_update = false;
    if ($previous_financial_state != $new_financial_state) {
        switch ($new_financial_state) {
            case 'REVIEWING':
                break;
            case 'CHARGEABLE':
                $do_financial_state_update = true;
                $orders_status_id = GC_STATE_NEW;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_READY_CHARGE;
                $customer_notified = 0;
                break;
            case 'CHARGING':
                break;
            case 'CHARGED':
                $do_financial_state_update = true;
                $orders_status_id = GC_STATE_PROCESSING;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state;
                $customer_notified = 0;
                break;
            case 'PAYMENT-DECLINED':
                $do_financial_state_update = true;
                $orders_status_id = GC_STATE_NEW;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . GOOGLECHECKOUT_STATE_STRING_PAYMENT_DECLINED;
                $customer_notified = 1;
                break;
            case 'CANCELLED':
                $do_financial_state_update = true;
                $orders_status_id = GC_STATE_CANCELED;
                $customer_notified = 1;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED;
                break;
            case 'CANCELLED_BY_GOOGLE':
                $do_financial_state_update = true;
                $orders_status_id = GC_STATE_CANCELED;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED_BY_GOOG;
                $customer_notified = 1;
                break;
            default:
                break;
        }
    }
    // Change financial state in table if required.
    if ($do_financial_state_update) {
        $sql_data_array = array('orders_id' => $google_order['orders_id'], 'orders_status_id' => $orders_status_id, 'date_added' => 'now()', 'customer_notified' => $customer_notified, 'comments' => $comments);
        tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
        tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $orders_status_id . "' where orders_id = '" . gc_make_sql_integer($google_order['orders_id']) . "'");
    }
    // Handle change in fulfillment state.
    $do_fulfillment_state_update = false;
    if ($previous_fulfillment_state != $new_fulfillment_state) {
        switch ($new_fulfillment_state) {
            case 'NEW':
                break;
            case 'PROCESSING':
                $google_request = new GoogleRequest($google_checkout->merchantid, $google_checkout->merchantkey, sandbox_or_prod(), DEFAULT_CURRENCY);
                $google_request->SetLogFiles(API_CALLBACK_ERROR_LOG, API_CALLBACK_MESSAGE_LOG);
                $google_answer = tep_db_fetch_array(tep_db_query("SELECT go.google_order_number, go.order_amount, o.customers_email_address, gc.buyer_id, o.customers_id\n                FROM " . $google_checkout->table_order . " go\n                inner join " . TABLE_ORDERS . " o on go.orders_id = o.orders_id\n                inner join " . $google_checkout->table_name . " gc on gc.customers_id = o.customers_id\n                WHERE go.orders_id = '" . (int) $google_order['orders_id'] . "'\n                group by o.customers_id order by o.orders_id desc"));
                $first_order = tep_db_fetch_array(tep_db_query("SELECT customers_id, count(*) cant_orders\n                FROM  " . TABLE_ORDERS . "\n                WHERE customers_id = '" . $google_answer['customers_id'] . "'\n                group by customers_id"));
                // If this is the first time the buyer has used Google Checkout in the site,
                // send them their email and password(for the store).
                if ($first_order['cant_orders'] == 1) {
                    list($http_status_code, ) = $google_request->sendBuyerMessage($google_answer['google_order_number'], sprintf(GOOGLECHECKOUT_NEW_CREDENTIALS_MESSAGE, STORE_NAME, $google_answer['customers_email_address'], $google_answer['buyer_id']), "true", 2);
                    $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_state . "\n";
                    if ($http_status_code == 200) {
                        $comments .= GOOGLECHECKOUT_SUCCESS_SEND_NEW_USER_CREDENTIALS . "\n";
                        $customer_notified = '1';
                    } else {
                        $comments .= "\n" . GOOGLECHECKOUT_ERR_SEND_NEW_USER_CREDENTIALS . "\n";
                        $customer_notified = '0';
                    }
                    $comments .= "Messsage:\n" . sprintf(GOOGLECHECKOUT_NEW_CREDENTIALS_MESSAGE, STORE_NAME, $google_answer['customers_email_address'], $google_answer['buyer_id']);
                    $do_fulfillment_state_update = true;
                    $orders_status_id = GC_STATE_PROCESSING;
                }
                // Send the internal order number to Google.
                $google_request->SendMerchantOrderNumber($google_answer['google_order_number'], $google_order['orders_id'], 2);
                break;
            case 'DELIVERED':
                $check_status = tep_db_fetch_array(tep_db_query("select orders_status from " . TABLE_ORDERS . "\n            where orders_id = '" . $google_order['orders_id'] . "'"));
                switch ($check_status['orders_status']) {
                    case GC_STATE_REFUNDED:
                        $orders_status_id = GC_STATE_SHIPPED_REFUNDED;
                        break;
                    case GC_STATE_PROCESSING:
                    default:
                        $orders_status_id = GC_STATE_SHIPPED;
                        break;
                }
                $do_fulfillment_state_update = true;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_DELIVERED . "\n";
                $customer_notified = 1;
                break;
            case 'WILL_NOT_DELIVER':
                $do_fulfillment_state_update = false;
                $orders_status_id = GC_STATE_CANCELED;
                $customer_notified = 1;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $gc_data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED;
                break;
            default:
                break;
        }
    }
    // Change fulfillment state in table if required.
    if ($do_fulfillment_state_update) {
        $sql_data_array = array('orders_id' => $google_order['orders_id'], 'orders_status_id' => $orders_status_id, 'date_added' => 'now()', 'customer_notified' => $customer_notified, 'comments' => $comments);
        tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
        tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $orders_status_id . "' WHERE orders_id = '" . gc_make_sql_integer($google_order['orders_id']) . "'");
    }
    $google_response->SendAck();
}
Esempio n. 4
0
function process_order_state_change_notification($Gresponse, $googlepayment)
{
    global $db;
    list($root, $data) = $Gresponse->GetParsedXML();
    $new_financial_state = $data[$root]['new-financial-order-state']['VALUE'];
    $new_fulfillment_order = $data[$root]['new-fulfillment-order-state']['VALUE'];
    $previous_financial_state = $data[$root]['previous-financial-order-state']['VALUE'];
    $previous_fulfillment_order = $data[$root]['previous-fulfillment-order-state']['VALUE'];
    $google_order_number = $data[$root]['google-order-number']['VALUE'];
    $google_order = $db->Execute("SELECT orders_id from " . "" . $googlepayment->table_order . " where google_order_number = " . "'" . makeSqlString($google_order_number) . "'");
    $update = false;
    if ($previous_financial_state != $new_financial_state) {
        switch ($new_financial_state) {
            case 'REVIEWING':
                break;
            case 'CHARGEABLE':
                $update = true;
                $orders_status_id = GC_STATE_NEW;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_READY_CHARGE;
                $customer_notified = 0;
                break;
            case 'CHARGING':
                break;
            case 'CHARGED':
                $update = true;
                $orders_status_id = GC_STATE_PROCESSING;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state;
                $customer_notified = 0;
                break;
            case 'PAYMENT-DECLINED':
                $update = true;
                $orders_status_id = GC_STATE_NEW;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . GOOGLECHECKOUT_STATE_STRING_PAYMENT_DECLINED;
                $customer_notified = 1;
                break;
            case 'CANCELLED':
                $update = true;
                $orders_status_id = GC_STATE_CANCELED;
                $customer_notified = 1;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED;
                break;
            case 'CANCELLED_BY_GOOGLE':
                $update = true;
                $orders_status_id = GC_STATE_CANCELED;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_financial_state . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED_BY_GOOG;
                $customer_notified = 1;
                break;
            default:
                break;
        }
    }
    if ($update) {
        $sql_data_array = array('orders_id' => $google_order->fields['orders_id'], 'orders_status_id' => $orders_status_id, 'date_added' => 'now()', 'customer_notified' => $customer_notified, 'comments' => $comments);
        zen_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
        $db->Execute("UPDATE " . TABLE_ORDERS . " SET orders_status = " . "'" . $orders_status_id . "' WHERE orders_id = " . "'" . makeSqlInteger($google_order->fields['orders_id']) . "'");
    }
    $update = false;
    if ($previous_fulfillment_order != $new_fulfillment_order) {
        switch ($new_fulfillment_order) {
            case 'NEW':
                break;
            case 'PROCESSING':
                $Gresponse->SendAck(false);
                $Grequest = new GoogleRequest($googlepayment->merchantid, $googlepayment->merchantkey, MODULE_PAYMENT_GOOGLECHECKOUT_MODE == 'https://sandbox.google.com/checkout/' ? "sandbox" : "production", DEFAULT_CURRENCY);
                $Grequest->SetLogFiles(API_CALLBACK_ERROR_LOG, API_CALLBACK_MESSAGE_LOG);
                $google_answer = $db->Execute("SELECT go.google_order_number, go.order_amount, o.customers_email_address, gc.buyer_id, o.customers_id\n                                          FROM " . $googlepayment->table_order . " go \n                                          inner join " . TABLE_ORDERS . " o on go.orders_id = o.orders_id\n                                          inner join " . $googlepayment->table_name . " gc on gc.customers_id = o.customers_id\n                                          WHERE go.orders_id = '" . (int) $google_order->fields['orders_id'] . "'\n                                          group by o.customers_id order by o.orders_id desc");
                $first_order = $db->Execute("SELECT customers_id, count(*) cant_orders\n                                        FROM  " . TABLE_ORDERS . " \n                                        WHERE customers_id = '" . $google_answer->fields['customers_id'] . "'\n                                        group by customers_id");
                // Send buyers email and password if new user and first buy with GC in the site
                if ($first_order->fields['cant_orders'] == 1) {
                    list($status, ) = $Grequest->sendBuyerMessage($google_answer->fields['google_order_number'], sprintf(GOOGLECHECKOUT_NEW_CREDENTIALS_MESSAGE, STORE_NAME, $google_answer->fields['customers_email_address'], $google_answer->fields['buyer_id']), "true", 2);
                    $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_order . "\n";
                    if ($status != 200) {
                        $comments .= "\n" . GOOGLECHECKOUT_ERR_SEND_NEW_USER_CREDENTIALS . "\n";
                        $customer_notified = '0';
                    } else {
                        $comments .= GOOGLECHECKOUT_SUCCESS_SEND_NEW_USER_CREDENTIALS . "\n";
                        $customer_notified = '1';
                    }
                    $comments .= "Messsage:\n" . sprintf(GOOGLECHECKOUT_NEW_CREDENTIALS_MESSAGE, STORE_NAME, $google_answer->fields['customers_email_address'], $google_answer->fields['buyer_id']);
                    $update = true;
                    $orders_status_id = GC_STATE_PROCESSING;
                }
                // Tell google witch is the Zencart's internal order Number
                $Grequest->SendMerchantOrderNumber($google_answer->fields['google_order_number'], $google_order->fields['orders_id'], 2);
                break;
            case 'DELIVERED':
                $check_status = $db->Execute("select orders_status, shipping_module_code from " . TABLE_ORDERS . "\n                      where orders_id = '" . $google_order->fields['orders_id'] . "'");
                if ($check_status->fields['shipping_module_code'] == 'FreeGCDigital') {
                    $orders_status_id = GC_STATE_DIGITAL_PROCESSED;
                } else {
                    switch ($check_status->fields['orders_status']) {
                        case GC_STATE_REFUNDED:
                            $orders_status_id = GC_STATE_SHIPPED_REFUNDED;
                            break;
                        case GC_STATE_PROCESSING:
                        default:
                            $orders_status_id = GC_STATE_SHIPPED;
                            break;
                    }
                }
                $update = true;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_order . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_DELIVERED . "\n";
                $customer_notified = 1;
                break;
            case 'WILL_NOT_DELIVER':
                $update = false;
                $orders_status_id = GC_STATE_CANCELED;
                $customer_notified = 1;
                $comments = GOOGLECHECKOUT_STATE_STRING_TIME . $data[$root]['timestamp']['VALUE'] . "\n" . GOOGLECHECKOUT_STATE_STRING_NEW_STATE . $new_fulfillment_order . "\n" . GOOGLECHECKOUT_STATE_STRING_ORDER_CANCELED;
                break;
            default:
                break;
        }
    }
    if ($update) {
        $sql_data_array = array('orders_id' => $google_order->fields['orders_id'], 'orders_status_id' => $orders_status_id, 'date_added' => 'now()', 'customer_notified' => $customer_notified, 'comments' => $comments);
        //    print_r($sql_data_array);
        zen_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
        $db->Execute("UPDATE " . TABLE_ORDERS . " SET orders_status = " . "'" . $orders_status_id . "' WHERE orders_id = " . "'" . makeSqlInteger($google_order->fields['orders_id']) . "'");
    }
    $Gresponse->SendAck();
}