无法自动捕获付款

时间:2015-06-16 21:23:36

标签: ruby-on-rails spree

我无法在狂欢中自动捕获付款。我已尝试使用PaymentMethod::Check方法和我的自定义方法(通过在管理面板中将自动捕获选项设置为true),但它始终保留pending状态的付款方式。我的自定义方法基于PaymentMethod::Check源代码,如下所示:

module Spree
  class PaymentMethod::CashOnDelivery < PaymentMethod
    def actions
      %w{purchase capture void}
    end

    # Indicates whether its possible to capture the payment
    def can_capture?(payment)
      ['checkout', 'pending'].include?(payment.state)
    end

    # Indicates whether its possible to void the payment.
    def can_void?(payment)
      payment.state != 'void'
    end

    def purchase(*args)
      throw 'purchase'
    end

    def capture(*args)
      ActiveMerchant::Billing::Response.new(true, "", {}, {})
    end

    def cancel(response); end

    def void(*args)
      ActiveMerchant::Billing::Response.new(true, "", {}, {})
    end

    def source_required?
      false
    end

    def auto_capture?
      true
    end
  end
end

但是,这不会引发任何异常,也不会改变付款状态。这看起来好像我做错了什么,误解了什么或狂欢认为我的付款方式是不可自动捕获的。

提前感谢任何线索!

2 个答案:

答案 0 :(得分:0)

首先,您应该了解Spree对State Machine的使用。 使用此gem更改了订单状态。在checkout_controller.rb中,写有&#34; @ order.next&#34;,这是stat机器发挥作用并相应地改变顺序状态的地方。

This教程可以帮助您理解State Machine Gem的工作原理。我认为Spree的大多数State Machine代码都存在于checkout.rb模型中。

我认为您的交易发生得很好,但状态不会改变,因为您没有在班级中处理State Machine。

在更改此类付款修改时,您还需要了解其他流量。这是施普雷最难理解的领域之一。

答案 1 :(得分:0)

您的source_required?返回false。如果您的PaymentMethod不需要来源,则Spree不会自动处理付款。即使您的auto_capture?设置为true。需要使用admin手动捕获使用您的PaymentMethod进行的付款。

来自Spree Documentation.

  

如果付款方式需要来源,并且付款有来源   与其关联,则Spree将尝试处理付款。   否则,付款将需要手动处理

Solidus是从Spree及其Documentation gives even more details here克隆而来的:

  

无法使用此流程处理付款!几种方法   情况:

     
      
  • [.......]
  •   
  • Spree::PaymentMethod 不需要付款来源。
  •   
  • [.......]
  •