1

この支払い拡張機能をインストールした後、注文グリッドに支払いゲートウェイからの注文ステータスを表示する別の列があるカスタム支払い方法を作成しました。

要件は、グリッド内の注文が、配送済み処理中などの特定の支払いゲートウェイのステータスにある場合にキャンセルされないようにすることです。支払いゲートウェイのステータスが保留中の場合、注文はキャンセルされる必要があります。

注文のキャンセルを求める支払いゲートウェイへの API 呼び出しを行う必要があります。注文が保留中の場合、注文はキャンセルされます。注文が保留中でない場合、API はエラー コードとエラー メッセージを含む応答をスローし、注文をキャンセルできないことを伝えます。

すべての API 呼び出しを処理する PHP ライブラリがあります。上記の場合、注文をキャンセルできない場合に cancelOrder API サービスを呼び出すと、PHP ライブラリは API のエラー コードを例外コードとして、エラー メッセージを例外メッセージとして使用して例外をスローします。

このために、Order_save_before イベントを処理する Observer を実装しました。オブザーバーでは、PHP ライブラリの cancelOrder() メソッド (内部的に cancelOrder API 呼び出しを行う) を使用するコードを書きました。支払いゲートウェイのステータスが保留中の場合、注文はキャンセルされ、キャンセルできない場合は例外がスローされます。

支払い方法で作成された個々の注文を開き、キャンセル ボタンをクリックして注文をキャンセルすると、例外がカスケードされ、上部に注文をキャンセルできないという例外メッセージが表示されます。

しかし、注文を選択し、ドロップダウンからキャンセルを選択して送信を押して、注文グリッドから注文をキャンセルしようとすると、例外が発生したという例外ページにページがリダイレクトされます。この場合、注文のキャンセルを元に戻したり、キャンセルを防止したり、例外を処理したりする方法がわかりません。私のコードは以下の通りです。

public function cancelOrderObserver(Varien_Event_Observer $Observer)
{
try
   {
        //code that cancels order if it is pending else throws exception saying cannot cancel order;
   }
catch (Exception $e){
    Mage::throwException(Mage::helper('adminhtml')->__($e->getMessage()));
}

これについて私を助けてください。

この問題についてさらに説明が必要な場合はお知らせください。

4

2 に答える 2

1
order_cancel_after 

この段階で注文はすでにキャンセルされているため、お客様のニーズには合いません。

私は何かを試してみます

order_save_before

注文がキャンセルされたかどうかを確認する必要があります。その場合はキャンセルを解除してください。

更新 1

「キャンセル解除」の主なポイントは、 ->cancel() 呼び出し中に実行されたアクションをロールバックすることでした。

現在、私は他のオプションを考えていました。predispatch 呼び出しを監視して (massCancel アクションに次のイベントが存在する場合)、注文をキャンセルできるかどうかをサービスに確認できます。そうでない場合は、リクエストから注文を削除します。このようなもの。しかし、これについてはよくわかりません。

于 2012-05-02T13:02:03.873 に答える
0

sales_order_save_before イベント:

$_order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);

于 2013-12-16T17:42:04.843 に答える