What a discount code is used during checkout, customers get this error when being sent to PayPal for the final step.
"The link you have used to enter the PayPal system contains an incorrectly formatted item amount."
Never encountered this before 1.5.x and I can't get too much useful info on Google. Please help, thanks!
"The link you have used to enter the PayPal system contains an incorrectly formatted item amount."
Never encountered this before 1.5.x and I can't get too much useful info on Google. Please help, thanks!
Attachments
000.png (7.33 KiB) Viewed 7412 times
jtam wrote:What a discount code is used during checkout, customers get this error when being sent to PayPal for the final step.
"The link you have used to enter the PayPal system contains an incorrectly formatted item amount."
Never encountered this before 1.5.x and I can't get too much useful info on Google. Please help, thanks!
I've confirmed that this issue also occurs on a clean installation of opencart 1.5.0.5. The key to reproduce this issue is to set free shipping. Then any discount won't work!
Hi guys,
A client of mine was having the exact same issue with her installation of OC v1.5.0.5.
After some testing I noted that the PayPal 'incorrectly formatted' error occurs when:
- A coupon or negatively priced item is applied to the shopping cart, and
- The total value of the negatively priced items exceed the price of shipping
I have tracked down the relevant file within the OpenCart system that communicates with PayPal's servers. Currently it itemises orders, which in the above circumstances causes the error. Although their technical manual suggests otherwise, PayPal does not accept negatively priced items.
My suggested fix is to modify this file and send order payment information as a lump sum - rather then item by item. This would avoid the occurrence of any negative values as any coupons would have already been applied. Not great - but it is a working fix.
1. Download the following file: catalog/controller/payment/pp_standard.php
2. Make a copy of the file for for backup purposes
3. Find the following block of code and delete it (or comment it out):
4. Find the following line of code:
and replace it with:
5. Find the following line of code:
and replace it with:
(feel free to replace the wording within the inverted commas)
6. Commit the file to the server, overriding the old version of pp_standard.php
A client of mine was having the exact same issue with her installation of OC v1.5.0.5.
After some testing I noted that the PayPal 'incorrectly formatted' error occurs when:
- A coupon or negatively priced item is applied to the shopping cart, and
- The total value of the negatively priced items exceed the price of shipping
I have tracked down the relevant file within the OpenCart system that communicates with PayPal's servers. Currently it itemises orders, which in the above circumstances causes the error. Although their technical manual suggests otherwise, PayPal does not accept negatively priced items.
My suggested fix is to modify this file and send order payment information as a lump sum - rather then item by item. This would avoid the occurrence of any negative values as any coupons would have already been applied. Not great - but it is a working fix.
1. Download the following file: catalog/controller/payment/pp_standard.php
2. Make a copy of the file for for backup purposes
3. Find the following block of code and delete it (or comment it out):
Code: Select all
foreach ($this->cart->getProducts() as $product) {
$option_data = array();
foreach ($product['option'] as $option) {
$option_data[] = array(
'name' => $option['name'],
'value' => $option['option_value']
);
}
$this->data['products'][] = array(
'name' => $product['name'],
'model' => $product['model'],
'price' => $this->currency->format($product['price'], $currency, false, false),
'quantity' => $product['quantity'],
'option' => $option_data,
'weight' => $product['weight']
);
}
Code: Select all
'price' => $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $currency, false, false),
Code: Select all
'price' => $this->currency->format($order_info['total'], $currency, false, false),
Code: Select all
'name' => $this->language->get('text_total'),
Code: Select all
'name' => "Order total",
6. Commit the file to the server, overriding the old version of pp_standard.php
I did follow the above solution , but I still get the error , just to note that the step #4 was already fixed by me , maybe I have a newer version than yours.
anyway I still have the above issue
dormeasy.com
anyway I still have the above issue
Code: Select all
$this->data['products'] = array();
/* foreach ($this->cart->getProducts() as $product) {
$option_data = array();
foreach ($product['option'] as $option) {
$option_data[] = array(
'name' => $option['name'],
'value' => $option['option_value']
);
}
$this->data['products'][] = array(
'name' => $product['name'],
'model' => $product['model'],
'price' => $this->currency->format($product['price'], $currency, false, false),
'quantity' => $product['quantity'],
'option' => $option_data,
'weight' => $product['weight']
);
} */
'price' => $this->currency->format($order_info['total'], $currency, false, false),
$this->data['discount_amount_cart'] = 0;
$total = $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $currency, false, false);
if ($total > 0) {
$this->data['products'][] = array(
// 'name' => $this->language->get('text_total'),
'name' => "Order total",
'model' => '',
'price' => $total,
'quantity' => 1,
'option' => array(),
'weight' => 0
Shemuel, the code you posted above isn't syntactically correct. Did you copy and paste this directly from your OpenCart system?
Immediately below the commented-out lines, you have:
I haven't run your code, but I'm certain you would get a PHP error that would halt the processing of the script.
You'll need to comment the above line out or remove it completely.
As for the possibility of a newer version - my fix is for version 1.5.0.5. Please check what version you have (this will be apart of the name of the installation ZIP file). I can't guarantee this will work for other versions.
Let me know how you go.
Immediately below the commented-out lines, you have:
Code: Select all
'price' => $this->currency->format($order_info['total'], $currency, false, false),
You'll need to comment the above line out or remove it completely.
As for the possibility of a newer version - my fix is for version 1.5.0.5. Please check what version you have (this will be apart of the name of the installation ZIP file). I can't guarantee this will work for other versions.
Let me know how you go.
Thanks for your reply , my version is 1.5.1.1
here is the full text of the file I would appreciateit if you can find a solution. at this point paypal works but we get the above error.
here is the full text of the file I would appreciateit if you can find a solution. at this point paypal works but we get the above error.
Code: Select all
<?php
class ControllerPaymentPPStandard extends Controller {
protected function index() {
$this->language->load('payment/pp_standard');
$this->data['text_testmode'] = $this->language->get('text_testmode');
$this->data['button_confirm'] = $this->language->get('button_confirm');
$this->data['testmode'] = $this->config->get('pp_standard_test');
if (!$this->config->get('pp_standard_test')) {
$this->data['action'] = 'https://www.paypal.com/cgi-bin/webscr';
} else {
$this->data['action'] = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
}
$this->load->model('checkout/order');
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
if ($order_info) {
$currencies = array(
'AUD',
'CAD',
'EUR',
'GBP',
'JPY',
'USD',
'NZD',
'CHF',
'HKD',
'SGD',
'SEK',
'DKK',
'PLN',
'NOK',
'HUF',
'CZK',
'ILS',
'MXN',
'MYR',
'BRL',
'PHP',
'TWD',
'THB',
'TRY'
);
if (in_array($order_info['currency_code'], $currencies)) {
$currency = $order_info['currency_code'];
} else {
$currency = 'USD';
}
$this->data['business'] = $this->config->get('pp_standard_email');
$this->data['item_name'] = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
$this->data['products'] = array();
foreach ($this->cart->getProducts() as $product) {
$option_data = array();
foreach ($product['option'] as $option) {
$option_data[] = array(
'name' => $option['name'],
'value' => $option['option_value']
);
}
$this->data['products'][] = array(
'name' => $product['name'],
'model' => $product['model'],
'price' => $this->currency->format($product['price'], $currency, false, false),
'quantity' => $product['quantity'],
'option' => $option_data,
'weight' => $product['weight']
);
}
$this->data['discount_amount_cart'] = 0;
$total = $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $currency, false, false);
if ($total > 0) {
$this->data['products'][] = array(
'name' => $this->language->get('text_total'),
'model' => '',
'price' => $total,
'quantity' => 1,
'option' => array(),
'weight' => 0
);
} else {
$this->data['discount_amount_cart'] -= $this->currency->format($total, $currency, FALSE, FALSE);
}
$this->data['currency_code'] = $currency;
$this->data['first_name'] = html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8');
$this->data['last_name'] = html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
$this->data['address1'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8');
$this->data['address2'] = html_entity_decode($order_info['payment_address_2'], ENT_QUOTES, 'UTF-8');
$this->data['city'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
$this->data['zip'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
$this->data['country'] = $order_info['payment_iso_code_2'];
$this->data['notify_url'] = $this->url->link('payment/pp_standard/callback');
$this->data['email'] = $order_info['email'];
$this->data['invoice'] = $this->session->data['order_id'] . ' - ' . html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
$this->data['lc'] = $this->session->data['language'];
$this->data['return'] = $this->url->link('checkout/success');
$this->data['notify_url'] = $this->url->link('payment/pp_standard/callback');
$this->data['cancel_return'] = $this->url->link('checkout/checkout', '', 'SSL');
if (!$this->config->get('pp_standard_transaction')) {
$this->data['paymentaction'] = 'authorization';
} else {
$this->data['paymentaction'] = 'sale';
}
$this->load->library('encryption');
$encryption = new Encryption($this->config->get('config_encryption'));
$this->data['custom'] = $encryption->encrypt($this->session->data['order_id']);
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/pp_standard.tpl')) {
$this->template = $this->config->get('config_template') . '/template/payment/pp_standard.tpl';
} else {
$this->template = 'default/template/payment/pp_standard.tpl';
}
$this->render();
}
}
public function callback() {
$this->load->library('encryption');
$encryption = new Encryption($this->config->get('config_encryption'));
if (isset($this->request->post['custom'])) {
$order_id = $encryption->decrypt($this->request->post['custom']);
} else {
$order_id = 0;
}
$this->load->model('checkout/order');
$order_info = $this->model_checkout_order->getOrder($order_id);
if ($order_info) {
$request = 'cmd=_notify-validate';
foreach ($this->request->post as $key => $value) {
$request .= '&' . $key . '=' . urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
}
if (!$this->config->get('pp_standard_test')) {
$curl = curl_init('https://www.paypal.com/cgi-bin/webscr');
} else {
$curl = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
}
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($curl);
if (!$response) {
$this->log->write('PP_STANDARD :: CURL failed ' . curl_error($curl) . '(' . curl_errno($curl) . ')');
}
if ($this->config->get('pp_standard_debug')) {
$this->log->write('PP_STANDARD :: IPN REQUEST: ' . $request);
$this->log->write('PP_STANDARD :: IPN RESPONSE: ' . $response);
}
if ((strcmp($response, 'VERIFIED') == 0 || strcmp($response, 'UNVERIFIED') == 0) && isset($this->request->post['payment_status'])) {
$order_status_id = $this->config->get('config_order_status_id');
switch($this->request->post['payment_status']) {
case 'Canceled_Reversal':
$order_status_id = $this->config->get('pp_standard_canceled_reversal_status_id');
break;
case 'Completed':
if ((float)$this->request->post['mc_gross'] == $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false)) {
$order_status_id = $this->config->get('pp_standard_completed_status_id');
}
break;
case 'Denied':
$order_status_id = $this->config->get('pp_standard_denied_status_id');
break;
case 'Expired':
$order_status_id = $this->config->get('pp_standard_expired_status_id');
break;
case 'Failed':
$order_status_id = $this->config->get('pp_standard_failed_status_id');
break;
case 'Pending':
$order_status_id = $this->config->get('pp_standard_pending_status_id');
break;
case 'Processed':
$order_status_id = $this->config->get('pp_standard_processed_status_id');
break;
case 'Refunded':
$order_status_id = $this->config->get('pp_standard_refunded_status_id');
break;
case 'Reversed':
$order_status_id = $this->config->get('pp_standard_reversed_status_id');
break;
case 'Voided':
$order_status_id = $this->config->get('pp_standard_voided_status_id');
break;
}
if (!$order_info['order_status_id']) {
$this->model_checkout_order->confirm($order_id, $order_status_id);
} else {
$this->model_checkout_order->update($order_id, $order_status_id);
}
} else {
$this->model_checkout_order->confirm($order_id, $this->config->get('config_order_status_id'));
}
curl_close($curl);
}
}
}
?>
Shemuel, comment out this part of your code and try it again:Shemuel wrote:Thanks for your reply , my version is 1.5.1.1
here is the full text of the file I would appreciateit if you can find a solution. at this point paypal works but we get the above error.
Code: Select all
<?php class ControllerPaymentPPStandard extends Controller { protected function index() { $this->language->load('payment/pp_standard'); $this->data['text_testmode'] = $this->language->get('text_testmode'); $this->data['button_confirm'] = $this->language->get('button_confirm'); $this->data['testmode'] = $this->config->get('pp_standard_test'); if (!$this->config->get('pp_standard_test')) { $this->data['action'] = 'https://www.paypal.com/cgi-bin/webscr'; } else { $this->data['action'] = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; } $this->load->model('checkout/order'); $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); if ($order_info) { $currencies = array( 'AUD', 'CAD', 'EUR', 'GBP', 'JPY', 'USD', 'NZD', 'CHF', 'HKD', 'SGD', 'SEK', 'DKK', 'PLN', 'NOK', 'HUF', 'CZK', 'ILS', 'MXN', 'MYR', 'BRL', 'PHP', 'TWD', 'THB', 'TRY' ); if (in_array($order_info['currency_code'], $currencies)) { $currency = $order_info['currency_code']; } else { $currency = 'USD'; } $this->data['business'] = $this->config->get('pp_standard_email'); $this->data['item_name'] = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8'); $this->data['products'] = array(); foreach ($this->cart->getProducts() as $product) { $option_data = array(); foreach ($product['option'] as $option) { $option_data[] = array( 'name' => $option['name'], 'value' => $option['option_value'] ); } $this->data['products'][] = array( 'name' => $product['name'], 'model' => $product['model'], 'price' => $this->currency->format($product['price'], $currency, false, false), 'quantity' => $product['quantity'], 'option' => $option_data, 'weight' => $product['weight'] ); } $this->data['discount_amount_cart'] = 0; $total = $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $currency, false, false); if ($total > 0) { $this->data['products'][] = array( 'name' => $this->language->get('text_total'), 'model' => '', 'price' => $total, 'quantity' => 1, 'option' => array(), 'weight' => 0 ); } else { $this->data['discount_amount_cart'] -= $this->currency->format($total, $currency, FALSE, FALSE); } $this->data['currency_code'] = $currency; $this->data['first_name'] = html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8'); $this->data['last_name'] = html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8'); $this->data['address1'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8'); $this->data['address2'] = html_entity_decode($order_info['payment_address_2'], ENT_QUOTES, 'UTF-8'); $this->data['city'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8'); $this->data['zip'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8'); $this->data['country'] = $order_info['payment_iso_code_2']; $this->data['notify_url'] = $this->url->link('payment/pp_standard/callback'); $this->data['email'] = $order_info['email']; $this->data['invoice'] = $this->session->data['order_id'] . ' - ' . html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8'); $this->data['lc'] = $this->session->data['language']; $this->data['return'] = $this->url->link('checkout/success'); $this->data['notify_url'] = $this->url->link('payment/pp_standard/callback'); $this->data['cancel_return'] = $this->url->link('checkout/checkout', '', 'SSL'); if (!$this->config->get('pp_standard_transaction')) { $this->data['paymentaction'] = 'authorization'; } else { $this->data['paymentaction'] = 'sale'; } $this->load->library('encryption'); $encryption = new Encryption($this->config->get('config_encryption')); $this->data['custom'] = $encryption->encrypt($this->session->data['order_id']); if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/pp_standard.tpl')) { $this->template = $this->config->get('config_template') . '/template/payment/pp_standard.tpl'; } else { $this->template = 'default/template/payment/pp_standard.tpl'; } $this->render(); } } public function callback() { $this->load->library('encryption'); $encryption = new Encryption($this->config->get('config_encryption')); if (isset($this->request->post['custom'])) { $order_id = $encryption->decrypt($this->request->post['custom']); } else { $order_id = 0; } $this->load->model('checkout/order'); $order_info = $this->model_checkout_order->getOrder($order_id); if ($order_info) { $request = 'cmd=_notify-validate'; foreach ($this->request->post as $key => $value) { $request .= '&' . $key . '=' . urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8')); } if (!$this->config->get('pp_standard_test')) { $curl = curl_init('https://www.paypal.com/cgi-bin/webscr'); } else { $curl = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); } curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); if (!$response) { $this->log->write('PP_STANDARD :: CURL failed ' . curl_error($curl) . '(' . curl_errno($curl) . ')'); } if ($this->config->get('pp_standard_debug')) { $this->log->write('PP_STANDARD :: IPN REQUEST: ' . $request); $this->log->write('PP_STANDARD :: IPN RESPONSE: ' . $response); } if ((strcmp($response, 'VERIFIED') == 0 || strcmp($response, 'UNVERIFIED') == 0) && isset($this->request->post['payment_status'])) { $order_status_id = $this->config->get('config_order_status_id'); switch($this->request->post['payment_status']) { case 'Canceled_Reversal': $order_status_id = $this->config->get('pp_standard_canceled_reversal_status_id'); break; case 'Completed': if ((float)$this->request->post['mc_gross'] == $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false)) { $order_status_id = $this->config->get('pp_standard_completed_status_id'); } break; case 'Denied': $order_status_id = $this->config->get('pp_standard_denied_status_id'); break; case 'Expired': $order_status_id = $this->config->get('pp_standard_expired_status_id'); break; case 'Failed': $order_status_id = $this->config->get('pp_standard_failed_status_id'); break; case 'Pending': $order_status_id = $this->config->get('pp_standard_pending_status_id'); break; case 'Processed': $order_status_id = $this->config->get('pp_standard_processed_status_id'); break; case 'Refunded': $order_status_id = $this->config->get('pp_standard_refunded_status_id'); break; case 'Reversed': $order_status_id = $this->config->get('pp_standard_reversed_status_id'); break; case 'Voided': $order_status_id = $this->config->get('pp_standard_voided_status_id'); break; } if (!$order_info['order_status_id']) { $this->model_checkout_order->confirm($order_id, $order_status_id); } else { $this->model_checkout_order->update($order_id, $order_status_id); } } else { $this->model_checkout_order->confirm($order_id, $this->config->get('config_order_status_id')); } curl_close($curl); } } } ?>
Code: Select all
foreach ($this->cart->getProducts() as $product) {
$option_data = array();
foreach ($product['option'] as $option) {
$option_data[] = array(
'name' => $option['name'],
'value' => $option['option_value']
);
}
$this->data['products'][] = array(
'name' => $product['name'],
'model' => $product['model'],
'price' => $this->currency->format($product['price'], $currency, false, false),
'quantity' => $product['quantity'],
'option' => $option_data,
'weight' => $product['weight']
);
}
Who is online
Users browsing this forum: No registered users and 6 guests