我正在尝试使用托管的付款页面(http://support.cheddargetter.com/kb/hosted-payment-pages/hosted-payment-pages-setup-guide)将我的Ruby on Rails应用程序与CheddarGetter集成。
除了最后一部分之外,我几乎已经弄明白了 - 根据他们的API检查客户数据,以确保客户在让他登录系统之前仍处于活动状态。
显然它涉及某种HTTP请求,说实话我并不熟悉,抱歉。这是代码:
uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
status = http.request(request).body
我想知道我在哪里放这个代码?
我想在我的user_session.rb
模型中添加以下内容:
class UserSession < Authlogic::Session::Base
before_create :check_status
private
def check status
# insert above code here
end
end
但我不太确定......?我怀疑那里还有一些if active? elsif cancelled? && pending?
代码,指的是CheddarGetter API给你的响应。
会感谢某些方向,谢谢..
答案 0 :(得分:1)
我建议将其放在/lib
目录中的自己的模块中,并将呼叫包裹在Timeout
中,以防您尝试访问的网站不可用。我刚刚在下面做了一个通用示例,因此您可以根据需要调整时间。
内部/lib/customer_status.rb
require 'timeout'
module CustomerStatus
class << self
def get_status
begin
Timeout::timeout(30) {
uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
status = http.request(request).body
} # end timeout
return status
rescue Exception => e
# This will catch a timeout error or any other network connectivity error
Rails.logger.error "We had an error getting the customer's status: #{e}"
end
end
end
end
然后你就可以这样称呼它:
class UserSession < Authlogic::Session::Base
# include the new module we added
include CustomerStatus
before_create :check_status
private
def check status
raise someError unless (CustomerStatus.get_status.include?("active"))
end
end
我将允许您为cancelled
,pending
等状态添加其他逻辑,并将客户信息传递给新模块方法。您可能只想使用switch语句来处理不同的状态。
<强>更新强>
此外,如果您的config/application.rb
文件中尚未包含此内容,请确保将其包含在内,以便将lib
文件夹添加到自动加载路径中:
module YourAppNameGoesHere
class Application < Rails::Application
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
end
end