Rails:Paypal Express 实施因未定义方法“checkout_thank_you_url”而失败
Posted
技术标签:
【中文标题】Rails:Paypal Express 实施因未定义方法“checkout_thank_you_url”而失败【英文标题】:Rails: Paypal Express implementation fails with undefined method `checkout_thank_you_url' 【发布时间】:2019-05-13 13:32:00 【问题描述】:我正在整合 Paypal Express 付款。我正在调整标准结帐,并且正在使用活跃商家 gem。设置应该类似于response=gateway.setup_purchase(price, details)
,其中详细信息是 PayPal 需要的所有参数。 express 网关需要 return_url 和 cancel_return_url。
当我尝试通过提交按钮执行付款时,我得到:
Order xx failed with error message undefined method `checkout_thank_you_url' for #<Order:0x1081e1bb8>
在我的订单模型中,我有以下部分:
#app/models/order.rb
def process
process_with_active_merchant
save!
self.status == 'processed'
end
private
def process_with_active_merchant
ActiveMerchant::Billing::Base.mode = :test
gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(
:login => 'sandbox-account',
:password => 'sandbox-password',
:signature => "sandbox-secret"
params =
:order_id => self.id,
:email => email,
:address => :address1 => ship_to_address,
:city => ship_to_city,
:country => ship_to_country,
:zip => ship_to_postal_code
,
:description => 'Books',
:ip => customer_ip,
:return_url => checkout_thank_you_url(@order), # return here if payment success
:cancel_return_url => checkout_index_url(@order) # return here if payment failed
response = gateway.setup_purchase((@order.total * 100).round(2), params)
if response.success?
self.status = 'processed'
else
self.error_message = response.message
self.status = 'failed'
end
end
在结账控制器中调用该方法
def place_order
@order = Order.new(params[:order])
@order.customer_ip = request.remote_ip
populate_order
...
@order.process
...
end
def thank_you
...
end
我怎样才能让它工作?提前谢谢!
更新
我想我必须指定控制器和操作,但是在使用时:
:return_url => url_for(:controller => :checkout, :action => "thank_you")
我明白了:
Order 98 failed with error message undefined method `url_for' for #<Order:0x1065471d8>
【问题讨论】:
【参考方案1】:在您的 Oder 模型中,包含 Rails 用来生成 URL 的模块。
将此代码添加到 Order 的类定义中:
class Order
include Rails.application.routes.url_helpers
# ...
end
这些帮助器已经包含在 Controller 类中,因此默认情况下,控制器(以及视图模板)中可以使用 checkout_thank_you_url
之类的方法。
您必须将该模块包含在您要使用路由方法的任何其他类中。
【讨论】:
感谢您的意见。这对我来说是新的。不幸的是,:return_url => checkout_success_url(self.id, :only_path => true)
和 :return_url => url_for(:controller => "checkout", :action => "thank_you", :only_path => true, :id => self.id)
仍然得到 error_message = 'ReturnURL is invalid.. CancelURL is invalid.'
知道为什么吗?
现在你有一个新错误!这些错误消息看起来不像 Rails 生成的消息。我的猜测是它们来自 PayPal 的 API。我的建议是将return_url => url_for(...)
扩展为两个单独的行,例如:my_return_url = url_for(...)
,然后在调用 PaypalExpressGateway.new 时使用return_url: my_return_url
等变量发送参数。该重构允许您添加一个断点,您可以在其中检查 my_return_url
并查看它是否是适当的格式。
这听起来很有希望。引入第二个断点是完美的,因为对我来说模型更难跟踪。为了完成运输程序,我将 PayPal 推迟了片刻——ajax 不工作不知道是什么原因——但一旦我完成了那部分,我会测试你的答案。非常感谢!以上是关于Rails:Paypal Express 实施因未定义方法“checkout_thank_you_url”而失败的主要内容,如果未能解决你的问题,请参考以下文章
具有 Paypal 权限和 Paypal Express Checkout 的 Rails
Rails 4 - ActiveMerchant Paypal Express 结帐问题与传递项目数量
Express Payments rails 模块需要啥样的 PayPal 沙盒帐户?
Rails:Localhost 中的 PayPal Express Checkout 集成
验证用户的 API 凭证 - Rails、ActiveMerchant 和 PayPal Express Gateway