VirtueMart Forum

VirtueMart Dev/Coding Central: VM1 (old version) => Virtuemart 1.1 Development (Archiv) => Quality & Testing VirtueMart 1.1.x => Topic started by: aravot on October 19, 2007, 03:58:34 AM

Title: [TRACKER # 1505] PayPal and empty shopping cart
Post by: aravot on October 19, 2007, 03:58:34 AM
Joomla 1.0.13
VirtueMart 1.1 r1002

Until now, due to this error (http://virtuemart.net/index.php?option=com_flyspray&Itemid=83&do=details&task_id=1428&option=com_flyspray&Itemid=83) I used cash on delivery method for testing, today I decided to give PayPal another try, the error has gone however when I get redirected to PayPal to complete payment I get the following message "Error detected - Your shopping cart is empty".

I am testing in sandbox, here is the PayPal code.
<?php
$url 
"https://www.sandbox.paypal.com/cgi-bin/webscr";
$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");
$post_variables = Array(
"cmd" => "_cart",
"upload" => "1",
"business" => PAYPAL_EMAIL,
"receiver_email" => PAYPAL_EMAIL,
"item_name" => $VM_LANG->_PHPSHOP_ORDER_PRINT_PO_NUMBER.": "$db->f("order_id"),
"order_id" => $db->f("order_id"),
"invoice" => $db->f("order_number"),
"amount" => round$db->f("order_subtotal")+$tax_total-$discount_total2),
"shipping" => sprintf("%.2f"$db->f("order_shipping")),
"currency_code" => $_SESSION['vendor_currency'],"first_name" => $dbbt->f('first_name'),
"last_name" => $dbbt->f('last_name'),
"address_street" => $dbbt->f('address_1'),
"address_zip" => $dbbt->f('zip'),
"address_city" => $dbbt->f('city'),
"address_state" => $dbbt->f('state'),
"address_country" => $dbbt->f('country'),
"image_url" => $vendor_image_url,
"return" => SECUREURL ."index.php?option=com_virtuemart&page=checkout.result&order_id=".$db->f("order_id"),
"notify_url" => SECUREURL ."administrator/components/com_virtuemart/notify.php",
"cancel_return" => SECUREURL ."index.php",
"undefined_quantity" => "0",
"test_ipn" => PAYPAL_DEBUG,
"pal" => "NRUBJXESJTY24",
"no_shipping" => "1",
"no_note" => "1"
);
if( 
$page == "checkout.thankyou" ) {
$query_string "?";
foreach( 
$post_variables as $name => $value ) {
$query_string .= $name"=" urlencode($value) ."&";
}
mosRedirect$url $query_string );
} else {

echo 
'<form action="'.$url.'" method="post" target="_blank">';
echo 
'<input type="image" name="submit" src="http://images.paypal.com/images/x-click-but6.gif" border="0" alt="Make payments with PayPal, it is fast, free, and secure!" />';

foreach( 
$post_variables as $name => $value ) {
echo 
'<input type="hidden" name="'.$name.'" value="'.$value.'" />';
}

echo 
'</form>';

}
?>


Is it me or others have same issue.
Title: Re: PayPal and empty shopping cart
Post by: jenkinhill on October 19, 2007, 18:26:09 PM
Confirmed. "Error Detected   Your shopping cart is empty"

Database Version: 4.1.20
PHP Version: 4.4.2
Web Server: Apache
VirtueMart 1.1: Ver. 1002
Joomla! Version: Joomla! 1.0.13 Stable [ Sunglow ]
Title: Re: PayPal and empty shopping cart
Post by: jenkinhill on October 19, 2007, 18:32:51 PM
Added to Tracker.

url: http://virtuemart.net/index.php?do=details&task_id=1505&option=com_flyspray&Itemid=91&option=com_flyspray&Itemid=91
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: patrik60 on October 21, 2007, 17:52:45 PM
hi

change "cmd" => "_cart", 

into

"cmd" => "_xclick",

then it works.

patrik
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: aravot on October 22, 2007, 21:08:17 PM
As suggested by Patrick changing the code from this

"cmd" => "_cart",
to this worked.

"cmd" => "_xclick",

So does this code by Scott Carroll (see link for more)
http://forum.virtuemart.net/index.php?topic=28867.msg88075#msg88075

