[Salesforce]アウトバウンドメッセージ送信時のエラー

先日、アウトバウンドメッセージをPHPで受けとる方法を紹介したけれど、試しているとアウトバウンドメッセージの送信がSalesforce側から何度も試行されていることがわかった。

salesforce側のログを見ていると、以下のようなエラーが出ている。
設定 > 監視 > アウトバウンドメッセージ

エラー

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

どうやら、PHP側の応答が、SOAPの形式に則ってないとsalesforce側でXMLの解析ができずにエラーが出てしまうっぽい。
なので、エラーが解消されるまで数回試行が続く、っぽい。

応答はXMLの形式でなければならないので、headerでXMLとしてやる必要がある。

header("Content-Type: application/xml; charset=UTF-8");

また、返却するXMLは以下のような形でないといけないよう。

1
2
3
4
5
6
7
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
      <notificationsResponse xmlns="http://soap.sforce.com/2005/09/outbound">
      <Ack>true</Ack>
  </notificationsResponse>
  </soapenv:Body>
</soapenv:Envelope>

というわけで、以下のようにPHPを書いてやればエラーは出ない。

1
2
3
4
5
6
7
<?php
header("Content-Type: application/xml; charset=UTF-8");

//--何らかの処理--

$response = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><notificationsResponse xmlns="http://soap.sforce.com/2005/09/outbound"><Ack>true</Ack></notificationsResponse></soapenv:Body></soapenv:Envelope>';
echo $response;

参考

{!blog.concret.io}: Testing SOAP Outbound Messages without failures

   このエントリーをはてなブックマークに追加