[Salesforce]承認申請のアウトバウンドメッセージをPHPで受け取る

salesforceからのアウトバウンドメッセージの内容をPHPで受け取ってみた。

アウトバウンドメッセージの設定

前回作成したものの申請時のアクション部分にアウトバウンドメッセージを追加。

以下のように設定した。

設定完了

PHPで受け取る

アウトバウンドメッセージはSOAPで通信が行われる。
なので、XML。
以下のようにアクセスが記録されていた。

at=info method=POST path="/liam_dnes.php?id=1" host=shrouded-island-xxxx.herokuapp.com request_id=01b99464-c9dc-4e15-aa19-xxxxxxx fwd="xxx.xxx.78.8" dyno=web.1 connect=1ms service=4ms status=200 bytes=189

どうやらPOSTでアクセスされているよう。
$_POSTのままでは取得できなかった。
どうやら生のPOSTデータを取得する必要があるらしい。

以下で取得した。

$data = file_get_contents( 'php://input' );

取得すると、以下のようなXMLが取得できた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <notifications xmlns="http://soap.sforce.com/2005/09/outbound">
            <OrganizationId>00D10000000Zyxxxxx</OrganizationId>
            <SessionId xsi:nil="true"/>
            <PartnerUrl>https://ap.salesforce.com/services/Soap/u/33.0/00D100000xxxxx</PartnerUrl>
            <ActionId>04k100000008STGAA2</ActionId>
            <EnterpriseUrl>https://ap.salesforce.com/services/Soap/c/33.0/00D100000xxxxx</EnterpriseUrl>
            <Notification>
                <Id>04l1000000xxxxxx</Id>
                <sObject xsi:type="sf:Opportunity" xmlns:sf="urn:sobject.enterprise.soap.sforce.com">
                    <sf:Id>0061000000cxxxxx</sf:Id>
                    <sf:Name>アウトバウンドのテスト商談</sf:Name>
                    <sf:StageName>Prospecting</sf:StageName>
                    <sf:IsClosed>false</sf:IsClosed>
                </sObject>
            </Notification>
        </notifications>
    </soapenv:Body>
</soapenv:Envelope>

アウトバウンドの設定は以下のような形。

ここからXMLをパースして、名前など設定した値を取得するには以下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);

//ID
$notification = $xml->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://soap.sforce.com/2005/09/outbound')->notifications->Notification;
echo $notification->Id;

//パラメータ
$params = $notification->sObject->children('urn:sobject.enterprise.soap.sforce.com');
echo $params->Id;
echo $params->Name;
echo $params->IsClosed;

参考

php://input
「php://input」とは何?-POSTの生データ? | アイビースター
Parse XML with namespace by SimpleXML in PHP | Amigo's Technical Notes

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