<?php
$db1 
= new ps_DB();
$q "SELECT country_2_code FROM joom_vm_country WHERE country_3_code='".$user->country."' ORDER BY country_2_code ASC";
$db1->query($q);
$url "https://www.paypal.com/cgi-bin/webscr";
$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");
$post_variables = Array(
"cmd" => "_xclick",
"business" => PAYPAL_EMAIL,
"receiver_email" => PAYPAL_EMAIL,
"item_name" => $VM_LANG->_PHPSHOP_ORDER_PRINT_PO_NUMBER.": "$db->f("order_id"),
"order_id" => $db->f("order_id"),
"invoice" => $db->f("order_number"),
"amount" => round$db->f("order_subtotal")+$tax_total-$discount_total2),
"shipping" => sprintf("%.2f"$db->f("order_shipping")),
"currency_code" => $_SESSION['vendor_currency'],

"address_override" => "1",
"first_name" => $user->first_name,
"last_name" => $user->last_name,
"address1" => $user->address_1,
"address2" => $user->address_2,
"city" => $user->city,
"state" => $user->state,
"zip" => $user->zip,
"country" => $db1->f("country_2_code"),
"email" => $user->user_email,
"night_phone_c" => $user->phone_1,

"cpp_header_image" => "YOUR_IMAGE_FILE",
"return" => SECUREURL ."index.php–option=com_virtuemart&page=checkout.result&order_id=".$db->f("order_id"),
"notify_url" => SECUREURL ."administrator/components/com_virtuemart/notify.php",
"cancel_return" => SECUREURL ."index.php",
"undefined_quantity" => "0",
"test_ipn" => PAYPAL_DEBUG,
"pal" => "NRUBJXESJTY24",
"no_shipping" => "1",
"no_note" => "1"
);
if( 
$page == "checkout.thankyou" ) {
$query_string "˜";
foreach( 
$post_variables as $name => $value ) {
$query_string .= $name"=" urlencode($value) ."&";
}
mosRedirect$url $query_string );
} else {

echo 
'<form action="'.$url.'" method="post" target="_blank">';

foreach( 
$post_variables as $name => $value ) {
echo 
'<input type="hidden" name="'.$name.'" value="'.$value.'" />';
}

echo 
'</form>';

}
?>

Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: patrik60 on October 22, 2007, 23:59:38 PM
The problem with the special characters remains. If you have a character like ä, ö, ü in  your name you will get an other error message on the paypal site. to solve this problem I need the following changes:

"first_name " => $dbbt->f('åçêëèöäöüß'),
"last_name" => $dbbt->f('åçêëèöäöüß'),
"address_street" => $dbbt->f('åçêëèöäöüß'),
"address_zip" => $dbbt->f('zip'),
"address_city" => $dbbt->f('åçêëèöäöüß'),
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Scott Carroll on October 25, 2007, 21:48:38 PM
Okay, the difference is that cmd = "_xclick" will send the entire order as one invoice. It expects the shopping cart software (virtuemart) to have itemized the cart. Whereas cmd = "_cart" is expecting to use paypal's shopping cart software.

So, since we only need paypal as a payment processor, we should have cmd set to _xclick.
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: aravot on October 25, 2007, 21:59:20 PM
Which code to use?
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: aravot on October 26, 2007, 00:00:10 AM
Another change to VM 1.1 default PayPal code based on tracker 1395 (http://virtuemart.net/index.php?option=com_flyspray&Itemid=83&do=details&task_id=1395&pagenum=3&option=com_flyspray&Itemid=83) is to change image_url to cpp_header_image due to PayPal changes
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Scott Carroll on November 01, 2007, 18:00:04 PM
Okay, the code should be:
"cmd" => "_ext-enter",
"redirect_cmd" => "_xclick",


and yes, cpp_header_image works.
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Scott Carroll on November 01, 2007, 22:42:46 PM
Let me know if there are still issues with the following code:

<?php
// Get the 2 character country code
$db1 = new ps_DB();
$q "SELECT country_2_code FROM joom_vm_country WHERE country_3_code='".$user->country."' ORDER BY country_2_code ASC";
$db1->query($q);

$url "https://www.paypal.com/cgi-bin/webscr";

$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");

$post_variables = Array(
"cmd" => "_ext-enter",
"redirect_cmd" => "_xclick",

"cpp_header_image" => $vendor_image_url,
"business" => PAYPAL_EMAIL,
"receiver_email" => PAYPAL_EMAIL,
"item_name" => $VM_LANG->_PHPSHOP_ORDER_PRINT_PO_NUMBER.": "$db->f("order_id"),
"order_id" => $db->f("order_id"),
"invoice" => $db->f("order_number"),
"amount" => round$db->f("order_subtotal")+$tax_total-$discount_total2),
"shipping" => sprintf("%.2f"$db->f("order_shipping")),
"currency_code" => $_SESSION['vendor_currency'],
"address_override" => "1",

"first_name" => $dbbt->f('first_name'),
"last_name" => $dbbt->f('last_name'),
"address_street" => $dbbt->f('address_1'),
"address_zip" => $dbbt->f('zip'),
"address_city" => $dbbt->f('city'),
"address_state" => $dbbt->f('state'),
"address_country" => $db1->f("country_2_code"),

"return" => SECUREURL ."index.php?option=com_virtuemart&page=checkout.result&order_id=".$db->f("order_id"),
"notify_url" => SECUREURL ."administrator/components/com_virtuemart/notify.php",
"cancel_return" => SECUREURL ."index.php",

"undefined_quantity" => "0",
"test_ipn" => PAYPAL_DEBUG,
"pal" => "NRUBJXESJTY24",
"no_note" => "1"
);

