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

How to Consume SOAP with Savon in Rails app

我需要在我正在开发的 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

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

非常感谢您的帮助,因为我为此苦苦挣扎了很长时间。

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

首先,您向客户提供了一个 WSDL url,那么附加一个可疑的必要 endpoint 有什么用?

据我所知,namespace 是必需的,以防没有标准的 WSDl 界面。

我会去,首先,我会去:

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

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

接下来,您需要准备您的请求。解析上面的url,有一堆方法。您在示例中提供 getPayments 请求。

我不会用这个 space 来告诉你如何构造散列,但散列应该看起来像这样:

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]

希望以上内容对您有所帮助。应该绰绰有余了。

全部放上:controller代码,适合自己的需要

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