2012-05-30 13 views
5

तो, horray - मैं एक नया कस्टम भुगतान गेटवे बनाने का प्रयास कर रहा हूं। यह किसी तृतीय-पक्ष API के माध्यम से ऑथ/कैप्चर करने के लिए डिज़ाइन किया गया है, लेकिन उसे तृतीय-पक्ष साइट पर रीडायरेक्ट करने की आवश्यकता नहीं है।Magento कस्टम भुगतान गेटवे 'अधिकृत' या 'कैप्चर' विधियों को फायर नहीं कर रहा है

मेरी समझ से, जब मैगेंटो में ऑर्डर दिया गया/अंतिम रूप दिया गया है, और गेटवे "अधिकृत और कैप्चर" पर सेट है, तो इसे गेटवे मॉडल से 'कैप्चर' विधि से फायर करना चाहिए। वर्तमान में, यह ऐसा नहीं कर रहा है।

बेशक, अगर मैं विशेष रूप से व्यवस्थापक ऑर्डर व्यू से कैप्चर करता हूं, तो यह कैप्चर करने का प्रयास करेगा, लेकिन इसे चेकआउट पर तुरंत होने की आवश्यकता है (और फिर, यह मेरी समझ है कि इसे पहले से ही करना चाहिए)।

मेरी प्रवेश द्वार मॉडल में, मैं निम्नलिखित (पठनीयता के लिए छोटा कर दिया):

<?php 
class Example_Gateway_Model_Payment extends Mage_Payment_Model_Method_Cc 
{ 
    protected $_code = 'example'; 

    protected $_isGateway = true; 
    protected $_canAuthorize = true; 
    protected $_canCapture = true; 
    protected $_canUseInternal = true; 
    protected $_canUseCheckout = true; 

    // This is an empty block class that extends Mage_Payment_Block_Form_Cc 
    protected $_formBlockType = 'example/form_example'; 

    public function authorize(Varien_Object $payment, $amount) 
    { 
     Mage::log('Authorizing!'); 
    } 

    public function capture(Varien_Object $payment, $amount) 
    { 
     Mage::log('** Capturing **'); 
     // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc. 
    } 

    public function assignData($data) 
    { 
     Mage::log('Assigning Data'); 
    } 
} 

यह भुगतान मॉडल ही निश्चित रूप से काम करता है - मैं assignData() और validate() के लिए उत्पादन प्रवेश करने के लिए, साथ ही __construct() के रूप में अगर मैं इसे जोड़ने । लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, न ही ऑर्डर देने पर न तो कैप्चर या प्राधिकरण विधियां आग लगती हैं।

मेरे config.xml इस तरह कुछ हद तक पढ़ता है:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Example_Gateway> 
      <version>0.0.5</version> 
     </Example_Gateway> 
    </modules> 
    <global> 
     <blocks> 
      <gateway> 
       <class>Example_Gateway_Block</class> 
      </gateway> 
     </blocks> 
     <models> 
      <gateway> 
       <class>Example_Gateway_Model</class> 
      </gateway> 
     </models> 
     <helpers> 
      <gateway> 
       <class>Example_Gateway_Helper</class> 
      </gateway> 
     </helpers> 
    </global> 
    <frontend> 
     <!-- Snip.. Nothing special here --> 
    </frontend> 
    <default> 
     <payment> 
      <gateway> 
       <sort_order>0</sort_order> 
       <model>gateway/payment</model> 
       <enabled>1</enabled> 
       <order_staus>processing</order_status> 
       <payment_action>authorize_capture</payment_action> 
       <cctypes>VI,MC,AE,DI</cctypes> 
       <useccv>1</useccv> 
      </gateway> 
     </payment> 
    </default> 
</config> 

मैं एक संसाधन मॉडल के रूप में मैं किसी भी अतिरिक्त तालिकाओं की जरूरत नहीं है के लिए एक आवश्यकता नहीं है पर विश्वास नहीं करते; मेरी उम्मीद यह है कि यह किसी भी गेटवे से संबंधित/-प्रोवाइड डेटा (टीएक्सएन आईडी, आदि) को स्टोर करने के लिए sales_flat_order_payment और संबंधित तालिकाओं का उपयोग करेगा

इसी तरह, मैं मानक भुगतान फ़ॉर्म प्राप्त करने के लिए डिफ़ॉल्ट सीसी ब्लॉक का विस्तार कर रहा हूं।

