Ir para conteúdo

Arquivado

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

dokan

[Resolvido] Enviar XML via SOAP

Recommended Posts

Alguem sabe como enviar esse xml via POST

<purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/"> <!--Optional:--> <arg0 xmlns=""> <authentication> <username>string</username> <password>string</password> <merchantID>string</merchantID> </authentication> <purchases> <!--Zero or more repetitions:--> <purchase> <terminalID>string</terminalID> <merchantTrackID>string</merchantTrackID> <amount>string</amount> <currencycode>string</currencycode> <instType>string</instType> <!--Optional:--> <instNum>string</instNum> <card> <number>string</number> <!--Optional:--> <cvv2>string</cvv2> <expiryMonth>string</expiryMonth> <expiryYear>string</expiryYear> <holderName>string</holderName> </card> <!--Optional:--> <userDefinedField> <!--Optional:--> <udf1>string</udf1> <!--Optional:--> <udf2>string</udf2> <!--Optional:--> <udf3>string</udf3> <!--Optional:--> <udf4>string</udf4> <!--Optional:--> <udf5>string</udf5> </userDefinedField> <!--Optional:--> <tranMCC>string</tranMCC> <!--Optional:--> <softDescriptor>string</softDescriptor> </purchase> </purchases> </arg0> </purchaseService>

Compartilhar este post


Link para o post
Compartilhar em outros sites

É POST ou SOAP?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O envio é via POST.

 

Eu tenho que passar esse xml pelo metodo POST, na URL, veja a url abaixo.

$info_conecta = array( "trace" => 1,
        "location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService",
        "uri"      => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService");
                               
$client = new SoapClient("./wsdl/AdministrationService.wsdl",$info_conecta);
$compra = $client->changeAuthenticationService($request);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda assim está um pouco confuso, pois em um momento você fala POST mas no exemplo usa SOAP.

 

Você deve verificar o arquivo WSDL, pois ele descreve tudo que é necessário passar. Se o XML acima passado é a descrição de um método, indentando-o você encontrará tudo que é necessário:

 

 

 

<purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/"> 

    <!--Optional:-->     
    <arg0 xmlns=""> 
        <authentication> 
            <username>string</username> 
            <password>string</password> 
            <merchantID>string</merchantID> 
        </authentication> 
        
        <purchases> 
        <!--Zero or more repetitions:--> 
            <purchase> 
                <terminalID>string</terminalID> 
                <merchantTrackID>string</merchantTrackID> 
                <amount>string</amount> 
                <currencycode>string</currencycode> 
                <instType>string</instType> 
                
                <!--Optional:--> 
                <instNum>string</instNum> 

                <card> 
                    <number>string</number> 
                    
                    <!--Optional:--> 
                    <cvv2>string</cvv2> 
                    <expiryMonth>string</expiryMonth> 
                    <expiryYear>string</expiryYear> 
                    <holderName>string</holderName> 
                </card> 

                <!--Optional:--> 
                <userDefinedField> 

                <!--Optional:--> 
                <udf1>string</udf1> 

                <!--Optional:-->                 
                <udf2>string</udf2> 

                <!--Optional:--> 
                <udf3>string</udf3> 

                <!--Optional:--> 
                <udf4>string</udf4> 
                
                <!--Optional:--> 
                <udf5>string</udf5> 
                </userDefinedField> 
                
                <!--Optional:--> 
                <tranMCC>string</tranMCC> 
                
                <!--Optional:--> 
                <softDescriptor>string</softDescriptor> 
            </purchase> 
        </purchases> 
    </arg0> 
</purchaseService>

 

 

Para passar os dados, você possui algumas formas, como arrays associativos, standard class ou mapeamento de classes.

 

Como exemplo vou usar uma standard class, supondo que o nome do método é purchaseService:

$purchaseService = new stdClass();

$authentication = new stdClass();
$authentication->username = "usuario";
$authentication->password = "senha";
$authentication->merchantID = "id";

$purchaseService->arg0->authentication = $authentication; 

/** exemplo compacto de várias compras **/
/** é preferível utilizar \ArrayObject ao invés de array() **/
$purchases = new \ArrayObject();

$purchase = new stdClass();

$purchase->terminalID = "string";
$purchase->merchantTrackID = "string";
$purchase->amount = "string";
$purchase->currencycode = "string";
$purchase->instType = "string";

/**

demais configurações

**/

/** adiciona-se o tipo especificado como SoapVar **/
$purchases->append(new \SoapVar($purchase , SOAP_ENC_OBJECT , null , null , 'purchase'));

/** suponha-se que existe $purchase1 e $purchase2 **/
$purchases->append(new \SoapVar($purchase1 , SOAP_ENC_OBJECT , null , null , 'purchase'));
$purchases->append(new \SoapVar($purchase2 , SOAP_ENC_OBJECT , null , null , 'purchase'));

$purchaseService->arg0->purchases = new \SoapVar($purchases , SOAP_ENC_OBJECT , null , null , 'purchases');

/** varíavel criada no seu exemplo **/
$return = $client->purchaseService($purchaseService);
Perceba que somente no momento em que eu criei uma lista de compras, eu fiz uso de SoapVar, e na hora da autenticação não. Isso se faz necessário para uma melhor interpretação da lista no XML, uma vez que em nenhum momento é definido que é uma lista do objeto "purchase", apenas "purchases".

É interessante ler sobre o erro da tag BOGUS

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, valew pela explicação consegui entender o funcionamento do SOAP,

 

A questão acima é que na documentação diz via POST e no exemplo esta em SOAP, e como eu não conhecia SOAP fiquei perdido, mas agora eu vi que da pra fazer das duas formas.

 

consegui fazer em SOAP mas agora não estou conseguindo pegar a informação descriptionResponse do array, em uma tela de consulta da transação.

 

Com o var_dump($result) ele imprime todo o resultado mas eu preciso apenas do descriptionResponse e o transactionID

<?php 

 ini_set('soap.wsdl_cache_enabled',0);
 ini_set('soap.wsdl_cache_ttl',0);
 
class JaxWsSoapClient extends SoapClient
{
    public function __call($method, $arguments){
        $response = parent::__call($method, $arguments);
        return $response;
    }
}
 try { 
  
  $client  = new JaxWsSoapClient("./wsdl/CommerceService.wsdl",
                                       array("trace" => 1,
											"location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
											"uri"      => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
                                     ));
									 
$request = array(
    'arg0' => array(
        'authentication' => array(
			'username'   => 'user',
			'password'   => 'pass',
			'merchantID' => '54345',
        ),
        'query' => array(
            'query' => array(
                'terminalID' => 'D055362101',
				'merchantTrackID' => '0008',
            ),
        ),
    ),
);
 $result = $client->__call('queryDataService', array($request));
 
  echo("<br/>Dumping request:<br/>".$client->__getLastRequest());
  echo("<br/>Returning value of __soapCall() call:<br/> ");
  
  var_dump($result);
 	
}catch(SoapFault $exception)
{
  print_r("Got issue:<br/>") ;
  print_r($exception->getMessage());
}
 
?>

Resultado

object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "65364455766456471" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } }

