2016-08-16 8 views
2

Campaigner(電子メールマーケティングツール)に接続して連絡先をアップロードするためにPHPでSOAPリクエストを作成する際に問題が発生しましたが、私はいくつかの助けをすることができます。私が使用しているAPIは、Nullオブジェクトで応答し続けます。ここでは(私はSOAPUIを使用する場合の動作)私はのオフに働いているXMLれる:PHP SOAPリクエストの問題

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="https://ws.campaigner.com/2013/01"> 
<soapenv:Header/> 
<soapenv:Body> 
    <ns:ImmediateUpload> 
    <!--Optional:--> 
    <ns:authentication> 
     <!--Optional:--> 
     <ns:Username>username</ns:Username> 
     <!--Optional:--> 
     <ns:Password>password</ns:Password> 
    </ns:authentication> 
    <ns:UpdateExistingContacts>true</ns:UpdateExistingContacts> 
    <ns:TriggerWorkflow>false</ns:TriggerWorkflow> 
    <!--Optional:--> 
    <ns:contacts> 
     <ns:ContactData> 
      <ns:ContactKey> 
       <ns:ContactId>0</ns:ContactId> 
       <ns:ContactUniqueIdentifier>[email protected]</ns:ContactUniqueIdentifier> 
      </ns:ContactKey> 
      <ns:EmailAddress>[email protected]</ns:EmailAddress> 
      <ns:FirstName>Steve</ns:FirstName> 
      <ns:LastName>Rogers</ns:LastName> 
      <ns:Status>Subscribed</ns:Status> 
      <ns:MailFormat>Both</ns:MailFormat> 
      <ns:IsTestContact>0</ns:IsTestContact> 
     </ns:ContactData> 
    </ns:contacts> 
    </ns:ImmediateUpload> 

ここでは私のPHPコードは次のとおりです。ここで

<?php 
$wsdl = "https://ws.campaigner.com/2013/01/contactmanagement.asmx?wsdl"; 

$trace = true; 
$exceptions = true; 

$Username = "username"; 
$Password = "password"; 
$UpdateExistingContacts = true; 
$TriggerWorkflow = false; 
$ContactId = 0; 
$ContactUniqueIdentifier= "[email protected]"; 
$EmailAddress = "[email protected]"; 
$FirstName = "Steve"; 
$LastName = "Rogers"; 
$Status = "Subscribed"; 
$MailFormat = "Both"; 
$IsTestContact = 0; 


$params = array (
"Username" => $Username, 
"Password" => $Password, 
"UpdateExistingContacts" => $UpdateExistingContacts, 
"TriggerWorkflow" => $TriggerWorkflow, 
"ContactId" => $ContactId, 
"ContactUniqueIdentifier" => $ContactUniqueIdentifier, 
"EmailAddress" => $EmailAddress, 
"FirstName" => $FirstName, 
"LastName" => $LastName, 
"Status" => $Status, 
"MailFormat" => $MailFormat, 
"IsTestContact" => $IsTestContact 
); 

try{ 
$client = new SoapClient($wsdl, array('trace' => $trace, 'exceptions' => $exceptions)); 
$response = $client->__call("ImmediateUpload", array($params)); 
} catch (Exception $e){ 
echo "error"; 
echo $e ->getMessage(); 
echo 'Last Response: '.$client->__getLastResponse(); 
} 

var_dump($response); 
?> 

は、私は戻って取得応答であります:

object(stdClass)#2 (0) {} 

私は成功した応答を得るため、間違いなく書式設定の問題ですCampaignerに書き込むSoapUIを使用すると、PHPで処理しようとするときにのみこのエラーが発生します。私はあなたが提供できる任意のヘルプに感謝!

、 ローガン

更新ありがとう:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Header><ResponseHeader xmlns="https://ws.campaigner.com/2013/01"> 
<ErrorFlag>true</ErrorFlag> 
<ReturnCode>U_4.5.1.3_USERNAME-AND-PASSWORD-REQUIRED</ReturnCode> 
<ReturnMessage>Username and Password is required.</ReturnMessage> 
</ResponseHeader> 
</soap:Header><soap:Body><ImmediateUploadResponse xmlns="https://ws.campaigner.com/2013/01" /> 
</soap:Body> 
</soap:Envelope> 

答えて

0

:私はそれは私がリクエストを構成しています方法であることを把握することができた を...ここに戻って実際の応答がありますSOAP呼び出しのトラブルシューティング

SoapUIを使用して既知の動作中の要求を作成することで、すでにゲームに先んじています。よくできました。
PHPでリクエストのフォーマットが正しくないと思われます。それを確認するには、var_dump($client->__getLastRequest());と生のSOAP XMLを検査し、あなたが何を得るを参照してください。

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:ns1="https://ws.campaigner.com/2013/01"> 
    <SOAP-ENV:Body> 
    <ns1:ImmediateUpload> 
     <ns1:UpdateExistingContacts>true</ns1:UpdateExistingContacts> 
     <ns1:TriggerWorkflow>false</ns1:TriggerWorkflow> 
    </ns1:ImmediateUpload> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

