如何在Rails应用程序中使用Savon使用SOAP

时间:2016-12-20 06:13:25

标签: ruby-on-rails web-services soap savon

我需要在我正在处理的Rails应用程序上使用Savon通过Soap与一个名为ifthenpay的服务进行通信。

该服务生成付款参考,以便用户可以在家庭银行或自动提款机上付款。

应用程序需要与服务进行通信,以确定是否已付款。

我使用的是Savon,这是我到目前为止在结帐模式中所知道的(不知道这是否是放置上述代码的正确位置):

def self.check_status!
    client = Savon.client(
      wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL",
      endpoint: "http://localhost:3000",
      namespaces: {"xmlns:ift"=>"https://www.ifthensoftware.com/"}
      )

    begin
      response = client.call(:get_payments, message: check_status_hash)
    rescue Savon::SOAPFault => error
      #...
    end
  end

  def self.check_status_hash
    {
      "ift:get_payments" => {
        "ift:chavebackoffice" => { "ift:chavebackoffice" => "0000-0000-0000-0000" },
        "ift:entidade" => {"ift:entidade" => "11202"},
        "ift:subidentidade" => {"ift:subidentidade" => "202"},
        "ift:dtHrInicio" => {"ift:dtHrInicio" => ""},
        "ift:dtHrFim" => {"ift:dtHrFim" => ""},
        "ift:referencia" => {"ift:referencia" => ""},
        "ift:valor" => {"ift:valor" => ""}
        }
      }
  end

我有一个管理页面,我需要列出已经完成的所有付款,因此我可以管理所选择的内容。

您可以看到服务操作here

我需要在控制器和视图中放置什么才能工作?

我非常感谢你的帮助,因为我很长时间都在努力。

1 个答案:

答案 0 :(得分:1)

从我的角度来看,请原谅我,因为我对savon的使用不是很有经验,所以你有点过分了。

首先,您要向客户提供WSDL个网址,那么附加一个有疑问的endpoint会有什么用?

根据我的理解,namespace是必要的,如果没有标准的WSDl界面,那就是必要的。

我会去,开始,我只想去:

@client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")

观看@client而不是client。我们需要将客户端分配给一个在整个过程中可以访问的变量(请求,进程,响应)。

接下来,您需要准备好您的请求。解析上面的网址,有一系列方法。您在示例中提供了getPayments请求。

我不会用这个空间来告诉你如何构造哈希,但哈希应该是这样的:

request_hash = {
    chavebackoffice: "0000-0000-0000-0000",
    entidade: "11202",
    subidentidade: "202",
    dtHrInicio: "",
    dtHrFim: "",
    referencia: "",
    valor: ""
}

要拨打api,您应该这样做:

@response = @client.call(:get_payments) do
    message request_hash
end

然后,解析@response。您可能需要先将其转换为哈希值。也许是这样的:

@data = @response.to_hash[:get_payments_response][:get_payments_result][:ifmb]

我希望这对你有所帮助。应该绰绰有余。

全力以赴:控制器代码,适应您的需求

before_action :set_client, only: [:get_payments, :other_actions_perhaps]

def get_payments
    # params[:whatever] in case you post to @whatever object
    # params without [:whatever] if you are using "GET" method
    request_hash = {
        chavebackoffice: params[:whatever][:chavebackoffice],
        entidade: params[:whatever][:entidade],
        subidentidade: params[:whatever][:subidentidade],
        dtHrInicio: params[:whatever][:dtHrInicio],
        dtHrFim: params[:whatever][:dtHrFim],
        referencia: params[:whatever][:referencia],
        valor: params[:whatever][:valor]
    }
    response = @client.call(:get_payments) do
        message request_hash
    end
    # use this @data in your view
    @data = response.to_hash[:get_payments_response][:get_payments_result][:ifmb]
end

def set_client
     @client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")
end