我无法在狂欢中自动捕获付款。我已尝试使用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
但是,这不会引发任何异常,也不会改变付款状态。这看起来好像我做错了什么,误解了什么或狂欢认为我的付款方式是不可自动捕获的。
提前感谢任何线索!
答案 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将尝试处理付款。 否则,付款将需要手动处理。
Solidus是从Spree及其Documentation gives even more details here克隆而来的:
无法使用此流程处理付款!几种方法 情况:
- [.......]
Spree::PaymentMethod
不需要付款来源。- [.......]