Vi ocasionalmente o caso em que um pedido é feito, uma autorização é feita para pagamento no cartão do cliente , o cliente recebe um e-mail de confirmação do pedido - mas não existe nenhum pedido no Magento sales_flat_order
ou sales_flat_order_grid
.
A arma escolhida aqui é exigir que o administrador anule o pagamento no gateway, peça ao cliente que substitua.
No entanto, temos todas as cotações, itens de cotação, pagamento de cotação, endereço de cotação. Em teoria, esse pedido é válido, afinal, temos autorização e o cliente tem um email de pedido. O erro ocorreu algum tempo após a geração do email do pedido que causou uma reversão (a teoria atual do trabalho).
Eu criei um script único de teste para converter essa cotação usando um gateway sandbox. No entanto, estou tendo problemas para gerar o pagamento. Eu tentei usar checkmo
, free
, authorizenet
, todos retornam a mesma exceção:
PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'Cannot retrieve payment method instance.' in /var/www/vhosts/magento/app/Mage.php:563
Stack trace:
#0 /var/www/vhosts/magento/app/code/core/Mage/Payment/Model/Info.php(83): Mage::throwException('Cannot retrieve...')
Veja meu código abaixo . Feedback bem-vindo.
<?php
//.... stuff
$quote = Mage::getModel('sales/quote')->load(745);
$convert = Mage::getModel('sales/convert_quote');
$order = $convert->toOrder($quote);
$order->addressToOrder($quote->getAddress(),$order);
foreach($quote->getAllItems() as $item){
$orderItem = $convert->itemToOrderItem($item);
if ($item->getParentItem()) {
$orderItem->setParentItem($order->getItemByQuoteItemId($item->getParentItem()->getId()));
}
$order->addItem($orderItem);
}
$data = array(
'method' => 'authorizenet',
'cc_type' => 'VI',
'cc_number' => '4111111111111111',
'cc_exp_month' => '1',
'cc_exp_year' => (date('Y') + 6),
'cc_cid' => '444'
);
$quote->getShippingAddress()->setPaymentMethod('authorizenet');
$quote->getShippingAddress()->setCollectShippingRates(true);
$payment = $quote->getPayment();
$payment->importData($data);
$quote->save();
$payment = $convert->paymentToOrderPayment($quote->getPayment());
$order->setPayment($quote->getPayment());
$message = '[Notice] - Order converted from quote manually';
$order->addStatusToHistory($order->getStatus(), $message);
$order->place();
$order->save();
$quote->setIsActive(false)->save();