2011-01-25 20 views
3

注文がキャンセルまたは払い戻された場合、支払いモジュールは支払いサービスに通知を送信する必要があります。私は、管理バックエンドの注文ページの「キャンセル」ボタンが注文をキャンセルし、請求書が作成された後の「クレジットメモ」ボタンが注文を払い戻すと仮定します。Magento - 注文がキャンセルまたは払い戻されたときにコードを実行するには

これらのイベントでコードを実行するにはどうすればよいですか?私は支払方法モデルでcancel()メソッドを使用しようとしましたが、コードは実行されませんでした。

+0

お支払い方法ではこのような何かを実装する必要がオンラインアクションとお支払いゲートウェイを有効にするには?元の料金:$ 5.00、キャンセル/返金料金 - $ 5.00ちょっと考えた –

答えて

2

お支払い方法のように、取引を使用していないか、承認トランザクションIDを作成していません。これは、支払いゲートウェイの開発で一般的な初心者ミスです。私はここに道オフにすることができますが、あなたが再び電荷を実行するが、量がマイナスであることとなり

class MyBest_Payment_Model_Method extends Mage_Payment_Model_Method_Abstract 
{ 
    protected $_canAuthorize   = true; // Set true, if you have authorization step. 
    protected $_canCapture    = true; // Set true, if you payment method allows to perform capture transaction (usally only credit cards methods) 
    protected $_canRefund    = true; // Set true, if online refunds are available 
    protected $_canVoid     = true; // Set true, if you can cancel authorization via API online 

    public function authorize(Varien_Object $payment, $amount) 
    { 

     // ... You payment method authorization goes here ... 
     // Here goes retrieving or generation non-zero, 
     // non-null value as transaction ID. 
     $transactionId = $api->someCall(); 
     // Setting tranasaction id to payment object 
     // It is improtant, if you want perform online actions 
     // in future with this order! 
     $payment->setTransactionId($transactionId); 

     // ... some other your actions ... 
     return $this; 
    } 

    public function void(Varien_Object $payment) 
    { 
     // ... some actions for sending cancel notification to your payment gateway 
    } 

    public function refund(Varien_Object $payment, $amount) 
    { 
     // ... some actions for performing an online refund ... 
    } 
} 
+0

私はこれを試して、それはかなり動作しません。 refund()メソッドは、請求ページ(注文ページのクレジットメモボタンではありません)で行われたオンライン払い戻しに対してのみ機能するようです。 void()メソッドはまったく呼び出されず、authorize()もトランザクションも作成されません。 –

+0

@ Magentoユーザーには問題ありません。そのようなデータはその時点では保存されていないため、古い注文は機能しません。ちなみに、オーダーページのクレイドノートメモボタンは、オフラインで払い戻しを行います(つまり、通知を送信せずに払い戻しを行います)。承認メソッドでは、トランザクションはゲートウェイに依存するため、Magentoではなくトランザクションを作成する必要があります。 –

+0

@トラブルが発生したMagento user、voidメソッドは、支払いがキャプチャされなかった場合(請求書なし)、または部分キャプチャを実行する能力がある場合(請求書がすべての注文明細をカバーしていない場合) 。 Magentoの支払いシステムのような良い説明を必要とする、unfortunatelly記事のための十分な時間を持っていないようです... –

1

Magentoには役立つイベントフックがあります。イベントのリスト(ちょっと古いですが、私が思う)はhereです。そして、Magnetoのイベントがどのように働くかについての有益な記事がありますhere

また、既存のお支払いの延長を見ると便利です。同様のイベントがGoogle Checkoutから注文の取り消しのために発送された場合、私は驚くことはありません。 Extensionリポジトリには多くの支払い方法があります。

幸運を祈る!

2

Magentoの支払い処理段階では、観察可能なイベントは発生しません。代わりに、実装しているゲートウェイのクラスを定義してから、Magentoが自動的に呼び出すメソッドを定義して、さまざまな支払い方法を実行します。

支払い処理中に呼び出されるさまざまなメソッドを表示するために、基本抽象支払いクラスをポケベルにします。クラス内の同じメソッドを定義して、あなたが望む任意のポイントで支払い処理を行います。

File: app/code/core/Mage/Payment/Model/Method/Abstract.php 

class abstract class Mage_Payment_Model_Method_Abstract 
{ 

    /** 
    * Authorize 
    * 
    * @param Varien_Object $orderPayment 
    * @return Mage_Payment_Model_Abstract 
    */ 
    public function authorize(Varien_Object $payment, $amount) 
    ...  
    /** 
    * Capture payment 
    * 
    * @param Varien_Object $orderPayment 
    * @return Mage_Payment_Model_Abstract 
    */ 
    public function capture(Varien_Object $payment, $amount)  
    ... 

    /** 
    * Void payment 
    * 
    * @param Varien_Object $invoicePayment 
    * @return Mage_Payment_Model_Abstract 
    */ 
    public function void(Varien_Object $payment) 
    ...  

    /** 
    * Refund money 
    * 
    * @param Varien_Object $invoicePayment 
    * @return Mage_Payment_Model_Abstract 
    */ 
    //public function refund(Varien_Object $payment, $amount) 
    public function refund(Varien_Object $payment, $amount) 
    ... 


    /** 
    * Cancel payment (GoogleCheckout) 
    * 
    * @param Varien_Object $invoicePayment 
    * @return Mage_Payment_Model_Abstract 
    */ 
    public function cancel(Varien_Object $payment) 
    ... 

私は支払いゲートウェイの実装の多くを行いませんが、私はrefundはあなたがクレジットメモのために必要な方法であることを推測している、とcaptureは、請求書の一つです。 cancelメソッドはGoogle Checkoutに固有のものです。いくつかのロギング機能を使ってあなたのクラスの5つをすべて定義し、確実に知りたい場合は、開発システムでいくつかの偽の注文を見てください。

関連する問題