Cotação de conversão personalizada em pedido - "Não é possível recuperar a instância da forma de pagamento"

10

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_orderou 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();
philwinkle
fonte

Respostas:

7

Você está enviando o pedido

 $quote->getPayment()

seu código deve ficar assim

...

$payment = $convert->paymentToOrderPayment($quote->getPayment());

$order->setPayment($payment);

...
Jeffrey L. Roberts
fonte
Você está certo - foi isso. Boa decisão.
Philwinkle
Estou recebendo um erro PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'The requested Payment Method is not available.' in /var/www/html/app/Mage.php:594. Ativei a forma de pagamento como Pedido de compra e quero criar um novo pedido com custo zero sem forma de pagamento.
Rahul