Нет lol , потому что сервис работает как задумано. Давайте выясним, почему ваш soap клиент выдает эту ошибку.
Сначала взглянем на определения в wsdl. Для метода PutLead
параметр определяется следующим образом.
<s:element name="PutLead">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="pessoa" type="tns:Lead"/>
<s:element minOccurs="0" maxOccurs="1" name="Key" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
Для правильного выполнения метода веб-службы PutLead
определен комплексный тип PutLead
, который имеет элементы pessoa
и Key
. Элемент pessoa
определяется как tns: Lead type. Элемент Key
представляет собой простую строку. Определение сложного типа можно рассматривать как объект значения данных php. простой объект, который содержит данные. Итак, давайте определим объект php для комплексного типа PutLead
.
<?php
declare(strict_types=1);
namespace Application\Model;
class PutLead
{
protected ?Lead $pessoa;
protected ?string $Key;
public function getPessoa(): ?Lead
{
return $this->pessoa;
}
public function setPessoa(Lead $pessoa): self
{
$this->pessoa = $pessoa;
return $this;
}
public function getKey(): ?string
{
return $this->Key();
}
public function setKey(string $key): self
{
$this->Key = $key;
return $this;
}
}
Этот объект значения php распознает все определения из определения комплексного типа wsdl PutLead
. Два свойства могут встречаться в точности ноль или один раз. Свойство Key
является строковым типом, а свойство pessoa
может быть объектом Lead.
Что говорит wsdl об определении tns:Lead
?
<s:complexType name="Lead">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="Nome" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Email" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Telefone" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Observacoes" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Campanha" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Unidade_Id" type="s:int"/>
</s:sequence>
</s:complexType>
Здесь мы можем видите, почему ваш клиент выдает ошибку soap с сообщением object has no 'Id' property
. Сложный тип pessoa
должен содержать свойство Id
и свойство Unidade_Id
. Оба не были определены, поэтому веб-служба выдает ошибку.
Объект значения php должен выглядеть следующим образом:
<?php
declare(strict_types=1);
namespace Application\Model;
class Lead
{
protected int $Id;
protected ?string $Nome;
protected ?string $Email;
protected ?string $Telefone;
protected ?string $Observacoes;
protected ?string $Campanha;
protected int $Unidade_Id;
public function getId(): int
{
return $this->Id;
}
public function setId(int $id): self
{
$this->Id = $id;
return $this;
}
public function getNome(): ?string
{
return $this->Nome;
}
public function setNome(string $nome): self
{
$this->Nome = $nome;
return $this;
}
public function getEmail(): ?string
{
return $this->Email;
}
public function setEmail(string $email): self
{
$this->Email = $email;
return $this;
}
public function getTelefone(): ?string
{
return $this->Telefone;
}
public function setTelefone(string $telefone): self
{
$this->Telefone = $telefone;
return $this;
}
public function getObservacoes(): ?string
{
return $this->Observacoes;
}
public function setObservacoes(string $observacoes): self
{
$this->Observacoes = $observacoes;
return $this;
}
public function getCampanha(): ?string
{
return $this->Campanha;
}
public function setCampanha(string $campanha): self
{
$this->Campanha = $campanha;
return $this;
}
public function getUnidadeId(): int
{
return $this->Unidade_Id;
}
public function setUnidadeId(int $unidadeId): self
{
$this->Unidade_Id = $unidadeId;
return $this;
}
}
Показанный выше объект значения php отражает в точности tns:Lead
определение сложного типа. С двумя определенными php объектами значения вы можете выполнить запрос PutLead
.
<?php
declare(strict_types=1);
namespace Application;
use Application\Model\Lead;
use Application\Model\PutLead;
use SoapClient;
use SoapFault;
try {
$wsdl = 'http://crm4u.azurewebsites.net/WS_Integracao.asmx?WSDL';
$options = [
'exceptions' => true,
'soap_version' => SOAP_1_1,
'trace' = true,
];
$client = new SoapClient($wsdl, $options);
// request for a valid key
$key = ...;
// the following variables $id, $nome, $email, $telefone, $observacoes
// $campanha and $unidadeId must be declared before the following init
$pessoa = (new Lead())
->setId($id)
->setNome($nome)
->setEmail($email)
->setTelefone($telefone)
->setObservacoes($observacoes)
->setCampanha($campanha)
->setUnidadeId($unidadeId)
$putLead = (new PutLead())
->setPessoa($pessoa)
->setKey($key);
$result = $client->PutLead($putLead);
} catch (SoapFault $fault) {
var_dump($fault);
}
Как вы можете видеть, класс SoapClient
инициализируется с помощью адреса wsdl и некоторых опций, которые заставляют soap клиент для выдачи исключений как SoapFault
экземпляров. Кроме того, вы можете отслеживать запрос и ответ с помощью SoapClient::__getLastRequest()
и SoapClient::__getLastResponse()
. Если клиент был инициализирован без выдачи ошибки, вы можете использовать эти методы, чтобы просмотреть последний отправленный запрос и последний полученный ответ, если таковой был получен. Это может быть очень полезно при отладке всего процесса.