2013-07-11 3 views
4

Magento 모듈 중 하나에 대해 "모든 주문은 유료로 정의됩니다."이벤트를 잡아야합니다. 관련 이벤트가 sales_order_payment_pay 인 것으로 나타났습니다. 좋아, 내 요구에 완벽하게 맞는 것 같습니다.Magento 지불 워크 플로우 및 이벤트 주문

저는 상인이 아니라 Magento 개발자입니다. Magento 인스턴스를 온라인으로 제작 한 적이 없습니다. 따라서 결제 워크 플로는 매우 어둡습니다. 나는 시험 중 지불 방법으로 "수표/머니 오더"를 선택했습니다.

문제는 :이 이벤트 (sales_order_payment_pay)를 캐치해야하지만 트리거 할 수없고 내 관찰자 기능에 입력하지 않는 것 같습니다. 나는 현재 2 가지 지불 방법, 수표/우편환 및 신용 카드를 가지고 있습니다. 첫 번째 경우 판매자는 백엔드의 지불을 확인해야하며 청구서를 작성하는 순간 빨간색이 표시됩니다. 그래서 시도했지만 이벤트가 발생하지 않습니다. 둘째로, 더 어렵습니다. 제가 개발 모드에 있기 때문에 신용 카드를 통한 지불 방법을 알지 못합니다. Magento에서 테스트를 허용하는 MasterCard 온라인 번호를 찾았으나 백엔드에서는 총 지불 금액이 여전히 0과 같습니다. 따라서 주문 제출 후 이벤트가 발생하지 않으며 (논리적 인 것처럼 보임) 인보이스를 생성해도 여전히 이벤트가 발생하지 않습니다.

결제 절차를 조금 더 이해하고 지불 한 주문을 받도록 도울 수 있습니까? 그것에 관한 정보 나 문서를 찾을 수 없습니다.

추신 : 내 모듈의 목적은 이벤트 장소 주문 또는 지불금을 받고 데이터 내보내기를위한 XML 파일을 생성하는 것입니다. 처음 주문은 이미 개발되어 있습니다.

답변

2

이 주제는 다소 까다로워서 지불 방법 및 주문주기에 대한 내 비전을 공유합니다. 모든

Alan Storm's vision

먼저 나는 가장 유명한 젠토 블로거 중 하나 인 앨런 스톰이 항목을 참조하기 위해 당신을 초대합니다.

사례 1 : -> 위해 만든 온라인 결제 (페이팔, 신용 카드 등)로 주문을 지불

주문 고객에 의해 검증 받아 들여지는 여기

내가 그것을 작동 생각하는 방법이다 Magento -> 상태 pending_payment
고객이 온라인으로 지불 - 지불 서비스에서 결제 확인 -> 지불 확인 -> Magento에서 만든 인보이스 -> 상태 pending_payment (이 시점에 대해서는 확실하지 않음)
주문 상인에 의해 제공 - 젠토에 의해 생성> shippig 쿠폰 -> 완료 상태

사례 2 : 온라인 결제 (페이팔, 신용 카드 등)와 주문에 의해 검증

주문을 거부 지급 클라이언트 -> 젠토에 의해 생성 순서 -> 상태 pending_payment는 클라이언트 온라인, 유료 주문
-> 지불 결제 서비스에 의해 거부 -> 주문 젠토 취소 -> 상태가

사례 3 취소 : 오프라인 결제와 주문 (확인/머니 오더, 쿠폰 판매 등).클라이언트에 의해 검증

주문을 운반하기 전에 상인 송장 -> 젠토에 의해 생성 순서 -> 상태가 클라이언트 오프라인, 유료
주문을 보류 -> 지불 상인 접수 -> 주문 상인에 의해 청구 -> 젠토 만든 송장 -> 상태 처리
Magento에서 만든 배송 쿠폰 -> 상태 완료

사례 4 : 오프라인 지불 (수표/우편환, 쿠폰 등 판매)으로 주문하십시오. 클라이언트에 의해 검증

주문을 인보이스 전에 상선 -> 젠토에 의해 생성 순서 -> 상태가 클라이언트 오프라인, 유료
주문을 보류 -> 젠토에 의해 만들어 배송 쿠폰 - -> 상태 처리
주문> 순서는 상인에 의해 제공 Merchant에서 인보이스 발행 -> Magento가 만든 인보이스 -> 상태 처리

이 주제가 장래에 도움이되기를 바랍니다.
이후에 더 자세한 정보가 필요하면 알려주십시오. 내가으로 사용

0

은 다음과 같습니다

1-응용 프로그램/코드/삶을/패키지 이름/모듈 이름은/etc/config.xml에

