2012-05-30 30 views
5

Vì vậy, xin lỗi - Tôi đang cố tạo Cổng thanh toán tùy chỉnh mới. Nó được thiết kế để thực hiện auth/capture thông qua API của bên thứ ba, nhưng KHÔNG cần chuyển hướng đến trang web của bên thứ ba.Cổng thanh toán tùy chỉnh Magento không kích hoạt phương thức 'ủy quyền' hoặc 'chụp'

Từ sự hiểu biết của tôi, khi một đơn đặt hàng được đặt/hoàn thành trong Magento và cổng được đặt thành "Ủy quyền và Capture", nó sẽ kích hoạt phương pháp 'chụp' từ mô hình cổng. Hiện tại, nó không làm điều này.

Tất nhiên, nếu tôi chụp cụ thể từ chế độ xem Đơn đặt hàng quản trị, nó sẽ cố gắng chụp, nhưng điều này cần xảy ra ngay lập tức khi thanh toán (và một lần nữa, đó là sự hiểu biết của tôi là đã có).

Trong cửa ngõ mẫu của tôi, tôi có như sau (cắt ngắn để có thể đọc):

<?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'); 
    } 
} 

mô hình thanh toán này bản thân chắc chắn công trình - Tôi được đăng nhập đầu ra cho assignData()validate(), cũng như __construct() nếu tôi thêm nó . Nhưng dù tôi có làm gì đi chăng nữa, cả phương pháp chụp hoặc ủy quyền đều không kích hoạt khi thực sự đặt hàng.

config.xml tôi đọc hơi như thế này:

<?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> 

Tôi không tin rằng có một nhu cầu cho một mô hình tài nguyên như tôi không cần bất kỳ bảng bổ sung; kỳ vọng của tôi là nó sẽ chỉ đơn giản sử dụng sales_flat_order_payment và các bảng có liên quan để lưu trữ bất kỳ dữ liệu liên quan đến cổng nào (id txn, v.v ...)

Tương tự, tôi mở rộng khối CC mặc định để nhận biểu mẫu thanh toán chuẩn.

Tôi đang thiếu gì? Nó phải là một cái gì đó nhỏ và đơn giản mà tôi nhìn ra.

Cảm ơn trước!


UPDATE: Cho đến nay, tôi đã thực hiện một cách giải quyết có sử dụng một người quan sát sự kiện checkout_type_onepage_save_order mà các cuộc gọi phương pháp chụp() bằng tay - nhưng tôi khá chắc chắn đây không phải là cách đúng đắn để đi.

Tôi không sai khi nghĩ rằng Magento sẽ tự động gọi capture() khi thứ tự ban đầu được lưu, nếu cổng được đặt thành authorize_capture, đúng không ..?

+0

Bạn có thể thêm nhật ký để xem liệu khi nào và khi nào 'authorize()' hoặc 'capture()' đang được gọi cho các cổng thanh toán khác? – nachito

+0

Bạn đã thử thay đổi lớp trợ giúp từ 'Example_Gateway_Model' thành' Example_Gateway_Helper' thay vì trong 'config.xml'? Ngoài ra, 'system.xml' của bạn trông như thế nào và bạn có cài đặt bất kỳ mô-đun thanh toán bên thứ ba nào không? Một phiên bản Magento cũng có thể giúp ích cho bạn. – B00MER

+0

@ B00MER - Xin lỗi, đó là lỗi đánh máy; nó đúng là 'Người trợ giúp 'trong mã thực sự của tôi. Đây là phiên bản Enterprise 1.11. Không có mô-đun Thanh toán bên thứ ba nào được cài đặt. Tôi sẽ đăng tệp system.xml của mình, nhưng tôi không thể tưởng tượng được rằng sẽ làm sáng tỏ quá nhiều thứ. – Morgon

Trả lời

0

Vâng, tôi đã sử dụng một người quan sát để gọi thủ công phương pháp chụp.
Không phải là giải pháp thanh lịch nhất, nhưng nó hoạt động đủ tốt.

3

Giải quyết! Bạn cần điều này:

protected $_isInitializeNeeded  = false; 

Tôi không có ý tưởng tại sao điều này là cần thiết, nhưng vào thời điểm này tôi đã từ bỏ cố gắng để tìm ra lý do tại sao các Magento ủng hộ thực sự thực hiện công việc. Tôi đã có vấn đề chính xác giống như bạn, và khi tôi truy tìm nó thông qua mã nguồn tôi thấy rằng Payment.php không gọi _authorize khi isInitializeNeeded trả về true. Vì vậy, hãy dán dòng đó vào mô hình của bạn và nó sẽ hoạt động.

+0

Tôi đã có cùng một vấn đề và thay đổi điều này thành sai kích hoạt phương pháp của tôi, nó hoạt động. – jeruki

+0

@Benubird, tôi đã tìm kiếm điều này, vì vậy tôi tìm thấy câu trả lời ở đây [Mô hình thanh toán của Magento Wrapup] (http://tweetorials.tumblr.com/post/10801322037/magento-payment-model-wrapup) –

2

Tôi nghĩ rằng phương pháp này nên là: "authorize_capture" chứ không phải "chụp" như đã nêu trong cấu hình

<payment_action>authorize_capture</payment_action> 

như thế:

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. 
} 

tôi đã có một vấn đề tương tự rằng "ủy quyền "phương thức không được kích hoạt vì" authorize_action "trống. Tôi đã có thể giải quyết điều này bằng cách mã hóa nó trong chính phương thức đó. "getConfigPaymentAction" được gọi để nhận phương thức ủy quyền.

public function getConfigPaymentAction() { 
    return 'authorize'; 
} 
Các vấn đề liên quan