Compartilhar este post


Link para o post
Compartilhar em outros sites

O restorno é um stdClass, que você armazena em $result.

 

O método __getLastRequest apenas mostra o XML da última requisição, ele é para debug de código e não para uso em produção, você deve utilizar a variável $result.

var_dump($result);

A partir desse resultado, você pode consultar as variáveis mais abaixo:

$queryResponse = $result->result->result;

echo $queryResponse->transactionID;
echo $queryResponse->originalTransactionID;
/** assim por diante **/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi, pois aqui não funcionou o código ficou assim

<?php 

 ini_set('soap.wsdl_cache_enabled',0);
 ini_set('soap.wsdl_cache_ttl',0);
 
class JaxWsSoapClient extends SoapClient
{
    public function __call($method, $arguments){
        $response = parent::__call($method, $arguments);
        return $response;
    }
}
 try { 
  
  $client  = new JaxWsSoapClient("./wsdl/CommerceService.wsdl",
                                       array("trace" => 1,
											"location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
											"uri"      => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
                                     ));
									 
$request = array(
    'arg0' => array(
        'authentication' => array(
			'username'   => 'user',
			'password'   => 'pass',
			'merchantID' => '54345',
        ),
        'query' => array(
            'query' => array(
                'terminalID' => 'D055362101',
				'merchantTrackID' => '0008',
            ),
        ),
    ),
);
 $result = $client->__call('queryDataService', array($request));
 
  echo("<br/>Dumping request:<br/>".$client->__getLastRequest());
  echo("<br/>Returning value of __soapCall() call:<br/> ");
  
  var_dump($result);

  $queryResponse = $result->result->result;
 
  echo $queryResponse->transactionID;
  echo $queryResponse->originalTransactionID;

 	
}catch(SoapFault $exception)
{
  print_r("Got issue:<br/>") ;
  print_r($exception->getMessage());
}
 
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que eu te passei, é para você verificar o retorno, e não para usar em produção.

 

var_dump exibe o conteúdo da variável, avalie o que ela recebe e, então, utilize e ajuste o exemplo que eu passei por segundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

resultado do var_dump

object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "6536445561450971" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } } 

Agora esse final eu não entendi ainda.


 $result = $client->__call('QueryDataService', array($request));
 

	$queryResponse = $result->result->result;

	echo $queryResponse->descriptionResponse;
	echo $queryResponse->originalTransactionID;
	

 
}catch(SoapFault $exception)
{
  print_r("Got issue:<br/>") ;
  print_r($exception->getMessage());
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja bem, o var_dump resultou isso (obs: idente seus códigos, inclusive os retornos, facilitam a compreensão):

object(stdClass)#2 (1) { 
    ["queryResponse"]=> object(stdClass)#3 (1) { 
        ["result"]=> object(stdClass)#4 (1) { 
            ["result"]=> object(stdClass)#5 (7) { 
                ["transactionID"]=> string(16) "6536445561450971" 
                ["originalTransactionID"]=> string(2) "-1" 
                ["merchantTrackID"]=> string(4) "0008" 
                ["descriptionResponse"]=> string(8) "APPROVED" 
                ["responseCode"]=> string(2) "00" 
                ["auth"]=> string(6) "026155" 
                ["postdate"]=> string(4) "0407" 
            } 
        } 
    } 
} 

Veja que o objeto é uma stdClass, logo, você deve acessar ela como uma classe. Lhe darei um exemplo aonde eu crio uma stdClass:

$class = new stdClass();
$class->variavel = "um resultado qualquer";
$class->result = new stdClass();
$class->result->result = new stdClass();
$class->result->result->result = "mais um valor qualquer";

var_dump($class);

Saída:

object(stdClass)[1]
  public 'variavel' => string 'um resultado qualquer' (length=21)
  public 'result' => 
    object(stdClass)[2]
      public 'result' => 
        object(stdClass)[3]
          public 'result' => string 'mais um valor qualquer' (length=22)

Apesar da saída ser um pouco diferente (provavelmente seja pelo xdebug instalado na minha máquin) o exemplo continua sendo válido

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.