Отправьте информацию о заказе на сторонний платежный шлюз.
Вопрос
Мне нужно создать новый платежный модуль, который перенаправляет на сторонний платежный шлюз.
Когда клиент нажимает кнопку «ОПЛАТИТЬ», параметры POST (детали заказа) должны быть отправлены на шлюз.(И затем после успешного/неуспешного платежа клиент должен быть перенаправлен на страницу успеха/отмены соответственно.)
Согласно инструкциям провайдера шлюза An easy way to implement this functionality is to insert fields of type hidden at the e-shop payment form. These fields would contain values about the merchant, amount, payment details etc. For example:
<form action="https://www.gateway.com/.../" method="post" ID="Form1">
<input type="hidden" id="AmountToPay" name="AmountToPay" value="amount"/>
<input type="hidden" id="AmountCurrency" name="AmountCurrency" value="currency"/>
<input type="hidden" id="Details1" name="Details1" value="details"/>
<input type="hidden" id="Details2" name="Details2" value="orderID"/>
<input type="hidden" id="PayToMerchant" name="PayToMerchant" value="merchantID"/>
<input type="hidden" id="MerchantName" name="MerchantName" value="merchant"/>
<input type="hidden" id="PaymentOKURL" name="PaymentOKURL" value="https://shop.com/e-shopOK.html"/>
<input type="hidden" id="PaymentFailURL" name="PaymentFailURL" value="https://eshop.com/e-shopCancel.html"/>
</form>
Поскольку мои знания в Magento несколько ограничены, у меня возникли проблемы с переводом этого в работающий модуль Magento.
В ходе исследований я нашел несколько возможных решений, но не уверен, какое из них правильное (и как их реализовать):
1.
$client = new Varien_Http_Client('http://www.example.com/');
$client->setMethod(Varien_Http_Client::POST);
$client->setParameterPost('name', $name);
$client->setParameterPost('address', $address);
//more parameters
try{
$response = $client->request();
if ($response->isSuccessful()) {
echo $response->getBody();
}
} catch (Exception $e) {
}
2.
public function automatic(Varien_Event_Observer $observer) {
$orderIds = $observer->getEvent()->getOrderIds();
if (empty($orderIds) || !is_array($orderIds)) {
return;
}
foreach ($orderIds as $eachOrderId) {
$order = Mage::getModel('sales/order')->load($eachOrderId);
//right our third party code
client = new Zend_Http_Client();
$client->setUri('http://eshop.com');
$client->>setParameterPost(array(
'api_key' => 'yourapi',
'apikey' => 'xxxx',
'message' => $message,
'order_id' => $order_id,
...//more params
));
$response = $client->request('POST');
// Yet another way of preforming a POST request
$client->setMethod(Zend_Http_Client::POST);
if (!$response->isSuccessful()) {
Mage::log($response);
}
}
return $this;
}
и т. д. и т. д.
Я знаю, что это не очень конкретный вопрос, но есть ли какие-нибудь рекомендации о том, как я могу добиться этого правильно?
РЕДАКТИРОВАТЬ
Следуя некоторым урокам, я создал модуль оплаты, который на данный момент выглядит так: Платежный шлюз
С уважением...
Решение
<?php $_order = new Mage_Sales_Model_Order();
$orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
$_order->loadByIncrementId($orderId);
$amountToPay = $_order->getBaseGrandTotal();
?>
<form action='https://www.gateway.com/.../' method='post'>
<input id='AmountToPay' name='AmountToPay' value="<?php echo $amountToPay; ?>" type='hidden' />
<input id='Details2' name='Details2' value='<?php echo $orderId; ?>' type='hidden' />
</form>
и так далее с остальными полями формы...