Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mapb_1990

php + xml

Recommended Posts

boas, tenho k fazer uma aplicação k envie sms's kuando uma reparação está concluida.

 

há uma operadora movel que tem uma API k permite interligar o sistema de envio de sms's deles, com uma outra aplicação.

pelo que pude ver no manual k me mandaram a conexão entre os dois sistemas é feita por xml.

ai está a minha duvida. eu nunca trabalhei com xml, mt menos xml com php, e nem ser komo isso funca.

alguem me pode arranjar um exemplo?

 

Manual da API

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do jeito que você escreveu, um arquivo PDF hospedado no RapidShare e Uma operadora cujo você não citou o nome; Creio que seja algum tipo de vírus este arquivo PDF.

 

Caso queira minha ajuda, por favor hospede o PDF no scribd.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, trata-se de um Web Service.

Voce nao precisa se preocupar com os XML´s, basta criar um Soap Client e executar os metodos no objeto que voce criou.

 

Veja: http://br.php.net/manual/pt_BR/book.soap.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

thanks.

 

estive a estudar o caso e resolvi utilizar a classe nusoap.

fiz um pequena teste, para ver se funcionava, mas não acontece nd.

alguem pode ajudar?

 

<?php
echo '<-- INICIO --><br />';

include_once('lib/nusoap.php');

$smsExpress['url'] = "https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl";

$soapCliente = new soapclient($smsExpress['url']);

$parametros = array(
'application' 	=> 'teste',
'username'		=> 'ju',
'password'		=> 'passwd',
'message'		=> 'mensagem de teste',
'recipients'	=> array('961512769'),
'sender'		=> 'teste sender',
'validity'		=> 1,
);

$result = $soapCliente->call('sendSmsSubmission',$parametros);

echo $result;

echo '<br />-----<br />';

echo '<strong>Pedido:</strong><br><xmp>' . $soapCliente->request . '</xmp><br>';
echo '<strong>Resposta:</strong><br><xmp>' . $soapCliente->response . '</xmp><br>';

echo '<br /><-- FIM -->';
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o soap estiver habilitado no php.ini, naum precisa usar o nusoap, naum vai funcionar.

Verifique se ocorrem erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu utilizei o nusoap porque li que tem vantagens sobre o soap nativo do php.

realmente tinha-me esquecido de habilitar o soap no php.ini. depois de o habilitar, ja aparece alguma coisa, é pena ser um erro.

 

Warning: SoapClient::SoapClient() [function.SoapClient-SoapClient]: I/O warning : failed to load external entity "https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl" in D:\wamp\www\tvprincipe\SmsExpress\index.php on line 9

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl' in D:\wamp\www\tvprincipe\SmsExpress\index.php:9 Stack trace: #0 D:\wamp\www\tvprincipe\SmsExpress\index.php(9): SoapClient->SoapClient('https://smsexpr...') #1 {main} thrown in D:\wamp\www\tvprincipe\SmsExpress\index.php on line 9

http://forum.imasters.com.br/public/style_emoticons/default/cry.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Decida usar ou o SOAP nativo ou o nusoap. As duas juntas não funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu utilizei o nusoap porque li que tem vantagens sobre o soap nativo do php.

 

Não é que o NuSOAP é melhor que o SOAP nativo, o NuSOAP apenas faz uso do poder do SOAP nativo + o Know How da NuSphere e Dietrich Ayala.

Porém eu pessoalmente não gosto do NuSOAP, tenho projetos gigantes onde o nível de integração é total e utilizei apenas o SOAP nativo, veja o link onde utilizo SOAP: http://www.com4.com.br

 

Warning: SoapClient::SoapClient() [function.SoapClient-SoapClient]: I/O warning : failed to load external entity "https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl" in D:wampwwwtvprincipeSmsExpressindex.php on line 9
    
    Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl' in D:wampwwwtvprincipeSmsExpressindex.php:9 Stack trace: #0 D:wampwwwtvprincipeSmsExpressindex.php(9): SoapClient->SoapClient('https://smsexpr...') #1 {main} thrown in D:wampwwwtvprincipeSmsExpressindex.php on line 9

Certo, o SOAP já está habilitado, isso é um bom início. Quando fui criar uma instância de SoapClient para testar esse WSDL percebi, para minha surpresa que o WSDL dessa URL está com problema:

<b>Fatal error</b>: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2?wsdl' : Start tag expected, '<' not found

Assim, eu fui até o link pelo navegador e quando abriu o WSDL eu baixei ele, salvando como SubmissionManager2.wsdl e fiz a validação, dessa vez validou. Isso normalmente significa que, devido ao link que você passou gerar dinamicamente o WSDL ou o fato de estar enviando dados antes mesmo do WSDL ser carregado e causando uma excessão no SSL esteja confundindo o SOAP.

