Support » Plugin: PayPal Express Checkout for WooCommerce » 10413-The totals of the cart item amounts do not match order amounts.

  • Resolved jimaddlee

    (@jimaddlee)


    Recently we allow customer to pay 20% deposit instead of full amount. Customers are unable to checkout using Paypal express. It shows this “10413-The totals of the cart item amounts do not match order amounts.” If customer pay by full amount, no such error and could proceed with Paypal payment. How can I resolve this?

    SetExpressCheckout API call failed.

    Error Code: 10413
    Error Severity Code: Error
    Short Error Message: Transaction refused because of an invalid argument. See additional error messages for details.
    Detailed Error Message: The totals of the cart item amounts do not match order amounts.
    User IP: 192.122.131.36

Viewing 5 replies - 1 through 5 (of 5 total)
  • Pls reply me

    Yes?

    Is there anything to do with the express-checkout/includes/class-express-checkout-api-request.php ?

    <?php

    if (!defined(‘ABSPATH’))
    exit;

    class Express_Checkout_API_Request {

    const AUTH_CAPTURE = ‘Sale’;
    const AUTH_ONLY = ‘Authorization’;

    public $parameters = array();
    public $order;

    public function __construct($api_username, $api_password, $api_signature, $api_version) {
    $this->ex_add_parameters(array(
    ‘USER’ => $api_username,
    ‘PWD’ => $api_password,
    ‘SIGNATURE’ => $api_signature,
    ‘VERSION’ => $api_version,
    ));
    $this->express_checkout_utility = new Express_Checkout_Utility(null, null);
    }

    public function ex_set_express_checkout($args) {
    $this->ex_set_method(‘SetExpressCheckout’);
    $defaults = array(
    ‘use_bml’ => false,
    ‘paypal_account_optional’ => false,
    ‘landing_page’ => ‘billing’,
    ‘page_style’ => null,
    ‘brand_name’ => null,
    ‘payment_action’ => self::AUTH_CAPTURE,
    );
    $args = wp_parse_args($args, $defaults);
    $this->ex_add_parameters(array(
    ‘RETURNURL’ => $args[‘return_url’],
    ‘CANCELURL’ => $args[‘cancel_url’],
    ‘PAGESTYLE’ => $args[‘page_style’],
    ‘BRANDNAME’ => $args[‘brand_name’],
    ‘HDRIMG’ => $args[‘hdrimg’],
    ‘LOGOIMG’ => $args[‘logoimg’],
    ‘SOLUTIONTYPE’ => $args[‘paypal_account_optional’] ? ‘Sole’ : ‘Mark’,
    ‘LANDINGPAGE’ => ( ‘login’ == $args[‘landing_page’] ) ? ‘Login’ : ‘Billing’,
    ));
    if ($args[‘use_bml’]) {
    $this->ex_add_parameters(array(
    ‘USERSELECTEDFUNDINGSOURCE’ => ‘BML’,
    ‘SOLUTIONTYPE’ => ‘Sole’,
    ‘LANDINGPAGE’ => ‘Billing’,
    ));
    }
    $i = 0;
    if (!defined(‘WOOCOMMERCE_CART’)) {
    define(‘WOOCOMMERCE_CART’, true);
    }
    WC()->cart->calculate_totals();
    if ($this->ex_skip_line_items()) {
    $item_names = array();
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
    $product = apply_filters(‘woocommerce_cart_item_product’, $cart_item[‘data’], $cart_item, $cart_item_key);
    $quantity = absint($cart_item[‘quantity’]);
    $item_names[] = sprintf(‘%1$s x %2$s’, $product->get_title(), $quantity);
    }
    foreach (WC()->cart->get_fees() as $fee) {
    $item_names[] = sprintf(__(‘Fee – %s’, ‘express-checkout’), $fee->name);
    }
    $line_item_amount = $this->ex_round(WC()->cart->cart_contents_total + WC()->cart->fee_total);
    $shipping_amount = $this->ex_round(WC()->cart->shipping_total + WC()->cart->shipping_tax_total);
    $tax_amount = $this->ex_round(WC()->cart->tax_total);
    $total_amount = $this->ex_round(WC()->cart->total);
    $calculated_total = $this->ex_round($line_item_amount) + $this->ex_round($shipping_amount) + $this->ex_round($tax_amount);
    if ($total_amount !== $calculated_total) {
    $line_item_amount = $line_item_amount – ( $calculated_total – $total_amount );
    }
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => sprintf(__(‘%s – Order’, ‘express-checkout’), get_option(‘blogname’)),
    ‘DESC’ => $this->ex_str_truncate(html_entity_decode(implode(‘, ‘, $item_names), ENT_QUOTES, ‘UTF-8’), 127),
    ‘AMT’ => $line_item_amount,
    ), 0);
    $this->ex_add_payment_parameters(array(
    ‘AMT’ => $total_amount,
    ‘CURRENCYCODE’ => get_woocommerce_currency(),
    ‘ITEMAMT’ => $line_item_amount,
    ‘SHIPPINGAMT’ => $shipping_amount,
    ‘TAXAMT’ => $tax_amount,
    ‘NOTIFYURL’ => $args[‘notifyurl’],
    ‘PAYMENTACTION’ => ( $args[‘payment_action’] == self::AUTH_ONLY ) ? self::AUTH_ONLY : self::AUTH_CAPTURE,
    ));
    } else {
    $calculated_total = 0;
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
    $product = apply_filters(‘woocommerce_cart_item_product’, $cart_item[‘data’], $cart_item, $cart_item_key);
    $quantity = absint($cart_item[‘quantity’]);
    $item_price = $this->ex_round($cart_item[‘line_subtotal’] / $quantity, 2);
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => $this->ex_str_truncate(html_entity_decode($product->get_title(), ENT_QUOTES, ‘UTF-8’), 127),
    ‘DESC’ => $this->ex_get_item_description($cart_item, $product),
    ‘AMT’ => $item_price,
    ‘QTY’ => $quantity,
    ‘ITEMURL’ => $product->get_permalink(),
    ), $i++);
    $calculated_total += $this->ex_round($item_price * $quantity);
    }
    if (WC()->cart->get_cart_discount_total() > 0) {
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => __(‘Total Discount’, ‘express-checkout’),
    ‘QTY’ => 1,
    ‘AMT’ => – $this->ex_round(WC()->cart->get_cart_discount_total()),
    ), $i++);

    $calculated_total -= $this->ex_round(WC()->cart->get_cart_discount_total());
    }
    foreach (WC()->cart->get_fees() as $fee) {
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => __(‘Fee’, ‘express-checkout’),
    ‘DESC’ => $this->ex_str_truncate($fee->name, 127),
    ‘AMT’ => $this->ex_round($fee->amount),
    ‘QTY’ => 1,
    ), $i++);
    $calculated_total += $this->ex_round($fee->amount);
    }
    $total_amount = $this->ex_round(WC()->cart->total);
    $calculated_total += $this->ex_round(WC()->cart->shipping_total) + wc_round_tax_total(WC()->cart->tax_total + WC()->cart->shipping_tax_total);
    if ($total_amount !== $calculated_total) {
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => __(‘PayPal Rounding Adjustment’, ‘express-checkout’),
    ‘AMT’ => – ( $calculated_total – $total_amount ),
    ‘QTY’ => 1,
    ), $i++);
    }
    $this->ex_add_payment_parameters(array(
    ‘AMT’ => $this->ex_round(WC()->cart->total),
    ‘CURRENCYCODE’ => get_woocommerce_currency(),
    ‘ITEMAMT’ => $this->ex_round(WC()->cart->cart_contents_total + WC()->cart->fee_total),
    ‘SHIPPINGAMT’ => $this->ex_round(WC()->cart->shipping_total),
    ‘TAXAMT’ => wc_round_tax_total(WC()->cart->tax_total + WC()->cart->shipping_tax_total),
    ‘NOTIFYURL’ => $args[‘notifyurl’],
    ‘PAYMENTACTION’ => ( $args[‘payment_action’] == self::AUTH_ONLY ) ? self::AUTH_ONLY : self::AUTH_CAPTURE,
    ));
    }
    $this->ex_add_parameter(‘MAXAMT’, ceil(WC()->cart->total + ( WC()->cart->total * .5 )));
    if (is_user_logged_in()) {
    $customer_id = get_current_user_id();
    $this->ex_add_payment_parameters(array(
    ‘SHIPTONAME’ => get_user_meta($customer_id, ‘shipping_first_name’, true) . ‘ ‘ . get_user_meta($customer_id, ‘shipping_last_name’, true),
    ));
    }
    $this->ex_add_payment_parameters(array(
    ‘SHIPTOSTREET’ => WC()->customer->get_shipping_address(),
    ‘SHIPTOSTREET2’ => WC()->customer->get_shipping_address_2(),
    ‘SHIPTOCITY’ => WC()->customer->get_shipping_city(),
    ‘SHIPTOSTATE’ => WC()->customer->get_shipping_state(),
    ‘SHIPTOZIP’ => WC()->customer->get_shipping_postcode(),
    ‘SHIPTOCOUNTRYCODE’ => WC()->customer->get_shipping_country(),
    ‘SHIPTOPHONENUM’ => ( WC()->session->post_data[‘billing_phone’] ) ? WC()->session->post_data[‘billing_phone’] : WC()->session->post_data[‘billing_phone’],
    ‘NOTETEXT’ => ( WC()->session->post_data[‘order_comments’] ) ? WC()->session->post_data[‘order_comments’] : WC()->session->post_data[‘order_comments’],
    ));
    }

    public function ex_get_express_checkout_details($token) {
    $this->ex_set_method(‘GetExpressCheckoutDetails’);
    $this->ex_add_parameter(‘TOKEN’, $token);
    }

    public function ex_do_payment($order) {
    $this->order = $order;
    $this->ex_set_method(‘DoExpressCheckoutPayment’);
    $this->ex_add_parameters(array(
    ‘TOKEN’ => WC()->session->paypal_express_checkout[‘token’],
    ‘PAYERID’ => (!empty(WC()->session->paypal_express_checkout[‘payer_id’]) ) ? WC()->session->paypal_express_checkout[‘payer_id’] : null,
    ‘BUTTONSOURCE’ => ‘mbjtechnolabs_SP’,
    ‘RETURNFMFDETAILS’ => 1,
    ));
    $calculated_total = 0;
    $order_subtotal = $i = 0;
    $order_items = array();
    foreach ($order->get_items() as $item) {
    $product = new WC_Product($item[‘product_id’]);
    $order_items[] = array(
    ‘NAME’ => $this->ex_str_truncate(html_entity_decode($product->get_title(), ENT_QUOTES, ‘UTF-8’), 127),
    ‘DESC’ => $this->ex_get_item_description($item, $product),
    ‘AMT’ => $this->ex_round($order->get_item_subtotal($item)),
    ‘QTY’ => (!empty($item[‘qty’]) ) ? absint($item[‘qty’]) : 1,
    ‘ITEMURL’ => $product->get_permalink(),
    );
    $order_subtotal += $item[‘line_total’];
    }
    foreach ($order->get_fees() as $fee) {
    $order_items[] = array(
    ‘NAME’ => $this->ex_str_truncate($fee[‘name’], 127),
    ‘AMT’ => $this->ex_round($fee[‘line_total’]),
    ‘QTY’ => 1,
    );
    $order_subtotal += $fee[‘line_total’];
    }
    if ($order->get_total_discount() > 0) {
    $order_items[] = array(
    ‘NAME’ => __(‘Total Discount’, ‘express-checkout’),
    ‘QTY’ => 1,
    ‘AMT’ => – $this->ex_round($order->get_total_discount()),
    );
    }
    if ($this->ex_skip_line_items($order)) {
    $total_amount = $this->ex_round($order->get_total());
    $calculated_total += $this->ex_round($order_subtotal + $order->get_cart_tax()) + $this->ex_round($order->get_total_shipping() + $order->get_shipping_tax());
    if ($total_amount !== $calculated_total) {
    $order_subtotal = $order_subtotal – ( $calculated_total – $total_amount );
    }
    $item_names = array();
    foreach ($order_items as $item) {
    $item_names[] = sprintf(‘%1$s x %2$s’, $item[‘NAME’], $item[‘QTY’]);
    }
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => sprintf(__(‘%s – Order’, ‘express-checkout’), get_option(‘blogname’)),
    ‘DESC’ => $this->ex_str_truncate(html_entity_decode(implode(‘, ‘, $item_names), ENT_QUOTES, ‘UTF-8’), 127),
    ‘AMT’ => $this->ex_round($order_subtotal + $order->get_cart_tax()),
    ‘QTY’ => 1,
    ), 0);
    $this->ex_add_payment_parameters(array(
    ‘AMT’ => $total_amount,
    ‘CURRENCYCODE’ => $order->get_order_currency(),
    ‘ITEMAMT’ => $this->ex_round($order_subtotal + $order->get_cart_tax()),
    ‘SHIPPINGAMT’ => $this->ex_round($order->get_total_shipping() + $order->get_shipping_tax()),
    ‘INVNUM’ => $this->express_checkout_utility->express_checkout_get_option(‘invoice_id_prefix’) . $order->get_order_number(),
    ‘PAYMENTACTION’ => $this->express_checkout_utility->express_checkout_get_option(‘payment_action’),
    ‘PAYMENTREQUESTID’ => $order->id,
    ));
    } else {
    foreach ($order_items as $item) {
    $this->ex_add_line_item_parameters($item, $i++);
    $calculated_total += $this->ex_round($item[‘AMT’] * $item[‘QTY’]);
    }
    $calculated_total += $this->ex_round($order->get_total_shipping()) + $this->ex_round($order->get_total_tax());
    $total_amount = $this->ex_round($order->get_total());
    if ($total_amount !== $calculated_total) {
    $this->ex_add_line_item_parameters(array(
    ‘NAME’ => __(‘PayPal Rounding Adjustment’, ‘express-checkout’),
    ‘AMT’ => – ( $calculated_total – $total_amount ),
    ‘QTY’ => 1,
    ), $i++);
    }
    $this->ex_add_payment_parameters(array(
    ‘AMT’ => $total_amount,
    ‘CURRENCYCODE’ => $order->get_order_currency(),
    ‘ITEMAMT’ => $this->ex_round($order_subtotal),
    ‘SHIPPINGAMT’ => $this->ex_round($order->get_total_shipping()),
    ‘TAXAMT’ => $this->ex_round($order->get_total_tax()),
    ‘INVNUM’ => $this->express_checkout_utility->express_checkout_get_option(‘invoice_id_prefix’) . $order->get_order_number(),
    ‘PAYMENTACTION’ => $this->express_checkout_utility->express_checkout_get_option(‘payment_action’),
    ‘PAYMENTREQUESTID’ => $order->id,
    ));
    }
    }

    public function ex_add_parameter($key, $value) {
    $this->parameters[$key] = $value;
    }

    public function ex_add_parameters(array $params) {
    foreach ($params as $key => $value) {
    $this->ex_add_parameter($key, $value);
    }
    }

    public function ex_set_method($method) {
    $this->ex_add_parameter(‘METHOD’, $method);
    }

    public function ex_add_payment_parameters(array $params) {
    foreach ($params as $key => $value) {
    $this->ex_add_parameter(“PAYMENTREQUEST_0_{$key}”, $value);
    }
    }

    public function ex_add_line_item_parameters(array $params, $item_count) {
    foreach ($params as $key => $value) {
    $this->ex_add_parameter(“L_PAYMENTREQUEST_0_{$key}{$item_count}”, $value);
    }
    }

    public function ex_skip_line_items($order = null) {
    $skip_line_items = ( ‘yes’ === get_option(‘woocommerce_calc_taxes’) && ‘yes’ === get_option(‘woocommerce_prices_include_tax’) );
    return apply_filters(‘ex_gateway_paypal_express_skip_line_items’, $skip_line_items, $order);
    }

    public function ex_get_item_description($item, $product) {
    if (empty($item[‘item_meta’])) {
    $item_desc = WC()->cart->get_item_data($item, true);
    $item_desc = str_replace(“\n”, ‘, ‘, rtrim($item_desc));
    } else {
    $item_meta = new WC_Order_Item_Meta($item);
    $item_meta = $item_meta->get_formatted();
    if (!empty($item_meta)) {
    $item_desc = array();
    foreach ($item_meta as $meta) {
    $item_desc[] = sprintf(‘%1$s: %2$s’, $meta[‘label’], $meta[‘value’]);
    }
    $item_desc = implode(‘, ‘, $item_desc);
    } else {
    $item_desc = is_callable(array($product, ‘get_sku’)) && $product->get_sku() ? sprintf(__(‘SKU: %s’, ‘express-checkout’), $product->get_sku()) : null;
    }
    }
    return $this->ex_str_truncate($item_desc, 127);
    }

    public function ex_to_string() {
    return http_build_query($this->ex_get_parameters());
    }

    public function ex_get_parameters() {
    $this->parameters = apply_filters(‘wc_gateway_paypal_express_request_params’, $this->parameters, $this);
    foreach ($this->parameters as $key => $value) {
    if (” === $value || is_null($value)) {
    unset($this->parameters[$key]);
    }
    if (false !== strpos($key, ‘AMT’)) {
    if (isset($this->parameters[‘PAYMENTREQUEST_0_CURRENCYCODE’]) && ‘USD’ == $this->parameters[‘PAYMENTREQUEST_0_CURRENCYCODE’] && $value > 10000) {
    return sprintf(‘%1$s amount of %2$s must be less than $10,000.00’, $key, $value);
    }
    $this->parameters[$key] = number_format($value, 2, ‘.’, ”);
    }
    }
    return $this->parameters;
    }

    public function ex_get_order() {
    return $this->order;
    }

    public function ex_round($number, $precision = 2) {
    if ($order = $this->ex_get_order()) {
    $currency_code = $order->get_order_currency();
    } else {
    $currency_code = get_woocommerce_currency();
    }
    if (!$this->ex_currency_supports_decimals($currency_code)) {
    $precision = 0;
    }
    return round((float) $number, $precision);
    }

    public function ex_currency_supports_decimals($currency_code) {
    return !in_array($currency_code, array(‘HUF’, ‘JPY’, ‘TWD’));
    }

    public function ex_str_truncate($string, $length, $omission = ‘…’) {
    if ($this->ex_multibyte_loaded()) {
    if (mb_strlen($string) <= $length) {
    return $string;
    }
    $length -= mb_strlen($omission);
    return mb_substr($string, 0, $length) . $omission;
    } else {
    $string = $this->ex_str_to_ascii($string);
    if (strlen($string) <= $length) {
    return $string;
    }
    $length -= strlen($omission);
    return substr($string, 0, $length) . $omission;
    }
    }

    public function ex_multibyte_loaded() {
    return extension_loaded(‘mbstring’);
    }

    public function ex_str_to_ascii($string) {
    $ascii = iconv(‘UTF-8’, ‘ASCII//IGNORE’, $string);
    return false === $ascii ? preg_replace(‘/[^a-zA-Z0-9]/’, ”, $string) : $ascii;
    }

    }

    Plugin Author wpgateways

    (@wpgateways)

    We are working on this issue, we will get back to you ASAP. Most probably we will update it within next update.

    Thanks!

    Are there any news about this issue?

    I was reading about it, and almost all people said that is a rounding trouble with ITEMAMT.

    When we will see a fix for it?

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘10413-The totals of the cart item amounts do not match order amounts.’ is closed to new replies.