News:

Support the VirtueMart project and become a member

Main Menu

Paypal Direct Payment does not work correctly

Started by klattr1, January 25, 2011, 02:19:09 AM

Previous topic - Next topic

klattr1

Website: http://www.deatschwerks.ryanklatt.com

I'm using Joomla 1.5.18 and VirtueMart 1.1.5 and am having an issue with the "Direct Payment" option. When disabled, the credit card fields still show up. When enabled, it directs the user to paypal after hitting "Next".

Anytime I leave the credit card fields blank, it shows "Error: Credit card number not found!" - which I expect to show up; just pointing that out as the validation check seems to be working...but as soon as I enter correct credit card information and hit "Next", it goes to Paypal instead of the "Complete Order" screen.

I have verified that my Paypal merchant account is indeed a "Website Payments Pro" merchant account. Debug code doesn't anything obvious as well.

I've also tried the potential fix in this thread but had no luck: http://forum.virtuemart.net/index.php?topic=77067.0

Below is what I'm using in the payment extra info:

<?php
$url 
"https://www.paypal.com/cgi-bin/webscr";
$order_id $db->f("order_id");
$tax_total $db->f("order_tax") + $db->f("order_shipping_tax");
$discount_total $db->f("coupon_discount") + $db->f("order_discount");  

// Query for Order Items
$dboi = new ps_DB;
$q_oi "SELECT * FROM #__vm_order_item ";
$q_oi .= "WHERE #__vm_order_item.order_id='$order_id'";
$dboi->query($q_oi);

$row_num $dboi->num_rows();

//New code Getting Cart Items
$auth $_SESSION['auth'];
$cart $_SESSION['cart'];
$t_quantity 0;
$disc_perItem 0;
$i=1;

// Query to get User Info
$dbb = new ps_DB;
$q "SELECT * FROM #__vm_user_info ";
$q .= "WHERE user_id ='".$my->id."' ";
$dbb->setQuery($q);
$dbb->query();

//New Code
$discount_totalCP $db->f("coupon_discount") + $db->f("order_discount");

while(
$dboi->next_record()) {
  
$t_quantity $t_quantity intval($dboi->f("product_quantity"));
}

$dboi null;
$dboi = new ps_DB;
$dboi->query($q_oi);

if(
$t_quantity 0)
{
  if(
$discount_totalCP 0) {
    
$disc_perItem round($discount_totalCP $t_quantity2);
  }
  else {
    
$disc_perItem 0;
  }
}
else {
  
$disc_perItem 0;
}

while(
$dboi->next_record()) {

  
$prod_attrib $dboi->f("product_attribute");
  
$supp_var['item_name_' $i] = strip_tags($dboi->f("order_item_name"));
  
  if(
$prod_attrib ''){
    
$attributes_array explode('<br/>',$prod_attrib);
    
$v 0;
    
$z 1;
    foreach ( 
$attributes_array as $attributes_value){
      
$attrib_name trim(substr($attributes_value0strpos($attributes_value':')), " ");
      
$supp_var['on' $z '_' $i] = $attrib_name;
      
$attrib_sel trim(substr_replace(substr_replace($attributes_value""0strrpos($attributes_value':')), ""02));
      
$supp_var['os' $z '_' $i] = $attrib_sel;
      
$v++;
      
$z++;
      unset(
$attributes_value);
    }
  }

//  $supp_var['item_number_' . $i] = $dboi->f("order_item_sku");
  
$supp_var['quantity_' $i] = $dboi->f("product_quantity");
  
$supp_var['amount_' $i] = round($dboi->f("product_item_price"),2);
  
$i++;
}
//End New Code


//Start New Code - Ship to Address Versus Bill To Address

//Query used to compare Bill to versus Shipp to address
$dboui = new ps_DB;
$q_oui "SELECT * FROM #__vm_order_user_info ";
$q_oui .= "WHERE #__vm_order_user_info.order_id='$order_id' ORDER BY #__vm_order_user_info.order_info_id DESC";
$dboui->query($q_oui);

$oui_id $dboui->f("order_info_id");

