0

金融機関のWebサービスを使用して「verifyTransaction」を実行したいこのメソッドは、入力として2つの文字列を取得し、出力としてdoubleを返します。

double verifyTransaction (
String      RefNum, 
String      MerchantID
)

Rails3.1でSavonを使用してメソッドを呼び出しました。

client = Savon::Client.new do |wsdl|
    wsdl.document = "https://acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL"
end

response = client.request :wsdl, "verifyTransaction" do
  soap.body ={"RefNum" => "ReferenceNumber", "MerchantID" => "MymerchantId"}
end

しかし、私はこのエラーを受け取りました:

Savon::SOAP::Fault ((env:Client) caught exception while handling request: unexpected encoding style: expected=http://schemas.xmlsoap.org/soap/encoding/, actual=)

これを解決する方法について何か考えはありますか?

4

2 に答える 2

0

これを実際に試すための有効な情報がないため、リストされている他のSOAP障害またはサービスからの500応答の代わりに、HTTP400を取り戻すことができました。

Savonは、基本的なものだけでセットアップされました。

client = Savon::Client.new do
  wsdl.document = "https://acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL"
end

私が見つけた違いは、特定のリクエストの名前空間を指定することでした。:wsdlを「urn:Foo」に変更します。

[26] pry(main)> client.request "urn:Foo", :verify_transaction do
[26] pry(main)*   soap.body = { "RefNum" => "1", "MerchantID" => "1" }  
[26] pry(main)* end

リクエストからのデバッグ出力:

D, [2011-10-31T09:05:17.202044 #1784] DEBUG -- : SOAP request: https://acquirer.sb24.com/ref-payment/ws/ReferencePayment
D, [2011-10-31T09:05:17.202314 #1784] DEBUG -- : SOAPAction: "verifyTransaction", Content-Type: text/xml;charset=UTF-8, Content-Length: 322
D, [2011-10-31T09:05:17.202414 #1784] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:urn:Foo="urn:Foo" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ins0="urn:Foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><urn:Foo:verifyTransaction><MerchantID>1</MerchantID><RefNum>1</RefNum></urn:Foo:verifyTransaction></env:Body></env:Envelope>
D, [2011-10-31T09:05:17.202574 #1784] DEBUG -- : HTTPI executes HTTP POST using the httpclient adapter
D, [2011-10-31T09:05:18.780446 #1784] DEBUG -- : SOAP response (status 400):
D, [2011-10-31T09:05:18.780669 #1784] DEBUG -- : 
Savon::HTTP::Error: 
from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/savon-0.9.7/lib/savon/soap/response.rb:100:in `raise_errors'

長い説明

これが私が上記のフォーマットを思いついた方法です。

名前空間は、一部のサービスにとって重要な場合があります。wsdlを注意深く見ると、ポート参照が「PaymentIF」ポートであるため、これが実際に使用されているアクションです。

<message name="PaymentIF_verifyTransaction">
  <part name="String_1" type="xsd:string"/>
  <part name="String_2" type="xsd:string"/>
</message>

ポート定義内では、実際のメッセージは「tns:PaymentIF_verifyTransaction」として参照されます。

<portType name="PaymentIF">
...
  <operation name="verifyTransaction" parameterOrder="String_1 String_2">
    <input message="tns:PaymentIF_verifyTransaction"/>
    <output message="tns:PaymentIF_verifyTransactionResponse"/>
  </operation>
...
</portType>

したがって、上部をもう一度振り返ると、「tns」名前空間は次のようになります。

xmlns:tns="urn:Foo"
于 2011-10-31T14:16:38.170 に答える
0

SoapUIを使用して問題を解決しました。

SoapUIでWSDLを開き、サンプルリクエストを生成し、次のようにコピーしてSavonに貼り付けました。

client = Savon::Client.new do |wsdl|
    wsdl.document = "https://acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL"
end

response = client.request "verifyTransaction" do
  soap.xml = 'XML will be here'
end

それはうまくいきました!:)

于 2011-11-02T17:28:10.077 に答える