De qualquer forma, você pode usar a versão que você baixou: (Abra o código fonte e baixe por lá)

 

   /**
    * Usando nossa versão local
    */
   $cliente = new SoapClient(
       "SubmissionManager2.wsdl",
       array(
           'trace'            => 1,
           'exceptions'    => 1,
           "style"            => SOAP_RPC,
           "use"            => SOAP_ENCODED,
           "soap_version"    => SOAP_1_1,
           'encoding'        => 'UTF-8'
       )
   );
   
   print_r( $cliente->__getFunctions() );

A saída será:

 

   Array
   (
       [0] => void cancelSubmission(AuthenticationInfo $authentication, string $submissionId)
       [1] => SubmissionStatus sendSmsSubmission(AuthenticationInfo $authentication, SmsSubmission $submission)
       [2] => SubmissionStatus sendMmsSubmission(AuthenticationInfo $authentication, MmsSubmission $submission)
       [3] => SubmissionStatus sendWapPushSubmission(AuthenticationInfo $authentication, WapPushSubmission $submission)
       [4] => SubmissionStatus sendSmsPullSubmission(AuthenticationInfo $authentication, SmsPullSubmission $submission)
       [5] => ArrayOfSmsPullSubmissionResponse getSmsPullSubmissionResponses(AuthenticationInfo $authentication, string $submissionId)
       [6] => SubmissionStatus2 getSubmissionStatus(AuthenticationInfo $authentication, string $submissionId)
       [7] => SubmissionDetails getSubmissionDetails(AuthenticationInfo $authentication, string $submissionId, boolean $getRecipientsStatus)
   )

Então o SOAP está funcionando, vamos agora um teste real:

 

   /**
    * Essa será a classe que conterá o retorno da chamada SmsSubmission
    */
   class SubmissionStatus {
       public $id = "";
       public $message = "";
       public $status = 0;
   }
   
   /**
    * Classe que será usada para autenticação
    */
   class AuthenticationInfo {
       public $application;
       public $password;
       public $username;
   
       public function __construct( $application , $password , $username ){
           $this->application = $application;
           $this->password    = $password;
           $this->username    = $username;
       }
   }
   
   /**
    * Classe base para o envio usando o webservice
    */
   class Submission {
       public $contactLists = array();
       public $deliveryDate;
       public $notification = true;
       public $notificationRecipient = "";
       public $notificationType = "";
       public $recipients = array();
       public $sender = "";
       public $validity = 0;
   }
   
   /**
    * Essa é a classe para o envio de SMS, ela usa a classe Submission como base
    */
   class SmsSubmission extends Submission {
       public $alphabet = "";
       public $message = "";
       public $substitutions = array();
       public $useSubstitutions = false;
   }

Agora que já temos nossas "interfaces" vamos juntar tudo para fazer o pedido:

 

 /**
    * Preste atenção que estamos usando a versão local do WSDL
    */
   $cliente = new SoapClient(
       "SubmissionManager2.wsdl",
       array(
           'trace'            => 1,
           'exceptions'    => 1,
           "style"            => SOAP_RPC,
           "use"            => SOAP_ENCODED,
           "soap_version"    => SOAP_1_1,
           'encoding'        => 'UTF-8',
           'classmap'        => array(
               "SubmissionStatus" => "SubmissionStatus"
           )
       )
   );

  $submission = new SmsSubmission();
  $submission->message = "Mensagem de teste";
  $submission->recipients[] = "961512769";
  $submission->sender = "teste sender";
  $submission->validity = 1;
   
   try {
       $status = $cliente->sendSmsSubmission( new AuthenticationInfo( "teste" , "ju" , "pswd" ) , $submission );
   
       var_dump( $status );
   } catch ( SoapFault $fault ){
       printf( "O seguinte erro ocorreu ao enviar os dados: Erro[ %s ]: %sn" , $fault->getCode() , $fault->getMessage() );
   }