if(
$oui_id == $order_id){
  
$first_name $dbb->f("first_name");
  
$last_name $dbb->f("last_name");
  
$address1 $dbb->f("address_1");
  
$address2 $dbb->f("address_2");
  
$city $dbb->f("city");
  
$state $dbb->f("state");
  
$address_country $dbbt->f("country");
  
$zip $dbb->f("zip");
  
$H_PhoneNumber $dbb->f("phone_1");
}
else {
  
$first_name $dboui->f("first_name");
  
$last_name $dboui->f("last_name");
  
$address1 $dboui->f("address_1");
  
$address2 $dboui->f("address_2");
  
$city $dboui->f("city");
  
$state $dboui->f("state");
  
$address_country $dboui->f("country");
  
$zip $dboui->f("zip");
  
$H_PhoneNumber $dboui->f("phone_1");
}
//End New Code

// seiko - adding to determine country_2_code for PayPal
$db1 = new ps_DB();
$q "SELECT country_2_code FROM #__vm_country WHERE country_3_code='".$address_country."' ORDER BY country_2_code ASC";
$db1->query($q);
$country2code $db1->f('country_2_code');
//End New Code

// Builds array for the form
$post_variables = Array(
"cmd" => "_cart",
"upload" => "1",
//"page_style" => "paypal",
"business" => PAYPAL_EMAIL,
"currency_code" => $_SESSION['vendor_currency'],
//"amount" => round( $db->f("order_subtotal")+$tax_total-$discount_total, 2),
"amount" => round$db->f("order_subtotal"), 2),
//"handling_cart" => sprintf("%.2f", $db->f("order_shipping")),
"shipping_1" => sprintf("%.2f"$db->f("order_shipping")),
//"tax" => $tax_total,
"tax_cart" => $tax_total,
"discount_amount_cart" => $discount_total,
"invoice" => $db->f("order_number"),
//"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",
"no_shipping" => "1",
//"no_note" => "1",
"email" => $dbb->f("user_email"),
"address_override" => "1",
"first_name" => $first_name,
"last_name" => $last_name,
"address1" => $address1,
"address2" => $address2,
"city" => $city,
"state" => $state,
"address_country" => $address_country,
"zip" => $zip,
"night_phone_b" => $H_PhoneNumber,
"cpp_header_image" => $vendor_image_url,
);

if( 
$page == "checkout.thankyou" ) {
  
$query_string "?";

  foreach( 
$post_variables as $name => $value ) {
    
$query_string .= $name"=" urlencode($value) ."&";
  }

  if(
is_array($supp_var) && count($supp_var)) {
    foreach(
$supp_var as $name => $value) {
      
$query_string .= $name"=" urlencode($value) ."&";
    }
  }

  
vmRedirect$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.'" />';
  }
  
  if(
is_array($supp_var) && count($supp_var)) {
    foreach(
$supp_var as $name => $value) {
      echo 
'<input type="hidden" name="'.$name.'" value="'.$value.'" />';
    }
  }
  echo 
'<input type="image" name="submit" src="https://www.paypal.com/en_US/i/btn/x-click-but6.gif" border="0" alt="Make payments with PayPal, it is fast, free, and secure!">';
  echo 
'</form>';
}
?>


Should I be using the paypal pro that comes with VirtueMart by default or should I use Vantage Technic's module instead? http://www.vantagetechnic.com/products/paypalpro.xml

[attachment cleanup by admin]

zanardi

There is some confusion.

Since 1.1.5 there are two different PayPal payment modules:
- LEGACY, which uses form with hidden fields
- API, which uses PayPal API interaction
"Extra info" is a feature of LEGACY payment module while "Enable direct payment" is a feature of API payment module. You should not use both.

Vantage Technic module is a predecessor of the one included in VM 1.1.5. You will notice that last release of Van.Tec. module is July 2010, when 1.1.5 was released.

Some bugs are still there and need fixing. I just fixed in another thread (where you posted before) the problem about "Enable direct payment" option being ignored. Now i will proceed with other fixes.
--
Francesco (zanardi)
http://extensions.gibilogic.com
@gibilogic on Twitter

klattr1

it is now working! I went with Vantage Technic's Paypal module and now both direct payment and express work!