if( 
$page == "checkout.thankyou" ) {
$query_string "?";
foreach( 
$post_variables as $name => $value ) {
$query_string .= $name"=" urlencode($value) ."&";
}
mosRedirect$url $query_string );
} else {

echo 
'<form action="'.$url.'" method="post" target="_blank">';
echo 
'<input type="image" name="submit" src="http://images.paypal.com/images/x-click-but6.gif" border="0" alt="Make payments with PayPal, it is fast, free, and secure!" />';

foreach( 
$post_variables as $name => $value ) {
echo 
'<input type="hidden" name="'.$name.'" value="'.$value.'" />';
}

echo 
'</form>';

}
?>
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: aravot on November 01, 2007, 22:50:49 PM
Scott, in revision 1026 Soeren and Greg did some changes to the code I was testing it, which seems to be working OK, are you saying to change that code to the one you posted?
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Scott Carroll on November 02, 2007, 21:34:05 PM
Mine is supposed to propagate the address info. I have received one report that it doesn't. Could you test it more for me. It works for me, using my paypal account - but if someone checks out without a paypal account, I am not 100% sure if it does what it is supposed to by sending address info.
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: milescook on November 05, 2007, 11:00:26 AM
I also don't get my address information carried on to Paypal.  I also get order not found when returning from Paypal, but if I keep refreshing a few seconds later it works.

Joomla 1.5 9292
VM 1.1 1029
MySQL 4.1.15
PHP 4.4.7
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Scott Carroll on November 11, 2007, 16:11:08 PM
OMG,
I just noticed that I posted the wrong code here...
I do have paypal working using the following code:

<?php
$db1 
= new ps_DB();
$q "SELECT country_2_code FROM joom_vm_country WHERE country_3_code='".$user->country."' ORDER BY country_2_code ASC";
$db1->query($q);

$url "https://www.paypal.com/cgi-bin/webscr";

$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");

$post_variables = Array(
"cmd" => "_ext-enter",
"redirect_cmd" => "_xclick",
"business" => PAYPAL_EMAIL,
"receiver_email" => PAYPAL_EMAIL,

"item_name" => $VM_LANG->_PHPSHOP_ORDER_PRINT_PO_NUMBER.": "$db->f("order_id"),
"order_id" => $db->f("order_id"),
"invoice" => $db->f("order_number"),
"amount" => round$db->f("order_subtotal")+$tax_total-$discount_total2),
"shipping" => sprintf("%.2f"$db->f("order_shipping")),
"currency_code" => $_SESSION['vendor_currency'],

"address_override" => "1",
"first_name" => $dbbt->f('first_name'),
"last_name" => $dbbt->f('last_name'),
"address1" => $dbbt->f('address_1'),
"address2" => $dbbt->f('address_2'),
"zip" => $dbbt->f('zip'),
"city" => $dbbt->f('city'),
"state" => $dbbt->f('state'),
"country" => $db1->f('country_2_code'),
"email" => $dbbt->f('email'),
"night_phone_b" => $dbbt->f('phone_1'),
"cpp_header_image" => $vendor_image_url,

"return" => SECUREURL ."index.php?option=com_virtuemart&page=checkout.result&order_id=".$db->f("order_id"),
"notify_url" => SECUREURL ."administrator/components/com_virtuemart/notify.php",
"cancel_return" => SECUREURL ."index.php",
"undefined_quantity" => "0",