Para mim a solicitação foi:

   <?xml version="1.0" encoding="UTF-8"?>
   <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:ns1="http://mobicomp.com/smsexpress/webservice/server/message"
       xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ns2="http://common.server.webservice.smsexpress.mobicomp.com"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
       <SOAP-ENV:Body>
           <ns1:sendSmsSubmission>
               <authentication xsi:type="ns2:AuthenticationInfo">
                   <application xsi:type="SOAP-ENC:string">teste</application>
                   <password xsi:type="SOAP-ENC:string">ju</password>
                   <username xsi:type="SOAP-ENC:string">pswd</username>
               </authentication>
               <submission xsi:type="ns1:SmsSubmission">
                   <contactLists SOAP-ENC:arrayType="SOAP-ENC:string[0]"
                       xsi:type="ns1:ArrayOf_soapenc_string" />
                   <deliveryDate xsi:nil="true" />
                   <notification xsi:type="xsd:boolean">true</notification>
                   <notificationRecipient xsi:type="SOAP-ENC:string" />
                   <notificationType xsi:type="SOAP-ENC:string" />
                   <recipients SOAP-ENC:arrayType="SOAP-ENC:string[1]"
                       xsi:type="ns1:ArrayOf_soapenc_string">
                       <item xsi:type="SOAP-ENC:string">961512769</item>
                   </recipients>
                   <sender xsi:type="SOAP-ENC:string">teste sender</sender>
                   <validity xsi:type="xsd:int">1</validity>
                   <alphabet xsi:type="SOAP-ENC:string" />
                   <message xsi:type="SOAP-ENC:string">Mensagem de teste</message>
                   <substitutions SOAP-ENC:arrayType="SOAP-ENC:string[][0]"
                       xsi:type="ns1:ArrayOfArrayOf_soapenc_string" />
                   <useSubstitutions xsi:type="xsd:boolean">false</useSubstitutions>
               </submission>
           </ns1:sendSmsSubmission>
       </SOAP-ENV:Body>
   </SOAP-ENV:Envelope>

Obviamente que, como a senha que eu usei não é válida, recebi a seguinte resposta:

   <?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>
           <soapenv:Fault>
               <faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:0002</faultcode>
               <faultstring>Username ou password inválidos. Tente novamente.
               </faultstring>
               <detail>
                   <ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">com.mobicomp.smsexpress.webservice.server.common.AuthenticationException
                   </ns2:exceptionName>
                   <ns3:hostname xmlns:ns3="http://xml.apache.org/axis/">sx-as1.tmn.pt</ns3:hostname>
               </detail>
           </soapenv:Fault>
       </soapenv:Body>
   </soapenv:Envelope>

Isso mostra que, como houve a validação do usuário e senha, funcionou 100%

Compartilhar este post


Link para o post
Compartilhar em outros sites

João Batista Neto, muito obrigado pela ajuda. já fiquei a entender de webServices, à sua conta.

 

só tenho mais 3 questões:

 

  • para que serve a classe SubmissionStatus?
  • como é k vejo a solicitação e a resposta?
  • como resolvo o problema do wsdl nao dar, kuando está no server pa empresa que disponibiliza o serviço?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1. para que serve a classe SubmissionStatus?

 

Sempre que você utilizar $cliente->sendSmsSubmission você irá receber como resposta uma instância da classe SubmissionStatus com o status do seu envio; No PDF da documentação contém os códigos do status e o significado de cada um deles.

 

2. como é k vejo a solicitação e a resposta?

 

Sempre que você utiliza o SoapClient você consegue ver o que enviou e o que recebeu utilizando os seguintes métodos:

 

$cliente = new SoapClient(
    "SubmissionManager2.wsdl",
    array(
        'trace'            => 1,
        'exceptions'    => 1,
        "style"            => SOAP_RPC,
        "use"            => SOAP_ENCODED,
        "soap_version"    => SOAP_1_1,
        'encoding'        => 'UTF-8',
        'classmap'        => array(
            "SubmissionStatus" => "SubmissionStatus"
        )
    )
);

$cliente->sendSmsSubmission(....);

var_dump( $cliente->__getLastRequest() ); //Isso irá mostrar sua última solicitação
var_dump( $cliente->__getLastRequestHeaders() ); //Isso irá mostrar os cabeçalhos da sua última solicitação
var_dump( $cliente->__getLastResponse() ); //Isso irá mostrar a resposta da sua última solicitação
var_dump( $cliente->__getLastResponseHeaders() ); //Isso irá mostrar os cabeçalhos da resposta da sua última solicitação

3. como resolvo o problema do wsdl nao dar, kuando está no server pa empresa que disponibiliza o serviço?

 

Você deve entrar em contato com a empresa e pedir para eles verificarem o link, e até que essa verificação tenha sido feita você poderá fazer como eu disse, baixar o WSDL e usar uma cópia local.

Isso não irá interferir no funcionamento do serviço porque na definição do web service é definido também o caminho da aplicação:

 

<wsdl:service name="SubmissionManagerService">
    <wsdl:port binding="impl:SubmissionManager2SoapBinding" name="SubmissionManager2">
    <!-- Aqui está o caminho da aplicação -->
    <wsdlsoap:address location="https://smsexpress.tmn.pt/smsexpress-webservices/SubmissionManager2"/>
    </wsdl:port>
</wsdl:service>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.