Converti preventivo personalizzato in ordine - "Impossibile recuperare l'istanza del metodo di pagamento"


10

Ho visto occasionalmente il caso in cui viene effettuato un ordine, viene emessa un'autorizzazione per il pagamento sulla carta cliente, il cliente riceve un'e - mail di conferma dell'ordine - ma non esiste alcun ordine in Magento sales_flat_ordero sales_flat_order_grid.

L'arma di scelta qui è richiedere all'amministratore di annullare il pagamento nel gateway, chiedere al cliente di sostituirlo.

Tuttavia, abbiamo tutti preventivi, articoli di preventivo, pagamento di preventivo, indirizzo di preventivo. In teoria questo ordine è valido, dopotutto, abbiamo l'autorizzazione e il cliente ha un'e-mail di ordine. L'errore si è verificato dopo la generazione dell'ordine e-mail che ha causato un rollback (l'attuale teoria di funzionamento).

Ho creato uno script di prova una tantum per convertire questa citazione usando un gateway sandbox. Tuttavia, ho problemi a generare il pagamento. Ho cercato di utilizzare checkmo, free, authorizenet, tutto restituire la stessa eccezione:

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...')

Vedi il mio codice qui sotto . Feedback accolto.

<?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();

Risposte:


7

Stai inviando l'ordine

 $quote->getPayment()

il tuo codice dovrebbe apparire così

...

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

$order->setPayment($payment);

...

Hai ragione - era quello. Ottima scelta.
Filwinkle

Ricevo un errore PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'The requested Payment Method is not available.' in /var/www/html/app/Mage.php:594Ho abilitato il metodo di pagamento come Ordine di acquisto e desidero creare un nuovo ordine a costo zero senza metodo di pagamento.
Rahul,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.