"test_ipn" => PAYPAL_DEBUG,
"pal" => "NRUBJXESJTY24",
"no_note" => "1"
);
if( 
$page == "checkout.thankyou" ) {
$query_string "?";
foreach( 
$post_variables as $name => $value ) {
$query_string .= $name"=" urlencode($value) ."&";
}
mosRedirect$url $query_string );
} else {

echo 
'<form action="'.$url.'" method="post" target="_blank">';
echo 
'<input type="image" name="submit" src="http://images.paypal.com/images/x-click-but6.gif" border="0" alt="Make payments with PayPal, it is fast, free, and secure!" />';

foreach( 
$post_variables as $name => $value ) {
echo 
'<input type="hidden" name="'.$name.'" value="'.$value.'" />';
}

echo 
'</form>';

}
?>


I am sorry for the confusion.
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Soeren on February 08, 2008, 10:18:30 AM
Coming back to this...
I have this piece of code, which is your version, but actually I added
"no_shipping" => 1
and $dbbt->f('email') to $dbbt->f('user_email'), which is the real email field.

If we agree on this piece of code, I will update it in SVN.

<?php
$db1 
= new ps_DB();
$q "SELECT country_2_code FROM joom_vm_country WHERE country_3_code='".$user->country."' ORDER BY country_2_code ASC";
$db1->query($q);

$url "https://www.paypal.com/cgi-bin/webscr";
$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");
$post_variables = Array(
"cmd" => "_ext-enter",
"redirect_cmd" => "_xclick",
"upload" => "1",
"business" => PAYPAL_EMAIL,
"receiver_email" => PAYPAL_EMAIL,
"item_name" => $VM_LANG->_('PHPSHOP_ORDER_PRINT_PO_NUMBER').": "$db->f("order_id"),
"order_id" => $db->f("order_id"),
"invoice" => $db->f("order_number"),
"amount" => round$db->f("order_subtotal")+$tax_total-$discount_total2),
"shipping" => sprintf("%.2f"$db->f("order_shipping")),
"currency_code" => $_SESSION['vendor_currency'],

"address_override" => "1",
"first_name" => $dbbt->f('first_name'),
"last_name" => $dbbt->f('last_name'),
"address1" => $dbbt->f('address_1'),
"address2" => $dbbt->f('address_2'),
"address_zip" => $dbbt->f('zip'),
"address_city" => $dbbt->f('city'),
"address_state" => $dbbt->f('state'),
"address_country" => $db1->f('country_2_code'),
"email" => $dbbt->f('user_email'),
"night_phone_b" => $dbbt->f('phone_1'),
"cpp_header_image" => $vendor_image_url,

"return" => SECUREURL ."index.php?option=com_virtuemart&page=checkout.result&order_id=".$db->f("order_id"),
"notify_url" => SECUREURL ."administrator/components/com_virtuemart/notify.php",
"cancel_return" => SECUREURL ."index.php",
"undefined_quantity" => "0",

"test_ipn" => PAYPAL_DEBUG,
"pal" => "NRUBJXESJTY24",
"no_shipping" => "1",
"no_note" => "1"
);
if( 
$page == "checkout.thankyou" ) {
$query_string "?";
foreach( $post_variables as $name => $value ) {
$query_string .= $name"=" urlencode($value) ."&";
}
vmRedirect$url $query_string );
} else {
echo '<form action="'.$url.'" method="post" target="_blank">';
echo '<input type="image" name="submit" src="https://www.paypal.com/en_US/i/btn/x-click-but6.gif" border="0" alt="Click to pay with PayPal - it is fast, free and secure!" />';

foreach( 
$post_variables as $name => $value ) {
echo '<input type="hidden" name="'.$name.'" value="'.$value.'" />';
}
echo 
'</form>';

}
?>


ciao, Sören
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: Mike Sturmey on February 20, 2008, 01:08:09 AM
Hi, I have just tried your script but I get:
Fatal error: Call to undefined function: vmredirect() in /home/cinnabar/public_html/mydomain/administrator/components/com_virtuemart/html/checkout.thankyou.php(83) : eval()'d code on line 50.

I have also tried Scotts script but the country / code  and state is not passed to Paypal - all other fields however seem to be - the customer has to select their country from the drop down list - any ideas? - I am using Paypal Australia

regards

Mike
Title: Re: [TRACKER # 1505] PayPal and empty shopping cart
Post by: patrik60 on February 25, 2008, 23:59:30 PM
I just checked this script:
When using this

"address_zip" => $dbbt->f('zip'),
"address_city" => $dbbt->f('city'),


I get an empty zip and city field at paypal. For me works better:


"zip" => $dbbt->f('zip'),
"city" => $dbbt->f('city'),


Would it also be possible to show order items instead of order number at the paypal site?

Patrik