मुझे क्या याद आ रही है? यह कुछ छोटा और सरल होना चाहिए जो मैं देख रहा हूं।

अग्रिम धन्यवाद!


अद्यतन: अब तक, मैं एक समाधान है कि कब्जा() विधि मैन्युअल रूप से कॉल checkout_type_onepage_save_order घटना के लिए एक पर्यवेक्षक का उपयोग करता है को लागू किया है - लेकिन मैं बहुत यकीन है कि यह करने के लिए सही तरीका नहीं है कर रहा हूँ चले जाओ।

मुझे यह सोचने में कोई गलती नहीं है कि प्रारंभिक आदेश सहेजने पर Magento स्वचालित रूप से capture() पर कॉल करना चाहिए, अगर गेटवे Authorize_capture पर सेट है, है ..?

+0

क्या आप यह देखने के लिए लॉगिंग जोड़ सकते हैं कि कब और कब प्राधिकृत() 'या' कैप्चर() 'अन्य भुगतान गेटवे के लिए बुलाया जा रहा है? – nachito

+0

क्या आपने अपने 'config.xml' में' example_Gateway_Model' से 'example_Gateway_Helper'' में सहायक वर्ग को बदलने का प्रयास किया है? इसके अलावा आपका 'system.xml' कैसा दिखता है और क्या आपके पास कोई तृतीय पक्ष चेकआउट मॉड्यूल स्थापित है? Magento का एक संस्करण भी मदद कर सकता है। – B00MER

+0

@ B00MER - क्षमा करें, वह एक टाइपो था; यह मेरे वास्तविक कोड में ठीक से 'हेल्पर' है। यह एक एंटरप्राइज़ 1.11 उदाहरण है। कोई तृतीय पक्ष चेकआउट मॉड्यूल स्थापित नहीं हैं। मैं अपना system.xml पोस्ट करूंगा, लेकिन मैं कल्पना नहीं कर सकता कि किसी भी चीज़ पर बहुत अधिक प्रकाश डालेगा। – Morgon

उत्तर

0

ठीक है, मैंने कैप्चर विधि को मैन्युअल रूप से कॉल करने के लिए पर्यवेक्षक का उपयोग किया था।
सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन यह काफी अच्छी तरह से काम करता है।

3

हल हो गया! आप इस की जरूरत है:

protected $_isInitializeNeeded  = false; 

मुझे पता नहीं क्यों यह जरूरी है कि है, लेकिन इस बिंदु पर मैं यह पता लगाने की कोशिश कर छोड़ दिया गया है वास्तव में काम को पूरा करने के पक्ष में Magento की क्यों। मुझे आपके जैसा ही समस्या थी, और जब मैंने स्रोत कोड के माध्यम से इसका पता लगाया तो मुझे पता चला कि Pay.php _Authorize को कॉल नहीं कर रहा था जब प्रारंभ किया गया था। तो, उस मॉडल को अपने मॉडल में चिपकाएं, और यह काम करेगा।

+0

मेरे पास एक ही समस्या थी और इसे मेरी विधियों को ट्रिगर करने के लिए बदलकर, यह काम करता है। – jeruki

+0

@ बेनबर्ड, मैं इसे खोज रहा था, इसलिए मुझे यहां जवाब मिला [Magento Payment Model Wrapup] (http://tweetorials.tumblr.com/post/10801322037/magento-payment-model-wrapup) –

2

मुझे लगता है कि विधि होना चाहिए: "authorize_capture" और नहीं "कब्जा" के रूप में config

<payment_action>authorize_capture</payment_action> 

ऐसे ही में कहा गया है:

public function authorize_capture(Varien_Object $payment, $amount) 
{ 
    Mage::log('** Capturing **'); 
    // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc. 
} 

मैं कि "अधिकृत एक ऐसी ही समस्या थी "विधि को बिल्कुल नहीं निकाल दिया गया क्योंकि" authorize_action "खाली था। मैं इसे विधि में हार्डकोडिंग द्वारा हल करने में सक्षम था। प्राधिकरण विधि प्राप्त करने के लिए "getConfigPaymentAction" को बुलाया जाता है।

public function getConfigPaymentAction() { 
    return 'authorize'; 
} 
संबंधित मुद्दे