Results 1 to 7 of 7
  1. #1
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Google Checkout Coupon Error

    Hello All,

    I am trying to use google checkout with my site, but there is a huge problem. Google Checkout does not recognize my coupons like it is supposed to.

    I am using Google Checkout 1.4.7 with the SandBox currently and ZenCart 1.3.9.

    My Site is Outplaypoker.com.

    Any Suggestions>

    Thanks,
    Nick

  2. #2
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    OK here is the PHP file associated with what I am working with:

    PHP Code:
    <?php

    error_reporting
    (E_ALL);

    // temporal disable of multisocket 
    define('MODULE_PAYMENT_GOOGLECHECKOUT_MULTISOCKET''False');


    define('GC_STATE_NEW'100);
    define('GC_STATE_PROCESSING'101);
    define('GC_STATE_DIGITAL_PROCESSED'103);
    define('GC_STATE_SHIPPED'105);
    define('GC_STATE_REFUNDED'107);
    define('GC_STATE_SHIPPED_REFUNDED'109);
    define('GC_STATE_CANCELED'111);

    chdir('./..');
    $curr_dir getcwd();
    define('API_CALLBACK_ERROR_LOG'$curr_dir "/googlecheckout/logs/response_error.log");
    define('API_CALLBACK_MESSAGE_LOG'$curr_dir "/googlecheckout/logs/response_message.log");

    require_once (
    $curr_dir '/googlecheckout/library/googlemerchantcalculations.php');
    require_once (
    $curr_dir '/googlecheckout/library/googleresult.php');
    require_once (
    $curr_dir '/googlecheckout/library/googlerequest.php');
    require_once (
    $curr_dir '/googlecheckout/library/googleresponse.php');

    $Gresponse = new GoogleResponse();
    //Setup the log files
    $Gresponse->SetLogFiles(API_CALLBACK_ERROR_LOGAPI_CALLBACK_MESSAGE_LOGL_ALL);

    // 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);
    if (isset (
    $data[$root]['shopping-cart']['merchant-private-data']['session-data']['VALUE'])) {
      list (
    $sess_id$sess_name) = 
          
    explode(";"$data[$root]['shopping-cart']['merchant-private-data']['session-data']['VALUE']);
      
    //If session management is supported by this PHP version
      
    if (function_exists('session_id'))
        
    session_id($sess_id);
      if (
    function_exists('session_name'))
        
    session_name($sess_name);
    }
    include (
    'includes/application_top.php');
    include (
    'includes/modules/payment/googlecheckout.php');

    //BOF - define value for languages_id//define home page  - added by colosports
    $attributes $db->Execute("select languages_id
                                          from " 
    TABLE_LANGUAGES "
                                          where name = '" 
    $_SESSION['language'] . "'
                                          "
    );
    $languages_id $attributes->fields['languages_id'];
    //EOF - define value for languages_id//define home page  - added by colosports

    //  zen_session_start();
    if (isset ($_SESSION['cart']) && is_object($_SESSION['cart'])) {
      
    $cart $_SESSION['cart'];
      
    $cart->restore_contents();
    } else {
      
    $Gresponse->SendServerErrorStatus("Shopping cart not obtained from session.");
    }
    $googlepayment = new googlecheckout();
    $Gresponse->SetMerchantAuthentication($googlepayment->merchantid
                                          
    $googlepayment->merchantkey);

    // Check if is CGI install, if so .htaccess is needed
    if (MODULE_PAYMENT_GOOGLECHECKOUT_CGI != 'True') {
      
    $Gresponse->HttpAuthentication();
    }
    switch (
    $root) {
      case 
    "request-received": {
          
    process_request_received_response($Gresponse);
          break;
        }
      case 
    "error": {
          
    process_error_response($Gresponse);
          break;
        }
      case 
    "diagnosis": {
          
    process_diagnosis_response($Gresponse);
          break;
        }
      case 
    "checkout-redirect": {
          
    process_checkout_redirect($Gresponse);
          break;
        }
      case 
    "merchant-calculation-callback" :
        {
    //      if (MODULE_PAYMENT_GOOGLECHECKOUT_MULTISOCKET == 'True') {
    //        include_once ($curr_dir . '/googlecheckout/multisocket.php');
    //        process_merchant_calculation_callback($Gresponse, 2.7, false);
    //        break;
    //      }
    //    }
    //  case "merchant-calculation-callback-single" :
    //    {
          //             set_time_limit(5); 
          
    process_merchant_calculation_callback_single($Gresponse);
          break;
        }
      case 
    "new-order-notification" :
        {
          
    //        $zco_notifier->notify('NOTIFY_CHECKOUT_PROCESS_BEGIN');
          /*
           * 1. check if the users email exists
           *    1.a if not, create the user, and log in
           * 2. Check if exists as a GC user
           *    2.aAdd it the the google_checkout table to match buyer_id customer_id
           * 
           * 2. add the order to the logged user
           * 
           */
    //    Check if the order was already processed
          
    $google_order $db->Execute("select orders_id ".
                                    
    " from " $googlepayment->table_order " " .
                                    
    " where google_order_number = " 
                                    
    $data[$root]['google-order-number']['VALUE'] );
          if(
    $google_order->RecordCount() != 0) {
    //       Order already processed, send ACK http 200 to avoid notification resend
            
    $Gresponse->log->logError(sprintf(GOOGLECHECKOUT_ERR_DUPLICATED_ORDER,
                                       
    $data[$root]['google-order-number']['VALUE'],
                                       
    $google_order->fields['orders_id']));
            
    $Gresponse->SendAck(); 
          }
    //    Check if the email exists
          
    $customer_exists $db->Execute("select customers_id from " .
          
    TABLE_CUSTOMERS " where customers_email_address = '" .
          
    makeSqlString($data[$root]['buyer-billing-address']['email']['VALUE']) . "'");

    //    Check if the GC buyer id exists
          
    $customer_info $db->Execute("select gct.customers_id from " .
              
    $googlepayment->table_name " gct " .
              
    " inner join " .TABLE_CUSTOMERS " tc on gct.customers_id = tc.customers_id ".
              
    " where gct.buyer_id = " .
              
    makeSqlString($data[$root]['buyer-id']['VALUE']));

          
    $new_user false;
    //    Ignore session to avoid mix of Cart-GC sessions/emails
    //    GC email is the most important one
    //    if ((isset($_SESSION['customer_id']) && $_SESSION['customer_id'] != '')
    //                                    || $customer_exists->RecordCount() != 0) {
          
    if ($customer_exists->RecordCount() != 0) {
            
    $_SESSION['customer_id'] = $customer_exists->fields['customers_id'];
          }
          else if(
    $customer_info->RecordCount() != 0){
            
    $_SESSION['customer_id'] = $customer_info->fields['customers_id'];
          }
          else {
            list (
    $firstname$lastname) = 
                
    explode(' 'makeSqlString($data[$root]['buyer-billing-address']['contact-name']['VALUE']), 2);
            
    $sql_data_array = array (
              
    'customers_firstname' => $firstname,
              
    'customers_lastname' => $lastname,
              
    'customers_email_address' => $data[$root]['buyer-billing-address']['email']['VALUE'],
              
    'customers_nick' => '',
              
    'customers_telephone' => $data[$root]['buyer-billing-address']['phone']['VALUE'],
              
    'customers_fax' => $data[$root]['buyer-billing-address']['fax']['VALUE'],
              
    'customers_default_address_id' => 0,
              
    'customers_password' => zen_encrypt_password(makeSqlString($data[$root]['buyer-id']['VALUE'])),
              
    'customers_newsletter' => $data[$root]['buyer-marketing-preferences']['email-allowed']['VALUE']=='true'?1:0
            
    );
            if (
    ACCOUNT_DOB == 'true') {
              
    $sql_data_array['customers_dob'] = 'now()';
            }
            
    zen_db_perform(TABLE_CUSTOMERS$sql_data_array);
            
    $_SESSION['customer_id'] = $db->Insert_ID();
            
    $db->Execute("insert into " TABLE_CUSTOMERS_INFO "
                                          (customers_info_id, customers_info_number_of_logons,
                                           customers_info_date_account_created)
                                     values ('" 
    . (int) $_SESSION['customer_id'] . "', '0', now())");
    /*        $db->Execute("insert into " . $googlepayment->table_name . " " .
                          " values ( " . $_SESSION['customer_id'] . ", " .
                          $data[$root]['buyer-id']['VALUE'] . ")");*/
            
    $new_user true;
          }
          
          
    // thx  ZachAnderson ;) 
          
    $customer_in_gc $db->Execute("select gct.customers_id from " .
                                 
    $googlepayment->table_name " gct " .
                                 
    " where gct.buyer_id = " makeSqlString($data[$root]['buyer-id']['VALUE']));
          if(
    $customer_in_gc->RecordCount() == 0) {
            
    $db->Execute("insert into " $googlepayment->table_name " " .
                          
    " values ( " $_SESSION['customer_id'] . ", " .
                          
    $data[$root]['buyer-id']['VALUE'] . ")");
          }
          
    //      The user exists and is logged in
          //      Check database to see if the address exist.
          
    $address_book $db->Execute("select address_book_id, entry_country_id, entry_zone_id from " TABLE_ADDRESS_BOOK "
                          where  customers_id = '" 
    $_SESSION['customer_id'] . "'
                            and entry_street_address = '" 
    makeSqlString($data[$root]['buyer-shipping-address']['address1']['VALUE']) . "'
                              and entry_suburb = '" 
    makeSqlString($data[$root]['buyer-shipping-address']['address2']['VALUE']) . "'
                              and entry_postcode = '" 
    makeSqlString($data[$root]['buyer-shipping-address']['postal-code']['VALUE']) . "'
                              and entry_city = '" 
    makeSqlString($data[$root]['buyer-shipping-address']['city']['VALUE']) . "'
                            "
    );
          
    //      If not, add the addr as default one
          
    if ($address_book->RecordCount() == 0) {
            
    $buyer_state $data[$root]['buyer-shipping-address']['region']['VALUE'];
            
    $zone_answer $db->Execute("select zone_id, zone_country_id from " .
            
    TABLE_ZONES " where zone_code = '" $buyer_state "'");
            list (
    $firstname$lastname) = 
                
    explode(' 'makeSqlString($data[$root]['buyer-shipping-address']['contact-name']['VALUE']), 2);
            
    $sql_data_array = array (
              
    'customers_id' => $_SESSION['customer_id'],
              
    'entry_gender' => '',
              
    'entry_company' => $data[$root]['buyer-shipping-address']['company-name']['VALUE'],
              
    'entry_firstname' => $firstname,
              
    'entry_lastname' => $lastname,
              
    'entry_street_address' => $data[$root]['buyer-shipping-address']['address1']['VALUE'],
              
    'entry_suburb' => $data[$root]['buyer-shipping-address']['address2']['VALUE'],
              
    'entry_postcode' => $data[$root]['buyer-shipping-address']['postal-code']['VALUE'],
              
    'entry_city' => $data[$root]['buyer-shipping-address']['city']['VALUE'],
              
    'entry_state' => $buyer_state,
              
    'entry_country_id' => $zone_answer->fields['zone_country_id'],
              
    'entry_zone_id' => $zone_answer->fields['zone_id']
            );
            
    zen_db_perform(TABLE_ADDRESS_BOOK$sql_data_array);

            
    $address_id $db->Insert_ID();
            
    $db->Execute("update " TABLE_CUSTOMERS "
                                      set customers_default_address_id = '" 
    . (int) $address_id "'
                                      where customers_id = '" 
    . (int) $_SESSION['customer_id'] . "'");
            
    $_SESSION['customer_default_address_id'] = $address_id;
            
    $_SESSION['customer_country_id'] = $zone_answer->fields['zone_country_id'];
            
    $_SESSION['customer_zone_id'] = $zone_answer->fields['zone_id'];
          } else {
            
    $_SESSION['customer_default_address_id'] = $address_book->fields['address_book_id'];
            
    $_SESSION['customer_country_id'] = $address_book->fields['entry_country_id'];
            
    $_SESSION['customer_zone_id'] = $address_book->fields['entry_zone_id'];
          }
          
    $_SESSION['customer_first_name'] = $data[$root]['buyer-billing-address']['contact-name']['VALUE'];

          if (isset (
    $data[$root]['order-adjustment']['shipping']['merchant-calculated-shipping-adjustment']['shipping-name']['VALUE'])) {
            
    $shipping $data[$root]['order-adjustment']['shipping']['merchant-calculated-shipping-adjustment']['shipping-name']['VALUE'];
            
    $ship_cost $data[$root]['order-adjustment']['shipping']['merchant-calculated-shipping-adjustment']['shipping-cost']['VALUE'];
            
    $methods_hash $googlepayment->getMethods();
            list (
    $a$method_name) = explode(': '$shipping2);
            
    $shipping_name $methods_hash[$method_name][0];//name
            
    $shipping_code $methods_hash[$method_name][2];//code
          
    } else if (isset ($data[$root]['order-adjustment']['shipping']['flat-rate-shipping-adjustment']['shipping-name']['VALUE'])) {
            
    $shipping $data[$root]['order-adjustment']['shipping']['flat-rate-shipping-adjustment']['shipping-name']['VALUE'];
            
    $ship_cost $data[$root]['order-adjustment']['shipping']['flat-rate-shipping-adjustment']['shipping-cost']['VALUE'];
            
    $methods_hash $googlepayment->getMethods();
            list (
    $a$method_name) = explode(': '$shipping2);
            
    $shipping_name $methods_hash[$method_name][0];//name
            
    $shipping_code $methods_hash[$method_name][2];//code
          
    } else if (isset ($data[$root]['order-adjustment']['shipping']['carrier-calculated-shipping-adjustment']['shipping-name']['VALUE'])) {
            
    $shipping $data[$root]['order-adjustment']['shipping']['carrier-calculated-shipping-adjustment']['shipping-name']['VALUE'];
            
    $ship_cost $data[$root]['order-adjustment']['shipping']['carrier-calculated-shipping-adjustment']['shipping-cost']['VALUE'];
            
    $shipping_name $shipping;
            
    $shipping_code 'GCCarrierCalculated';//code
          
    } else {
            
    $shipping 'GC Digital Delivery';
            
    $ship_cost 0;
            
    $shipping_name $shipping;//name
            
    $shipping_code 'FreeGCDigital';//code
          
    }
          
    $tax_amt $data[$root]['order-adjustment']['total-tax']['VALUE'];
          
    //      $order_total = $data[$root]['order-total']['VALUE'];

          
    require (DIR_WS_CLASSES 'order.php');
          
    $order = new order();
          
    // load the selected shipping module
          //    Set up order info
          
    $payment_method $googlepayment->title;
          if(
    MODULE_PAYMENT_GOOGLECHECKOUT_MODE=='https://sandbox.google.com/checkout/'){
            
    $payment_method .= " - <font color=red>SANDBOX</font>";
          }
          list (
    $order->customer['firstname'], $order->customer['lastname']) =
              
    explode(' '$data[$root]['buyer-billing-address']['contact-name']['VALUE'], 2);
          
    $order->customer['company'] = $data[$root]['buyer-billing-address']['company-name']['VALUE'];
          
    $order->customer['street_address'] = $data[$root]['buyer-billing-address']['address1']['VALUE'];
          
    $order->customer['suburb'] = $data[$root]['buyer-billing-address']['address2']['VALUE'];
          
    $order->customer['city'] = $data[$root]['buyer-billing-address']['city']['VALUE'];
          
    $order->customer['postcode'] = $data[$root]['buyer-billing-address']['postal-code']['VALUE'];
          
    $order->customer['state'] = $data[$root]['buyer-billing-address']['region']['VALUE'];
          
    $order->customer['country']['title'] = $data[$root]['buyer-billing-address']['country-code']['VALUE'];
          
    $order->customer['telephone'] = $data[$root]['buyer-billing-address']['phone']['VALUE'];
          
    $order->customer['email_address'] = $data[$root]['buyer-billing-address']['email']['VALUE'];
          
    $order->customer['format_id'] = 2;
          list (
    $order->delivery['firstname'], $order->delivery['lastname']) = 
              
    explode(' '$data[$root]['buyer-shipping-address']['contact-name']['VALUE'], 2);
          
    $order->delivery['company'] = $data[$root]['buyer-shipping-address']['company-name']['VALUE'];
          
    $order->delivery['street_address'] = $data[$root]['buyer-shipping-address']['address1']['VALUE'];
          
    $order->delivery['suburb'] = $data[$root]['buyer-shipping-address']['address2']['VALUE'];
          
    $order->delivery['city'] = $data[$root]['buyer-shipping-address']['city']['VALUE'];
          
    $order->delivery['postcode'] = $data[$root]['buyer-shipping-address']['postal-code']['VALUE'];
          
    $order->delivery['state'] = $data[$root]['buyer-shipping-address']['region']['VALUE'];
          
    $order->delivery['country']['title'] = $data[$root]['buyer-shipping-address']['country-code']['VALUE'];
          
    $order->delivery['format_id'] = 2;
          list (
    $order->billing['firstname'], $order->billing['lastname']) = 
              
    explode(' '$data[$root]['buyer-billing-address']['contact-name']['VALUE'], 2);
          
    $order->billing['company'] = $data[$root]['buyer-billing-address']['company-name']['VALUE'];
          
    $order->billing['street_address'] = $data[$root]['buyer-billing-address']['address1']['VALUE'];
          
    $order->billing['suburb'] = $data[$root]['buyer-billing-address']['address2']['VALUE'];
          
    $order->billing['city'] = $data[$root]['buyer-billing-address']['city']['VALUE'];
          
    $order->billing['postcode'] = $data[$root]['buyer-billing-address']['postal-code']['VALUE'];
          
    $order->billing['state'] = $data[$root]['buyer-billing-address']['region']['VALUE'];
          
    $order->billing['country']['title'] = $data[$root]['buyer-billing-address']['country-code']['VALUE'];
          
    $order->billing['format_id'] = 2;
          
    $order->info['payment_method'] = $payment_method;
          
    $order->info['payment_module_code'] = $googlepayment->code;
          
    $order->info['shipping_method'] = $shipping_name;
          
    $order->info['shipping_module_code'] = $shipping_code;
          
    $order->info['cc_type'] = '';
          
    $order->info['cc_owner'] = '';
          
    $order->info['cc_number'] = '';
          
    $order->info['cc_expires'] = '';
          
    $order->info['order_status'] = GC_STATE_NEW;
          
    $order->info['tax'] = $tax_amt;
          
    $order->info['currency'] = $data[$root]['order-total']['currency'];
          
    $order->info['currency_value'] = 1;
          
    $_SESSION['customers_ip_address'] = $data[$root]['shopping-cart']['merchant-private-data']['ip-address']['VALUE'];
          
    $order->info['comments'] = GOOGLECHECKOUT_STATE_NEW_ORDER_NUM .
            
    $data[$root]['google-order-number']['VALUE'] . "\n" .
            
    GOOGLECHECKOUT_STATE_NEW_ORDER_MC_USED .
            ((@
    $data[$root]['order-adjustment']['merchant-calculation-successful']['VALUE'] == 'true')?'True':'False') .
            (
    $new_user ? ("\n" GOOGLECHECKOUT_STATE_NEW_ORDER_BUYER_USER .
            
    $data[$root]['buyer-billing-address']['email']['VALUE'] . "\n" .
            
    GOOGLECHECKOUT_STATE_NEW_ORDER_BUYER_PASS $data[$root]['buyer-id']['VALUE']):'');

          
    $coupons get_arr_result(@$data[$root]['order-adjustment']['merchant-codes']['coupon-adjustment']);
    //      $gift_cert = get_arr_result(@$data[$root]['order-adjustment']['merchant-codes']['gift-certificate-adjustment']);
          
    $items get_arr_result($data[$root]['shopping-cart']['items']['item']);

          
    // Get Coustoms OT
          
    $ot_customs_total 0;
          
    $ot_customs = array ();
          
    $order->products = array ();
          foreach (
    $items as $item) {
            if (isset (
    $item['merchant-private-item-data']['item']['VALUE'])) {
              
    $order->products[] = unserialize(base64_decode($item['merchant-private-item-data']['item']['VALUE']));
            } else
              if (
    $item['merchant-private-item-data']['order_total']['VALUE']) {
                
    $ot unserialize(base64_decode($item['merchant-private-item-data']['order_total']['VALUE']));
                
    $ot_customs[] = $ot;
                
    $ot_value $ot['value'] * (strrpos($ot['text'], '-') === false : -1);
                
    $ot_customs_total += $currencies->get_value($data[$root]['order-total']['currency']) * $ot_value;
              } else {
                
    // For Invoices!
                // Happy BDay ropu, 07/03
                
    $order->products[] = array (
                  
    'qty' => $item['quantity']['VALUE'],
                  
    'name' => $item['item-name']['VALUE'],
                  
    'model' => $item['item-description']['VALUE'],
                  
    'tax' => 0,
                  
    'tax_description' => @$item['tax-table-selector']['VALUE'],
                  
    'price' => $item['unit-price']['VALUE'],
                  
    'final_price' => $item['unit-price']['VALUE'],
                  
    'onetime_charges' => 0,
                  
    'weight' => 0,
                  
    'products_priced_by_attribute' => 0,
                  
    'product_is_free' => 0,
                  
    'products_discount_type' => 0,
                  
    'products_discount_type_from' => 0,
                  
    'id' => @$item['merchant-item-id']['VALUE']
                );
              }
          }

          
    // Update values so that order_total modules get the correct values
          
    $order->info['total'] = $data[$root]['order-total']['VALUE'];
          
    $order->info['subtotal'] = $data[$root]['order-total']['VALUE'] - 
                                    (
    $ship_cost $tax_amt) + 
                                    @
    $coupons[0]['applied-amount']['VALUE'] - 
                                    
    $ot_customs_total;
          
    $order->info['coupon_code'] = @$coupons[0]['code']['VALUE'];
          
    $order->info['shipping_method'] = $shipping;
          
    $order->info['shipping_cost'] = $ship_cost;
          
    $order->info['tax_groups']['tax'] = $tax_amt;
          
    $order->info['currency'] = $data[$root]['order-total']['currency'];
          
    $order->info['currency_value'] = 1;

          require (
    DIR_WS_CLASSES 'order_total.php');
          
    $order_total_modules = new order_total();
          
    // Disable OT sent as items in the GC cart
          
    foreach ($order_total_modules->modules as $ot_code => $order_total) {
            if (!
    in_array(substr($order_total0strrpos($order_total'.')), $googlepayment->ot_ignore)) {
              unset (
    $order_total_modules->modules[$ot_code]);
            }
          }
          
    $order_totals $order_total_modules->process();
          
    //    Not necessary, OT already disabled 
          //      foreach($order_totals as $ot_code => $order_total){
          //        if(!in_array($order_total['code'], $googlepayment->ot_ignore)){
          //          unset($order_totals[$ot_code]);
          //        }
          //      }

          //    Merge all OT
          
    $order_totals array_merge($order_totals$ot_customs);
          if (isset (
    $data[$root]['order-adjustment']['merchant-codes']['coupon-adjustment'])) {
            
    $order_totals[] = array (
              
    'code' => 'ot_coupon',
              
    'title' => "<b>" MODULE_ORDER_TOTAL_COUPON_TITLE .
              
    " " . @$coupons[0]['code']['VALUE'] . ":</b>",
              
    'text' => $currencies->format(@$coupons[0]['applied-amount']['VALUE']*-1
                            
    false,@$coupons[0]['applied-amount']['currency'])
              ,
              
    'value' => @$coupons[0]['applied-amount']['VALUE'],
              
    'sort_order' => 280
            
    );
          }

  3. #3
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    PHP Code:
    function OT_cmp($a$b) {
            if (
    $a['sort_order'] == $b['sort_order'])
              return 
    0;
            return (
    $a['sort_order'] < $b['sort_order']) ? -1;
          }
          
    usort($order_totals"OT_cmp");
          
    // Orders managed by ZC modules
          
    $insert_id $order->create($order_totals2);
    //      $order_total_modules = new order_total();
          // store the product info to the order
          
    $order->create_add_products($insert_id);
          
    $_SESSION['order_number_created'] = $insert_id;
          
    //      Add coupon to redeem track
          
    if (isset ($data[$root]['order-adjustment']['merchant-codes']['coupon-adjustment'])) {
            
    $sql "select coupon_id
                                    from " 
    TABLE_COUPONS "
                                    where coupon_code= :couponCodeEntered
                                    and coupon_active='Y'"
    ;
            
    $sql $db->bindVars($sql':couponCodeEntered'$coupons[0]['code']['VALUE'], 'string');

            
    $coupon_result $db->Execute($sql);
    //        $_SESSION['cc_id'] = $coupon_result->fields['coupon_id'];
            
    $cc_id $coupon_result->fields['coupon_id'];

            
    $db->Execute("insert into " TABLE_COUPON_REDEEM_TRACK "
                                        (coupon_id, redeem_date, redeem_ip, customer_id, order_id)
                                        values ('" 
    . (int) $cc_id "', now(), '" .
            
    $data[$root]['shopping-cart']['merchant-private-data']['ip-address']['VALUE'] .
            
    "', '" . (int) $_SESSION['customer_id'] . "', '" . (int) $insert_id "')");
            
    $_SESSION['cc_id'] = "";
          }

          
    //Add the order details to the table
          // This table could be modified to hold the merchant id and key if required
          // so that different mids and mkeys can be used for different orders
          
    $db->Execute("insert into " $googlepayment->table_order " values (" $insert_id ", " .
          
    makeSqlString($data[$root]['google-order-number']['VALUE']) . ", " .
          
    makeSqlFloat($data[$root]['order-total']['VALUE']) . ")");

          
    $_SESSION['cart']->reset(TRUE);
          
    $Gresponse->SendAck();
          break;
        }
      case 
    "order-state-change-notification": {
          
    process_order_state_change_notification($Gresponse$googlepayment);
          break;
        }
      case 
    "charge-amount-notification": {
          
    process_charge_amount_notification($Gresponse$googlepayment);
          break;
        }
      case 
    "chargeback-amount-notification": {
          
    process_chargeback_amount_notification($Gresponse);
          break;
        }
      case 
    "refund-amount-notification": {
      
    process_refund_amount_notification($Gresponse$googlepayment);
          break;
        }
      case 
    "risk-information-notification": {
          
    process_risk_information_notification($Gresponse$googlepayment);
          break;
        }
      default: {
          
    $Gresponse->SendBadRequestStatus("Invalid or not supported Message");
          break;
        }
    }
    exit (
    0);

    function 
    process_request_received_response($Gresponse) {
    }
    function 
    process_error_response($Gresponse) {
    }
    function 
    process_diagnosis_response($Gresponse) {
    }
    function 
    process_checkout_redirect($Gresponse) {
    }

    function 
    calculate_coupons($Gresponse, & $merchant_result$price 0) {
      global 
    $order$db$googlepayment;
      list (
    $root$data) = $Gresponse->GetParsedXML();
      require_once (
    DIR_FS_CATALOG DIR_WS_FUNCTIONS 'functions_general.php');
      
    $currencies = new currencies();
      require_once (
    DIR_FS_CATALOG DIR_WS_LANGUAGES $_SESSION['language'] . '/discount_coupon.php');
      
    $codes get_arr_result($data[$root]['calculate']['merchant-code-strings']['merchant-code-string']);
      
    //print_r($codes);

      
    $customer_exists $db->Execute("select customers_id from " .
          
    $googlepayment->table_name " where buyer_id = " .
          
    makeSqlString($data[$root]['buyer-id']['VALUE']));
      if (
    $customer_exists->RecordCount() != 0) {
        
    $customer_id $customer_exists->fields['customers_id'];
      }
      
    $first_coupon true;
      foreach (
    $codes as $curr_code) {
        
    $text_coupon_help '';

        
    //Update this data as required to set whether the coupon is valid, the code and the amount
        // Check for valid zone...   
        
    $sql "select coupon_id, coupon_amount, coupon_type, coupon_minimum_order, uses_per_coupon, uses_per_user,
                          restrict_to_products, restrict_to_categories, coupon_zone_restriction, coupon_code
                          from " 
    TABLE_COUPONS "
                          where coupon_code= '" 
    zen_db_input($curr_code['code']) . "'
                          and coupon_active='Y'"
    ;
        
    //      $sql = $db->bindVars($sql, ':couponIDEntered', , 'string');

        
    $coupon_result $db->Execute($sql);
        
    $foundvalid true;
        
    $check_flag false;
        
    $check $db->Execute("select zone_id, zone_country_id from " .
        
    TABLE_ZONES_TO_GEO_ZONES " where geo_zone_id = '" .
        
    $coupon_result->fields['coupon_zone_restriction'] . "' and zone_country_id = '" .
        
    $order->delivery['country']['id'] . "' order by zone_id");

        if (
    $coupon_result->fields['coupon_zone_restriction'] > 0) {
          while (!
    $check->EOF) {
            if (
    $check->fields['zone_id'] < 1) {
              
    $check_flag true;
              break;
            }
            elseif (
    $check->fields['zone_id'] == $order->delivery['zone_id']) {
              
    $check_flag true;
              break;
            }
            
    $check->MoveNext();
          }
          
    $foundvalid $check_flag;
        }
        
    $coupon_count $db->Execute("select coupon_id from " TABLE_COUPON_REDEEM_TRACK "
                                        where coupon_id = '" 
    . (int)$coupon_result->fields['coupon_id']."'");

        
    $coupon_count_customer $db->Execute("select coupon_id from " TABLE_COUPON_REDEEM_TRACK "
                                               where coupon_id = '" 
    $coupon_result->fields['coupon_id']."' and
                                               customer_id = '" 
    . (int)$customer_id "'");

        
    //  added code here to handle coupon product restrictions
        // look through the items in the cart to see if this coupon is valid for any item in the cart
    //    $items = get_arr_result($data[$root]['shopping-cart']['items']['item']);
    //    $products = array ();
    //    foreach ($items as $item) {
    //      if (isset ($item['merchant-private-item-data']['item']['VALUE'])) {
    //        $products[] = unserialize(base64_decode($item['merchant-private-item-data']['item']['VALUE']));
    //      }
    //    }
        
    if ($foundvalid == true) {
          
    $foundvalid false;
          
    $products $order->products;
          for (
    $i 0$i sizeof($products); $i++) {
            if (
    is_product_valid($products[$i]['id'], $coupon_result->fields['coupon_id'])) {
              
    $foundvalid true;
              continue;
            }
          }
        }

        
    $coupon $db->Execute("select * from " TABLE_COUPONS " where coupon_code = '" .
        
    zen_db_input($curr_code['code']) . "' and  coupon_type != 'G'");

        if (!
    $foundvalid || !$first_coupon || $coupon->RecordCount() < 1) {
          
    // invalid discount coupon code or more than one entered!
          
    $text_coupon_help $first_coupon sprintf(TEXT_COUPON_FAILED$curr_code['code']) : GOOGLECHECKOUT_COUPON_ERR_ONE_COUPON;
          
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
          
    $merchant_result->AddCoupons($coupons);
          
    // BBG Start - Invalid discount coupon if coupon minimum order is over 0 and the order total doesn't meet the minimum     
        
    } else if ($coupon->fields['coupon_minimum_order'] > && $order->info['total'] < $coupon->fields['coupon_minimum_order']) {
            
    $text_coupon_help GOOGLECHECKOUT_COUPON_ERR_MIN_PURCHASE;
            
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
            
    $merchant_result->AddCoupons($coupons);
            
    // BBG End
        
    }
        else if (
    $coupon_count->RecordCount() >= $coupon_result->fields['uses_per_coupon'] && $coupon_result->fields['uses_per_coupon'] > 0) {
          
    $text_coupon_help TEXT_INVALID_USES_COUPON $coupon_result->fields['uses_per_coupon'] . TIMES ;
          
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
          
    $merchant_result->AddCoupons($coupons);
          
        }
        else if (
    $coupon_count_customer->RecordCount() >= $coupon_result->fields['uses_per_user'] && $coupon_result->fields['uses_per_user'] > 0) {
          
    $text_coupon_help sprintf(TEXT_INVALID_USES_USER_COUPON,  $curr_code['code']) . $coupon_result->fields['uses_per_user'] . ($coupon_result->fields['uses_per_user'] == TIME TIMES);
          
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
          
    $merchant_result->AddCoupons($coupons);
        }
        else {
          
    // valid discount coupon code
          
    $lookup_coupon_id $coupon->fields['coupon_id'];
          
    $coupon_desc $db->Execute("select * from " TABLE_COUPONS_DESCRIPTION .
          
    " where coupon_id = '" . (int) $lookup_coupon_id "' " .
          
    " and language_id = '" . (int) $_SESSION['languages_id'] . "'");
          
    $coupon_amount $coupon->fields['coupon_amount'];
          switch (
    $coupon->fields['coupon_type']) {
            case 
    'F' :
              
    $text_coupon_help GOOGLECHECKOUT_COUPON_DISCOUNT $curr_code['code'];
              break;
            case 
    'P' :
              
    $text_coupon_help GOOGLECHECKOUT_COUPON_DISCOUNT $curr_code['code'];
              
    $coupon_amount $coupon_amount $order->info['subtotal'] / 100;
              break;
            case 
    'S' :
              
    $text_coupon_help GOOGLECHECKOUT_COUPON_FREESHIP $curr_code['code'];
              
    $coupon_amount $price;
              break;
            default :
              }
          
    $get_result $db->Execute("select * from " TABLE_COUPON_RESTRICT " " .
          
    "where coupon_id='" . (int) $lookup_coupon_id "' and category_id !='0'");
          
    $cats '';
          while (!
    $get_result->EOF) {
            if (
    $get_result->fields['coupon_restrict'] == 'N') {
              
    $restrict TEXT_CAT_ALLOWED;
            } else {
              
    $restrict TEXT_CAT_DENIED;
            }
            
    $result $db->Execute("SELECT * FROM " TABLE_CATEGORIES " c, " .
            
    TABLE_CATEGORIES_DESCRIPTION " cd WHERE c.categories_id = cd.categories_id " .
            
    "and cd.language_id = '" . (int) $_SESSION['languages_id'] . "' " .
            
    "and c.categories_id='" $get_result->fields['category_id'] . "'");
            
    $cats .= '<br />' $result->fields["categories_name"] . $restrict;
            
    $get_result->MoveNext();
          }
          if (
    $cats == '')
            
    $cats TEXT_NO_CAT_RESTRICTIONS;
          
    $get_result $db->Execute("select * from " TABLE_COUPON_RESTRICT .
          
    " where coupon_id='" . (int) $lookup_coupon_id "' and product_id !='0'");

          while (!
    $get_result->EOF) {
            if (
    $get_result->fields['coupon_restrict'] == 'N') {
              
    $restrict TEXT_PROD_ALLOWED;
            } else {
              
    $restrict TEXT_PROD_DENIED;
            }
            
    $result $db->Execute("SELECT * FROM " TABLE_PRODUCTS " p, " .
            
    TABLE_PRODUCTS_DESCRIPTION " pd WHERE p.products_id = pd.products_id " .
            
    "and pd.language_id = '" . (int) $_SESSION['languages_id'] . "' " .
            
    "and p.products_id = '" $get_result->fields['product_id'] . "'");
            
    $prods .= '<br />' $result->fields['products_name'] . $restrict;
            
    $get_result->MoveNext();
          }
          if (
    $prods == '') {
            
    $prods TEXT_NO_PROD_RESTRICTIONS;
          }
          
    $coupons = new GoogleCoupons("true"$curr_code['code'], $currencies->get_value(DEFAULT_CURRENCY) * $coupon_amount$text_coupon_help);
          
    $merchant_result->AddCoupons($coupons);
          
    $first_coupon false;
        }
      }
    }
    function 
    process_merchant_calculation_callback_single($Gresponse) {
      global 
    $googlepayment$order$db$total_weight$total_count;
      list (
    $root$data) = $Gresponse->GetParsedXML();
      
    $currencies = new currencies();

      
    $cart $_SESSION['cart'];
      
    $methods_hash $googlepayment->getMethods();
      require (
    DIR_WS_CLASSES 'order.php');
      
    $order = new order;

      
    // Register a random ID in the session to check throughout the checkout procedure
      // against alterations in the shopping cart contents.
      //  if (!tep_session_is_registered('cartID')) {
      //  tep_session_register('cartID');
      // }
    //  $cartID = $cart->cartID;
      
    $items get_arr_result($data[$root]['shopping-cart']['items']['item']);
      
    $products = array ();
      foreach (
    $items as $item) {
        if (isset (
    $item['merchant-private-item-data']['item']['VALUE'])) {
          
    $products[] = unserialize(base64_decode($item['merchant-private-item-data']['item']['VALUE']));
        }
      }
      
    $order->products $products;
      
    $total_weight $cart->show_weight();
      
    $total_count $cart->count_contents();

      
    // Create the results and send it
      
    $merchant_calc = new GoogleMerchantCalculations(DEFAULT_CURRENCY);

      
    // Loop through the list of address ids from the callback.
      
    $addresses get_arr_result($data[$root]['calculate']['addresses']['anonymous-address']);
      
    // Get all the enabled shipping methods.
      
    require (DIR_WS_CLASSES 'shipping.php');

      
    // Required for some shipping methods (ie. USPS).
      
    require_once ('includes/classes/http_client.php');
      foreach (
    $addresses as $curr_address) {
        
    // Set up the order address.
        
    $curr_id $curr_address['id'];
        
    $country $curr_address['country-code']['VALUE'];
        
    $city $curr_address['city']['VALUE'];
        
    $region $curr_address['region']['VALUE'];
        
    $postal_code $curr_address['postal-code']['VALUE'];
        
    $countr_query $db->Execute("select * 
                         from " 
    TABLE_COUNTRIES 
                         where countries_iso_code_2 = '" 
    makeSqlString($country) . "'");

        
    $row $countr_query->fields;
        
    $order->delivery['country'] = array (
          
    'id' => $row['countries_id'],
          
    'title' => $row['countries_name'],
          
    'iso_code_2' => $country,
          
    'iso_code_3' => $row['countries_iso_code_3']
        );

        
    $order->delivery['country_id'] = $row['countries_id'];
        
    $order->delivery['format_id'] = $row['address_format_id'];

        
    $zone_query $db->Execute("select * 
                                                   from " 
    TABLE_ZONES "
                                                   where zone_code = '" 
    makeSqlString($region) . "'");

        
    $row $zone_query->fields;
        
    $order->delivery['zone_id'] = $row['zone_id'];
        
    $order->delivery['state'] = $row['zone_name'];
        
    $order->delivery['city'] = $city;
        
    $order->delivery['postcode'] = $postal_code;
        
    $shipping_modules = new shipping();

        
    // Loop through each shipping method if merchant-calculated shipping
        // support is to be provided
        //print_r($data[$root]['calculate']['shipping']['method']);
        
    if (isset ($data[$root]['calculate']['shipping']['method'])) {
          
    $shipping get_arr_result($data[$root]['calculate']['shipping']['method']);

    //      if (MODULE_PAYMENT_GOOGLECHECKOUT_MULTISOCKET == 'True') {
    //        // Single
    //        // i get all the enabled shipping methods  
    //        $name = $shipping[0]['name'];
    //        //            Compute the price for this shipping method and address id
    //        list ($a, $method_name) = explode(': ', $name);
    //        if ((($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY)
    //              && ($methods_hash[$method_name][1] == 'domestic_types'))
    //           || (($order->delivery['country']['id'] != SHIPPING_ORIGIN_COUNTRY)
    //              && ($methods_hash[$method_name][1] == 'international_types'))) {
    //          //                                reset the shipping class to set the new address
    //          if (class_exists($methods_hash[$method_name][2])) {
    //            $GLOBALS[$methods_hash[$method_name][2]] = new $methods_hash[$method_name][2];
    //          }
    //        }
    //        $quotes = $shipping_modules->quote('', $methods_hash[$method_name][2]);
    //      } else {
            // Standard
            
    foreach ($shipping as $curr_ship) {
              
    $name $curr_ship['name'];
              
    //            Compute the price for this shipping method and address id
              
    list ($a$method_name) = explode(': '$name2);
              if (((
    $order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY
                    && (
    $methods_hash[$method_name][1] == 'domestic_types')) 
                  || ((
    $order->delivery['country']['id'] != SHIPPING_ORIGIN_COUNTRY
                    && (
    $methods_hash[$method_name][1] == 'international_types'))) {
                
    //                                reset the shipping class to set the new address
                
    if (class_exists($methods_hash[$method_name][2])) {
                  
    $GLOBALS[$methods_hash[$method_name][2]] = new $methods_hash[$method_name][2];
                }
              }
            }
            
    $quotes $shipping_modules->quote();
    //      }
          
    reset($shipping);
          foreach (
    $shipping as $curr_ship) {
            
    $name $curr_ship['name'];
            
    //            Compute the price for this shipping method and address id
            
    list ($a$method_name) = explode(': '$name2);
            unset (
    $quote_povider);
            unset (
    $quote_method);
            if (((
    $order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY
                && (
    $methods_hash[$method_name][1] == 'domestic_types')) 
              || ((
    $order->delivery['country']['id'] != SHIPPING_ORIGIN_COUNTRY
                && (
    $methods_hash[$method_name][1] == 'international_types'))) {
              foreach (
    $quotes as $key_provider => $shipping_provider) {
                
    // privider name (class)
                
    if ($shipping_provider['id'] == $methods_hash[$method_name][2]) {
                  
    // method name            
                  
    $quote_povider $key_provider;
                  if (
    is_array($shipping_provider['methods']))
                    foreach (
    $shipping_provider['methods'] as $key_method => $shipping_method) {
                      if (
    $shipping_method['id'] == $methods_hash[$method_name][0]) {
                        
    $quote_method $key_method;
                        break;
                      }
                    }
                  break;
                }
              }
            }
            
    //if there is a problem with the method, i mark it as non-shippable
            
    if( isset($quotes[$quote_povider]['error']) ||
                !isset(
    $quotes[$quote_povider]['methods'][$quote_method]['cost'])) {
              
    $price "9999.09";
              
    $shippable "false";
            } else {
              
    $price $quotes[$quote_povider]['methods'][$quote_method]['cost'];
              
    $shippable "true";
            }
            
    // fix for item shipping function bug if called more than once in a session. 
            
    $price = ($price >= $price 0);
            
    $merchant_result = new GoogleResult($curr_id);
            
    $merchant_result->SetShippingDetails($name$currencies->get_value(DEFAULT_CURRENCY) * $price$shippable);

            if (
    $data[$root]['calculate']['tax']['VALUE'] == "true") {
              
    //Compute tax for this address id and shipping type
              
    $amount 15// Modify this to the actual tax value
              
    $merchant_result->SetTaxDetails($currencies->get_value(DEFAULT_CURRENCY) * $amount);
            } 

  4. #4
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    PHP Code:
     ////                             start cupons and gift processing (working)
            //                                // only one coupon per order is valid!
            //                $_POST['dc_redeem_code'] = 'ROPU';
            //
            ////                require(DIR_WS_CLASSES . 'order.php');
            ////                $order = new order;
            //                require_once(DIR_WS_CLASSES . 'order_total.php');
            //                $order_total_modules = new order_total;
            ////                $order_total_modules->collect_posts();
            ////                $order_total_modules->pre_confirmation_check();
            //                
            ////                print_r($order_total_modules);
            //                   $order_totals = $order_total_modules->process();
            ////                print_r($order_totals);
            //                                

            
    calculate_coupons($Gresponse$merchant_result$price);
            
    // end cupons                    
            
    $merchant_calc->AddResult($merchant_result);
          }
        } else {
          
    $merchant_result = new GoogleResult($curr_id);
          if (
    $data[$root]['calculate']['tax']['VALUE'] == "true") {
            
    //Compute tax for this address id and shipping type
            
    $amount 15// Modify this to the actual tax value
            
    $merchant_result->SetTaxDetails($currencies->get_value(DEFAULT_CURRENCY) * $amount);
          }
          
    calculate_coupons($Gresponse$merchant_result);
          
    $merchant_calc->AddResult($merchant_result);
        }
      }
      
    $Gresponse->ProcessMerchantCalculations($merchant_calc);
    }


    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_LOGAPI_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
                                              FROM " 
    $googlepayment->table_order " go 
                                              inner join " 
    TABLE_ORDERS " o on go.orders_id = o.orders_id
                                              inner join " 
    $googlepayment->table_name " gc on gc.customers_id = o.customers_id
                                              WHERE go.orders_id = '" 
    . (int)$google_order->fields['orders_id'] ."'
                                              group by o.customers_id order by o.orders_id desc"
    );
        
              
    $first_order $db->Execute("SELECT customers_id, count(*) cant_orders
                                            FROM  " 
    TABLE_ORDERS 
                                            WHERE customers_id = '"
    .$google_answer->fields['customers_id']."'
                                            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 "
                          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();
    }
    function 
    process_charge_amount_notification($Gresponse$googlepayment) {
      global 
    $db$currencies;
      list (
    $root$data) = $Gresponse->GetParsedXML();
      
    $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) . "'");

      
    //   fwrite($message_log,sprintf("\n%s\n", $google_order->fields['orders_id']));

      
    $sql_data_array = array (
        
    'orders_id' => $google_order->fields['orders_id'],
        
    'orders_status_id' => GC_STATE_PROCESSING,
        
    'date_added' => 'now()',
        
    'customer_notified' => 0,
        
    'comments' => GOOGLECHECKOUT_STATE_STRING_LATEST_CHARGE .
          
    $currencies->format($data[$root]['latest-charge-amount']['VALUE'], 
                           
    false$data[$root]['latest-charge-amount']['currency']).
        
    "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_TOTAL_CHARGE .
          
    $currencies->format($data[$root]['total-charge-amount']['VALUE'], 
                           
    false$data[$root]['total-charge-amount']['currency'])
      );
      
    zen_db_perform(TABLE_ORDERS_STATUS_HISTORY$sql_data_array);
      
    $db->Execute("UPDATE " TABLE_ORDERS " SET orders_status = '" GC_STATE_PROCESSING "' " .
      
    "WHERE orders_id = '" makeSqlInteger($google_order->fields['orders_id']) . "'");
      
    $Gresponse->SendAck();
    }
    function 
    process_chargeback_amount_notification($Gresponse) {
      
    $Gresponse->SendAck();
    }
    function 
    process_refund_amount_notification($Gresponse$googlepayment) {
      global 
    $db$currencies;
      list (
    $root$data) = $Gresponse->GetParsedXML();
      
    $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) . "'");

      
    //   fwrite($message_log,sprintf("\n%s\n", $google_order->fields['orders_id']));
      
    $check_status $db->Execute("select orders_status from " TABLE_ORDERS "
                              where orders_id = '" 
    $google_order->fields['orders_id'] . "'");

      switch(
    $check_status->fields['orders_status']){
        case 
    GC_STATE_PROCESSING:
        case 
    GC_STATE_REFUNDED:
          
    $orders_status_id GC_STATE_REFUNDED;
        break;
        case 
    GC_STATE_SHIPPED:
        case 
    GC_STATE_SHIPPED_REFUNDED:
        default;
          
    $orders_status_id GC_STATE_SHIPPED_REFUNDED;
        break;
      }

      
    $sql_data_array = array (
        
    'orders_id' => $google_order->fields['orders_id'],
        
    'orders_status_id' => GC_STATE_PROCESSING,
        
    'date_added' => 'now()',
        
    'customer_notified' => 1,
        
    'comments' => GOOGLECHECKOUT_STATE_STRING_TIME .
        
    $data[$root]['timestamp']['VALUE'] . "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_LATEST_REFUND .
          
    $currencies->format($data[$root]['latest-refund-amount']['VALUE'], 
                     
    false$data[$root]['latest-refund-amount']['currency']). "\n".
        
    GOOGLECHECKOUT_STATE_STRING_TOTAL_REFUND .
          
    $currencies->format($data[$root]['total-refund-amount']['VALUE'], 
                     
    false$data[$root]['total-refund-amount']['currency'])
      );
      
    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']) . "'");


      
    $sql_data_array = array (
        
    'orders_id' => $google_order->fields['orders_id'],
        
    'title' => GOOGLECHECKOUT_STATE_STRING_GOOGLE_REFUND,
        
    'text' => '<font color="#800000">' .
          
    $currencies->format($data[$root]['latest-refund-amount']['VALUE'] * -1
                     
    false$data[$root]['latest-refund-amount']['currency']). "\n".
        
    '</font>',
        
    'value' => $data[$root]['latest-refund-amount']['VALUE'],
        
    'class' => 'ot_goog_refund',
        
    'sort_order' => 1001
      
    );

      
    zen_db_perform(TABLE_ORDERS_TOTAL$sql_data_array);

      
    $total $db->Execute("SELECT orders_total_id, text, value from " .
      
    "" TABLE_ORDERS_TOTAL " where orders_id = " .
      
    "'" $google_order->fields['orders_id'] . "' AND class = 'ot_total'");

      
    $net_rev $db->Execute("SELECT orders_total_id, text, value from " .
      
    "" TABLE_ORDERS_TOTAL " where orders_id = " .
      
    "'" $google_order->fields['orders_id'] . "' AND class = 'ot_goog_net_rev'");

      
    $sql_data_array = array (
        
    'orders_id' => $google_order->fields['orders_id'],
        
    'title' => '<b>' GOOGLECHECKOUT_STATE_STRING_NET_REVENUE '</b>',
        
    'text' => '<b>' .
          
    $currencies->format(($total->fields['value'] - 
                          ((double) 
    $data[$root]['total-refund-amount']['VALUE'])), 
                     
    false$data[$root]['total-refund-amount']['currency']). 
        
    '</b>''value' => ($total->fields['value'] - 
          ((double) 
    $data[$root]['total-refund-amount']['VALUE'])), 
        
    'class' => 'ot_goog_net_rev',
        
    'sort_order' => 1010);

      if (
    $net_rev->RecordCount() == 0) {
        
    zen_db_perform(TABLE_ORDERS_TOTAL$sql_data_array);
      } else {
        
    zen_db_perform(TABLE_ORDERS_TOTAL$sql_data_array'update'"orders_total_id = '" .
        
    $net_rev->fields['orders_total_id'] . "'");
      }

      
    $Gresponse->SendAck();
    }
    function 
    process_risk_information_notification($Gresponse$googlepayment) {
      global 
    $db;
      list (
    $root$data) = $Gresponse->GetParsedXML();
      
    $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) . "'");

      
    //   fwrite($message_log,sprintf("\n%s\n", $google_order->fields['orders_id']));

      
    $sql_data_array = array (
        
    'orders_id' => $google_order->fields['orders_id'],
        
    'orders_status_id' => GC_STATE_NEW,
        
    'date_added' => 'now()',
        
    'customer_notified' => 0,
        
    'comments' => GOOGLECHECKOUT_STATE_STRING_RISK_INFO "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_RISK_ELEGIBLE .
        
    $data[$root]['risk-information']['eligible-for-protection']['VALUE'] . "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_RISK_AVS .
        
    $data[$root]['risk-information']['avs-response']['VALUE'] . "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_RISK_CVN .
        
    $data[$root]['risk-information']['cvn-response']['VALUE'] . "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_RISK_CC_NUM .
        
    $data[$root]['risk-information']['partial-cc-number']['VALUE'] . "\n" .
        
    GOOGLECHECKOUT_STATE_STRING_RISK_ACC_AGE .
        
    $data[$root]['risk-information']['buyer-account-age']['VALUE'] . "\n"
      
    );
      
    zen_db_perform(TABLE_ORDERS_STATUS_HISTORY$sql_data_array);
      
    $db->Execute("UPDATE " TABLE_ORDERS " SET orders_status = '" GC_STATE_NEW "' " .
      
    "WHERE orders_id = '" makeSqlInteger($google_order->fields['orders_id']) . "'");
      
    $Gresponse->SendAck();
    }

    //Functions to prevent SQL injection attacks
    function makeSqlString($str) {
      return 
    zen_db_input($str);
      
    //    return addcslashes(stripcslashes($str), "'\"\\\0..\37!@\@\177..\377");
    }

    function 
    makeSqlInteger($val) {
      return ((
    settype($val'integer')) ? ($val) : 0);
    }

    function 
    makeSqlFloat($val) {
      return ((
    settype($val'float')) ? ($val) : 0);
    }
    /* In case the XML API contains multiple open tags
     with the same value, then invoke this function and
     perform a foreach on the resultant array.
     This takes care of cases when there is only one unique tag
     or multiple tags.
     Examples of this are "anonymous-address", "merchant-code-string"
     from the merchant-calculations-callback API
    */
    function get_arr_result($child_node) {
      
    $result = array ();
      if (isset (
    $child_node)) {
        if (
    is_associative_array($child_node)) {
          
    $result[] = $child_node;
        } else {
          foreach (
    $child_node as $curr_node) {
            
    $result[] = $curr_node;
          }
        }
      }
      return 
    $result;
    }

    /* Returns true if a given variable represents an associative array */
    function is_associative_array($var) {
      return 
    is_array($var) && !is_numeric(implode(''array_keys($var)));
    }
    // ** END GOOGLE CHECKOUT **
    ?> 

  5. #5
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    Sorry for all the replies but it is the only way ZenCart would allow it. You can copy and paste it into a editor to see it all together.

    So after searching for hours last night it seems like a lot of people are having this same problem with the Google Checkout will not apply coupons.

    Personally gives the reason that the coupon does not exceed the minimum order, however I tried orders that exceeded $10,000. As well I tried to just remove the restrictions completely with no success.

    You can try to order a product on my site: outplaypoker.com which is on Google sand box so the order will not actually process.

    Hope we can solve this one for everyone!

    Thanks,
    Nick

  6. #6
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    Ok,

    From playing with the code for a little bit, I think it is not reading one of the varibles right. I have been trying to work with this bit:

    PHP Code:
    // BBG Start - Invalid discount coupon if coupon minimum order is over 0 and the order total doesn't meet the minimum     
        
    } else if ($coupon->fields['coupon_minimum_order'] > && $order->info['total'] < $coupon->fields['coupon_minimum_order']) {
            
    $text_coupon_help GOOGLECHECKOUT_COUPON_ERR_MIN_PURCHASE;
            
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
            
    $merchant_result->AddCoupons($coupons); 
    I have also tried...
    PHP Code:
    // BBG Start - Invalid discount coupon if coupon minimum order is over 0 and the order total doesn't meet the minimum     
        
    } else if ($order->info['total'] < $coupon->fields['coupon_minimum_order']) {
            
    $text_coupon_help GOOGLECHECKOUT_COUPON_ERR_MIN_PURCHASE;
            
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
            
    $merchant_result->AddCoupons($coupons); 
    And...
    PHP Code:
    // BBG Start - Invalid discount coupon if coupon minimum order is over 0 and the order total doesn't meet the minimum     
        
    } else if ($coupon->fields['coupon_minimum_order'] > 0) {
            
    $text_coupon_help GOOGLECHECKOUT_COUPON_ERR_MIN_PURCHASE;
            
    $coupons = new GoogleCoupons("false"$curr_code['code'], 0$text_coupon_help);
            
    $merchant_result->AddCoupons($coupons); 
    So I think from this that the "total" or "coupon_minimum_order" variable is not getting inputed.

    Any suggestions?

  7. #7
    Join Date
    Apr 2010
    Location
    Rochester, New York
    Posts
    97
    Plugin Contributions
    0

    Default Re: Google Checkout Coupon Error

    Ok well if I take it all out it works but subtracts nothing, so this leads me to believe that the total is not being read in correctly.

    Any suggestions?

 

 

Similar Threads

  1. Checkout with coupon when no coupon is offered, Google Checkout
    By mohammed.khalilia in forum Addon Payment Modules
    Replies: 1
    Last Post: 8 Nov 2011, 01:11 AM
  2. Google Checkout Coupon Error
    By NBordeau in forum General Questions
    Replies: 0
    Last Post: 3 May 2010, 12:41 AM
  3. Google Checkout Coupon
    By barry g in forum Addon Payment Modules
    Replies: 1
    Last Post: 23 Jul 2009, 01:33 PM
  4. Google checkout: Coupon entered before or after?
    By neckwood in forum Addon Payment Modules
    Replies: 2
    Last Post: 17 May 2009, 10:16 PM
  5. How to use coupon codes w/ google checkout?
    By seeker in forum Addon Payment Modules
    Replies: 0
    Last Post: 9 Mar 2007, 03:41 AM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
disjunctive-egg
Zen-Cart, Internet Selling Services, Klamath Falls, OR