我需要在我正在处理的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
我需要在控制器和视图中放置什么才能工作?
我非常感谢你的帮助,因为我很长时间都在努力。
答案 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