は間違いなくあなたのSOAPUI要求のようには見えません。それでなぜこれが起こっているのですか?さんはの出力を見て、ImmediateUploadを探してみましょう:

array(32) { 
    [0]=> 
    string(68) "ImmediateUploadResponse ImmediateUpload(ImmediateUpload $parameters)" 

だから我々はImmediateUploadは()型ImmediateUploadの1つの変数$パラメータを取り方法ことがわかり。

しかし、ImmediateUploadの構造はどのように見えますか?さんはvar_dump($client->__getTypes());の出力を見て、そのタイプを探してみましょう:1認証、2つのブール値、および3つの配列:

array(88) { 
    [0]=> 
    string(212) "struct ImmediateUpload { 
Authentication authentication; 
boolean UpdateExistingContacts; 
boolean TriggerWorkflow; 
ArrayOfContactData contacts; 
ArrayOfInt globalAddToGroup; 
ArrayOfInt globalRemoveFromGroup; 
}" 

ImmediateUploadは、6つのフィールドを持つ構造体です。したがって、渡す$ parametersオブジェクトはこの構造に従わなければなりません。私たちは、さらに残りのデータ型を探すために__getTypes()を検査することができます

[1]=> 
    string(61) "struct Authentication { 
string Username; 
string Password; 
}" 
    [2]=> 
    string(55) "struct ArrayOfContactData { 
ContactData ContactData; 
}" 
    [3]=> 
    string(357) "struct ContactData { 
ContactKey ContactKey; 
NullableElement EmailAddress; 
NullableElement FirstName; 
NullableElement LastName; 
NullableElement PhoneNumber; 
NullableElement Fax; 
ContactStatus Status; 
ContactMailFormat MailFormat; 
boolean IsTestContact; 
ArrayOfCustomAttribute CustomAttributes; 
ArrayOfInt AddToGroup; 
ArrayOfInt RemoveFromGroup; 
}" 

今、私たちは、コードを修正するコード

を修正します。 ImmediateUploadのようなデータ構造を構築しましょう。簡単にするために、クラスの代わりに配列を使用します(いずれの方法もPHPで動作します)。連絡先を作成することから始めてみましょう:

$contact1 = array(
    "ContactKey"  => array("ContactId" => $ContactId, "ContactUniqueIdentifier" => $ContactUniqueIdentifier), 
    "EmailAddress"  => $EmailAddress, 
    "FirstName"   => $FirstName, 
    "LastName"   => $LastName, 
    "PhoneNumber"  => array('', true), 
    "Fax"    => array('', true), 
    "Status"   => $Status, 
    "MailFormat"  => $MailFormat, 
    "IsTestContact"  => $IsTestContact, 
    "CustomAttributes" => array(), 
    "AddToGroup"  => array(), 
    "RemoveFromGroup" => array(), 
); 

そして今、我々はImmediateUploadパラメータを構築します:

$params = array (
    'authentication'   => array("Username" => $Username, "Password" => $Password), 
    "UpdateExistingContacts" => $UpdateExistingContacts, 
    "TriggerWorkflow"   => $TriggerWorkflow, 
    "contacts"    => array($contact1), 
    "globalAddToGroup"  => array(), 
    "globalRemoveFromGroup" => array(), 
); 

は再びあなたのコードを実行します。今すぐコールを行った後、要求のXMLを検査し、それはあなたのSOAPUI要求に非常に似たものになります:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://ws.campaigner.com/2013/01"> 
<SOAP-ENV:Body> 
    <ns1:ImmediateUpload> 
     <ns1:authentication> 
      <ns1:Username>username</ns1:Username> 
      <ns1:Password>password</ns1:Password> 
     </ns1:authentication> 
     <ns1:UpdateExistingContacts>true</ns1:UpdateExistingContacts> 
     <ns1:TriggerWorkflow>false</ns1:TriggerWorkflow> 
     <ns1:contacts> 
      <ns1:ContactData> 
       <ns1:ContactKey> 
        <ns1:ContactId>0</ns1:ContactId> 
        <ns1:ContactUniqueIdentifier>[email protected]</ns1:ContactUniqueIdentifier> 
       </ns1:ContactKey> 
       <ns1:EmailAddress>[email protected]</ns1:EmailAddress> 
       <ns1:FirstName>Steve</ns1:FirstName> 
       <ns1:LastName>Rogers</ns1:LastName> 
       <ns1:PhoneNumber/> 
       <ns1:Fax/> 
       <ns1:Status>Subscribed</ns1:Status> 
       <ns1:MailFormat>Both</ns1:MailFormat> 
       <ns1:IsTestContact>false</ns1:IsTestContact> 
       <ns1:CustomAttributes/> 
       <ns1:AddToGroup/> 
       <ns1:RemoveFromGroup/> 
      </ns1:ContactData> 
     </ns1:contacts> 
     <ns1:globalAddToGroup/> 
     <ns1:globalRemoveFromGroup/> 
    </ns1:ImmediateUpload> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

あなたはまだ認証エラーが発生しますが、今は一歩近づくワーキングコールを得るためにあります。

関連する問題