<config> 
<global> 
    <models> 
     <sales> 
      <rewrite> 
       <order>Packagename_Modulename_Model_Rewrite_Order</order> 
      </rewrite> 
     </sales> 
     <sales_resource> 
      <rewrite> 
       <quote>Packagename_Modulename_Model_Rewrite_Resource_Sales_Quote</quote> 
      </rewrite> 
     </sales_resource> 
     <modelrewrite> 
      <class>Packagename_Modulename_Model_Rewrite</class> 
     </modelrewrite> 
    </models>   
    <events> 
     <packagename_modulename_order_status_change> 
      <observers> 
       <packagename_modulename_model_rewrite> 
        <type>singleton</type> 
        <class>modelrewrite/observer</class> 
        <method>changeStateOrder</method> 
       </packagename_modulename_model_rewrite> 
      </observers> 
     </packagename_modulename_order_status_change> 
    </events>   
    <resources> 
     <modulename_setup> 
      <setup> 
       <module>Packagename_Modulename</module> 
       <class>Mage_Sales_Model_Resource_Setup</class> 
      </setup> 
      <connection> 
      <use>core_setup</use> 
      </connection> 
     </modulename_setup> 
    </resources>   
</global> 
    <crontab> 
    <!-- here I am listing only major routines --> 
    <jobs>   
     <Packagename_Modulename_Model_Rewrite_SendOrderToERP> 
      <schedule> 
       <cron_expr>12 * * * *</cron_expr> 
      </schedule> 
      <run> 
       <model>modelrewrite/observer::runSendOrderToERP</model> 
      </run> 
     </Packagename_Modulename_Model_Rewrite_SendOrderToERP>    
     <Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder> 
      <schedule> 
       <cron_expr>*/5 * * * *</cron_expr> 
      </schedule> 
      <run> 
       <model>modelrewrite/observer::runReceiveERPStatusOrder</model> 
      </run> 
     </Packagename_Modulename_Model_Rewrite_ReceiveERPStatusOrder>    
    </jobs>   
</crontab> 

2-app/code/loca/Packagename/Modulename/Model/Rewrite/Order.php

클래스 Packagename_Modulename_Model_Rewrite_Order이 Mage_Sales_Model_Order를 확장 {

public function _setState($state, $status = false, $comment = '', $isCustomerNotified = null, $shouldProtectState = false){ 
    // attempt to set the specified state 
    // tenta definir o status especificado 
    if ($shouldProtectState) { 
     if ($this->isStateProtected($state)) { 
      Mage::throwException(
       Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state) 
      ); 
     } 
    } 
    $this->setData('state', $state); 

    // add status history 
    if ($status) { 
     if ($status === true) { 
      $status = $this->getConfig()->getStateDefaultStatus($state); 
     } 
     $this->setStatus($status); 
     $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again 
     $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility 
    } 

    Mage::dispatchEvent('packagename_modulename_order_status_change', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified));    
    Mage::log("Packagename_Modulename_Model_Rewrite_Order Changing order to STATE ".$state." STATUS ".$status); 
    return $this; 
} 

}

3-응용 프로그램/코드/삶을/패키지 이름/MODULENAME/모델/다시 작성/Observer.php

class Packagename_modulename_Model_Rewrite_Observer{ 

public function implementOrderStatus($event){ 
    $order = $event->getOrder(); 
    $state = $event->getState(); 
    $status = $event->getStatus(); 
    return $this; 
} 

public function changeStateOrder($observer){ 
    Mage::log('changeStateOrder'); 
    $order = $observer->getEvent()->getOrder();  

    if($order->getStatus() == "processing_paid"){ 
     $this->autoInvoicing($order); 
    } 
    else if($order->getStatus() == "processing_shipped"){ 
     $this->autoShipment($order); 
    } 

    // use your necessary ifs 
    $this->sendTransactionalEmail($order); 

    return $this; 
} 


public function autoShipment(Mage_Sales_Model_Order $order){ 
    //...  
} 

public function autoInvoicing(Mage_Sales_Model_Order $order){ 
    //...  
    //return $this; 
} 

public function sendTransactionalEmail(Mage_Sales_Model_Order $order){ 

    switch ($order->getStatus()) {    
     case "processing": 
      $templateId = 1;       
      break; 
     case "pending_payment": 
      $templateId = 0;       
      break;    
    //...      
     default: 
      $templateId = 0; 
      break; 
    }   

//... 
} 


public function runSendOrderToERP($schedule){ 
    //... 
} 


public function runReceiveERPStatusOrder($schedule){   
    //... 
} 

//And much more another methods can be used after change state/status order: refund, calcel, etc 
관련 문제