Наш программист такое делал. Но сейчас он временно недоступен так что работоспособность кода проверить не получится, но должно работать, попробуйте:
<?php
$db1 = new ps_DB();
$q = 'SELECT country_2_code FROM #__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');
$order_currency = $db->f('order_currency');
$order_subtotal = $db->f('order_subtotal');
$order_shipping = $db->f('order_shipping');
$paypal_currency = array('AUD', 'CAD', 'JPY', 'USD', 'EUR', 'GBP'); // Список валют, которые принимает PayPal
$convert_currency = 'USD'; // К этой валюте будем конвертировать сумму заказа, если валюта не поддерживается PayPal
if(!in_array($order_currency, $paypal_currency))
{
$currency_code = $convert_currency;
$ord_amount = round(($GLOBALS['CURRENCY']->convert($order_subtotal, $order_currency, $convert_currency)
+ $GLOBALS['CURRENCY']->convert($tax_total, $order_currency, $convert_currency)
- $GLOBALS['CURRENCY']->convert($discount_total, $order_currency, $convert_currency)), 2);
$ord_shipping = sprintf('%.2f', ($GLOBALS['CURRENCY']->convert($order_shipping, $order_currency, $convert_currency)));
}
else
{
$currency_code = $order_currency;
$ord_amount = round($order_subtotal+$tax_total-$discount_total, 2);
$ord_shipping = sprintf('%.2f', $order_shipping);
}
$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' => $ord_amount,
'shipping' => $ord_shipping,
'currency_code' => $currency_code,
'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('user_email'),
'night_phone_b' => $dbbt->f('phone_1'),
'cpp_header_image' => $vendor_image_url,
'charset' => 'utf-8',
'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="'.htmlspecialchars($value).'" />';
}
echo '</form>';
}
?>
Однако это не решит всей проблемы, это только половина решения. Дело в том, что PayPal перед тем как снять деньги с карты покупателя, присылает на ваш магазин запрос на разрешение платежа. На скрипт notify.php Мы должны проверить данные и разрешить платеж или не разрешить.
Пример 1:
Сумма заказа $20, валюта принимается так что не конвертируем
Передаем в PayPal номер заказа 10, сумма $20
PayPal отправляет нашему магазину запрос на разрешение платежа, заказ 10, сумма $20
Проверяем номер заказа и сумму, все верно, разрешаем платеж
Пример 2:
Сумма заказа 500 рублей, валюта не принимается, конвертируем по курсу $1 = 30 руб., ~ $16.67
Передаем в PayPal номер заказа 11, сумма $16.67
PayPal отправляет нашему магазину запрос на разрешение платежа, заказ 11, сумма $16.67
Проверяем номер заказа и сумму, - у нас в базе данных сумма этого заказа - 500 руб, а PayPal прислал сумму $16.67 - не совпадает.
Как проверить, что сумма правильная? Конвертировать обратно в рубли?
Но будет потеря точности 16.67*30 = 500.1, и это учитывая, что курс валют тот же самый.
Наверное, правильнее конвертировать сумму заказа также как мы делали при отправке на PayPal.
Курс валют берется с какого-то сайта банка. Например, курс валют в банке обновляется в 00:00
А если, например, покупатель сделал заказ в 23:59, а перешел к оплате в 00:01 (то есть как раз в момент смены валют) - курс валют уже другой. Еще потеря точности.