Looking at their API it seems that the number should start with 1 and not 0 when indexing the items. Actually that is a bit vague. I also see they have changed the name of L_AMT to L_COST it appears, and L_NUMBER to L_SKU. Although lower on the page it says to use L_AMT for amex transactions and says it only allows up to 6 items. The doc is a bit confusing:
https://developer.paypal.com/docs/classic/payflow/integration-guide/#payflow-connection-parameters
I think we should try changing the variable names and the indexing:
$vars[] = 'L_NAME' . ($item_count+1) . '=' . urlencode(substr(strip_tags($cart->DisplayInfo("Name")), 0, 127));
$vars[] = 'L_SKU' . ($item_count+1) . '=' . urlencode(substr($cart->DisplayInfo("ID"), 0, 127));
$vars[] = 'L_DESC' . ($item_count+1) . '=' . urlencode(substr(strip_tags($cart->DisplayInfo("Description")), 0, 127));
$vars[] = 'L_COST' . ($item_count+1) . '=' . urlencode(number_format($cart->DisplayInfo("Price"), 2, '.', ''));
$vars[] = 'L_QTY' . ($item_count+1) . '=' . urlencode($cart->DisplayInfo("Quantity"));
If that doesn't work, maybe leave the indexing and change just the variable names:
$vars[] = 'L_NAME' . ($item_count) . '=' . urlencode(substr(strip_tags($cart->DisplayInfo("Name")), 0, 127));
$vars[] = 'L_SKU' . ($item_count) . '=' . urlencode(substr($cart->DisplayInfo("ID"), 0, 127));
$vars[] = 'L_DESC' . ($item_count) . '=' . urlencode(substr(strip_tags($cart->DisplayInfo("Description")), 0, 127));
$vars[] = 'L_COST' . ($item_count) . '=' . urlencode(number_format($cart->DisplayInfo("Price"), 2, '.', ''));
$vars[] = 'L_QTY' . ($item_count) . '=' . urlencode($cart->DisplayInfo("Quantity"));
If that still doesn't work we will want to send that request to paypal support and see if they can shed some light on why it doesn't work at that point since their documentation is a bit confusing on the subject.