Ayuda consumo webservice con php

13556 visitas 15 respuestas

COmo estan.

Estoy haciendo un sistema de pagosa en linea. Para eso debo consumir un webservice pero nada que lo gro hacerlo funcionar.

https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx?wsdl

Estoy tratando de cargar el listad ode bancos disponibles para realizar el pago .. Lo estoy haciendo llamando al methodo getbanklist pero no da resultado... Quisiera sabersi lo estoy haciendo bien o estoyinvocando mal al metodo o me faslta algo por hacer...Gracias

<?
$wsdl="https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx?wsdl"; //url del webservice que invocaremos
$client=new soapclient($wsdl,true); //instanciando un nuevo objeto cliente para consumir el webservice
$param=array('EntityCode'=>'5345435'); //pasando parametros de entrada que seran pasados hacia el metodo
$LisBancos = $client->call('getBankList', $param); //llamando al metodo y recuperando el array de productos en una variable

    //¿ocurrio error al llamar al web service? 
    if ($client->fault) { // si
          echo '<br /> No se pudo completar la operación'; 
          die(); 
    }else{ // no
        $error = $client->getError(); 
        if ($error) { // Hubo algun error 
            echo 'Error:' . $error . '<br /><br />'; 
        } 
    }     
    if(is_array($LisBancos))
    { //si hay valores en el array
        for($i=0;$i<count($LisBancos);$i++)
        {
            echo $LisBancos[$i]['financialInstitutionCode'].'<br>';
        }
    }else{
        echo 'No hay bancos';
    }
?>

por desde Colombia

Registrado desde: 02 Aug 10

Respuestas

0 0

Quizas estoy diciendo una tontada...., y no hace diferencia, pero.... En la definicion de getBankList, el parametro entityCode, comienza en minuscula, y vos lo estas pasando como EntityCode.

Tambien intenta sacando el "?wsdl" de la url, ya que el "?wsdl" muestra la definicion del webservice, y no es el webservice en si.

$wsdl="https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx";

Espero te sirva alguna de las 2 soluciones.

No estoy seguro que sea alguna de las 2, realice pocos codigos para conexion a webservices y para intentar detectar exactamente tu problema, tendria que probar tu codigo en mi servidor.

Si no te funciona lo que te digo, hacemelo saber y pruebo el codigo.

Saludos

0 0

Ya probe las soluciones que me dio pero n odieron resultado... YO creo que mi problema esta en el llamado al método no se si pueda ayudarme arevisar es que yo veo que existe un getBankList Information y otras cosas pero n oe sabido bien como hacer el consumo. Si esposible ayudeme a revisar haber si encuentra el error.

Tengo un ejemplo del consumo hecho en .net "Si sabe .net subo el codigo" para que me ayude a mirar que esta pasando porque el consumo lo tengo que hacer desde PHP.

Gracias

por desde Colombia

Registrado desde: 02 Aug 10
0 0

Bueno, me puse a probar el codigo, y encontre que para pasar los parametros al metodo hay que crear clases para los tipos de datos. El codigo, tal cual lo tenes vos, estaba devolviendo una excepcion del webservice.

Yo modifique el codigo con las clases que hacen falta, pero me esta dando un error de seguridad, el cual no se si es que hace falta conectarse al webservice con algun usuario y contraseña para poder ejecutar los metodos.

El error que me esta devolviendo dice:

"The security information supplied was not valid."

Este es el codigo:

<?php

$wsdl = "https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx?wsdl";
$client = new SoapClient($wsdl, array(
    'trace'            => true,
    'exceptions'    => true,
    'soap_version'   => SOAP_1_1
));

/**
* Segun parece, los parametros hay que pasarlos en el tipo de dato que corresponde
* segun la definicion del webservice, estas son las clases necesarias para pasar el dato
*/
class getbankListInformationType {
    public $entityCode;
}

class getBankList {
    public $getBankListInformation;
}

/**
* Luego se deben crear los objetos y asignar los valores de las propiedades/
*/
$var1 = new getbankListInformationType();
$var1->entityCode = '5345435';

$param  = new getBankList();
$param->getBankListInformation = $var1;

// *******************************************************************************

$error = 0;
try {
    $LisBancos = $client->getBankList($param);
} catch (SoapFault $fault) { 
    $error = 1;
    echo "<pre><b>ERROR:</b><br>".$fault->faultcode."-".$fault->faultstring.".</pre>"; 
}

if(is_array($LisBancos))
{ //si hay valores en el array
    for($i=0;$i<count($LisBancos);$i++)
    {
        echo $LisBancos[$i]['financialInstitutionCode'].'<br>';
    }
}else{
    echo 'No hay bancos';
}

?>

Y si, se .NET, si queres, pasame el codigo y lo miro.

Saludos

0 0

Gracias por la ayuda... Yosi decia que el consumo lo estaba haciendo mal pero no sabia com olo debia hacer... Efectivamente esta sacando el problema de seguridad....

Debo implementar WS-security ¿Con soap php se peude implementar eso? ¿Como seria?

Ellos me entregaron un certificado .cer y se genero un keystore con keytool de java... con unos comandos de openssl lo converti a formato p12.

Estaba intentando hacerlo utilizando la libreria wso2php pero no e sabido muy bien como hacerlo..

Ellos "osea la gente que creo wso2php" tienen una herramienta que genera el mapa de clases de lwsdl...

http://labs.wso2.org/wsf/php/wsdl2phptool.php?wsdl_url=https%3A%2F%2Fdesarrollo.pse.com.co%2FPSEWebServices%2FMainServices.asmx%3Fwsdl&generate_type=client

Luego hay un try catch donde uno hace el llamado al metodo que necesita.. yo tengo esto pero no funciona no se si me pueda ayudar a revisar "disculpe que sea tan abusivo pero me urge hacer funcionar eso"

tengo este codigo

<?
        $my_cert = ws_get_cert_from_file("Empresa.cer");
        $my_key = ws_get_cert_from_file("keyprubas.p12");

        $reqMessage = new WSMessage($reqPayloadString,
                                array("to" => "https://desarrollo.pse.com.co/PSEWebServices3/MainServices.asmx?wsdl"));

           $policy_xml = file_get_contents("policeman.xml");
        $policy = new WSPolicy($policy_xml);
        $sec_token = new WSSecurityToken(array("privateKey" => $my_key,
                                           "receiverCertificate" => $my_cert,
                                           "passphrase" => 'quasar2010'));

   // create var witch URL on WSDL
    $DirConWsdl = "https://desarrollo.pse.com.co/PSEWebServices3/MainServices.asmx?wsdl";
    // create client in WSDL mode
    $client = new WSClient(array ("policy" => $policy,"useWSA" => TRUE,
                                  "useSOAP" => "1.1","wsdl" => $DirConWsdl,
                                  "classmap" => $class_map,"securityToken" => $sec_token));

    // get proxy object reference form client 
    $proxy = $client->getProxy();
    /*****************************************************/    
    $input = new getbankListInformationType();
    $input->entityCode = '56465465';
    $Listado = new getBankList();
    $Listado->getBankListInformation = $input;
    /************************************************/
    $header_in0 = new MessageHeaderType();
    $response = $proxy->getBankList($Listado, $header_in0, &$header_out0);
      var_dump($response);

    // Create message with request payload and options
    $reqMessage = new WSMessage($reqPayloadString, array("to" =>$DirConWsdl));

     // Send request and capture response
    $resMessage = $client->request($reqMessage);
    //echo  "<br /><br />".$client->getLastRequest();
    // echo "Cabeceras: ".$proxy = $client->getLastResponseHeaders()."<br /><br />";

} catch (Exception $e) {
     var_dump($e);
    echo $client->getLastRequest();
    // in case of an error, process the fault
    if ($e instanceof WSFault) {
        printf("Soap Fault: %s\n", $e->Reason);
    } else {
        printf("Message = %s\n", $e->getMessage());
    }
}
?>

EL codigo de .net que tengo es este ... creo que hace lo que usted hizo.

using System.ComponentModel;
using System.Web.Services;
using Microsoft.Web.Services; 

namespace PSEWebServicesClient
{

    /// 
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="MainServicesSoap", Namespace="http://vesta.com.br/PSE/MainServices")]
    public class MainServicesProxy : WebServicesClientProtocol
    {    
        public MessageHeaderType messageHeader;

        /// 
        public MainServicesProxy() 
        {
            this.Url = "http://localhost/EL PSEWebServices/MainServices.asmx";
        }

        /// 
        [System.Web.Services.Protocols.SoapHeaderAttribute("messageHeader", Direction=System.Web.Services.Protocols.SoapHeaderDirection.InOut, Required=false)]
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://vesta.com.br/el PSE/MainServices/getBankList", RequestNamespace="http://www.uc-council.org/smp/schemas/eanucc", ResponseNamespace="http://www.uc-council.org/smp/schemas/eanucc", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("getBankListResponseInformation")]
        public getBankListResponseInformationType[] getBankList(getbankListInformationType getBankListInformation) 
        {
            object[] results = this.Invoke("getBankList", new object[] {
                                                                           getBankListInformation});
            return ((getBankListResponseInformationType[])(results[0]));
        }
...

por desde Colombia

Registrado desde: 02 Aug 10
0 0

Ok, ahora hay mas datos en donde mirar...., no se si la clase para conectarte al WebService te la dio la misma empresa "pse" o si son otros, pero me parece que hace demasiadas cosas que no son tan necesarias, que utilizando la clase SoapClient de PHP se pueden hacer sin problemas y con menos codigo...( hay que leer la documentacion! :P )

No se si en el codigo PHP que me pasaste, esta haciendo algo antes de eso..., pero veo que te falta especificar y setear la variable $class_map, esa variable, si mal no recuerdo, deberia ser un array especificando las clases con las definiciones de datos de los metodos del WebService, o sea..., deberias tener declaradas las clases como las habia declarado yo en el ejemplo que te pase, y en la variable $class_map definirla asi:

<?php
$class_map = Array('getbankListInformationType' => 'getbankListInformationType', 'getBankList' => 'getBankList'];
?>

Si hay algo mas ademas de eso que este devolviendo error, simplemente no lo se y no voy a poder testearlo, ya que no tengo los certificados para probar la conexion.

De todas maneras, por como veo que es estructurado ese codigo, el wso2php seguramente esta utilizando el SoapClient.

Ahora bien..., como me dijiste, y veo que lo agregaste en este codigo nuevo, ellos te dieron un certificado y tenes el passphrase, asi que simplemente tendrias que agregarlos al codigo que te pase yo como paramentros al constructor del SoapClient, de esta manera:

<?php
$wsdl = "https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx?wsdl";
$client = new SoapClient($wsdl, array(
    'trace'            => true,
    'exceptions'    => true,
    'soap_version'   => SOAP_1_1,
    'local_cert'    => 'Empresa.cer',
    'passphrase' => 'quasar2010'
));

//Aca continua el resto del codigo que te habia pasado yo.....
?>

Proba con eso..., tene en cuenta que el archivo del certificado( Empresa.cer ), tiene que estar en la misma carpeta que el script php, si no es asi, modifica el parametro "local_cert" para que busque el archivo donde corresponda.

Cualquier cosa mira la documentacion de SoapClient en la pagina de php [url]http://ar.php.net/manual/en/soapclient.soapclient.php

Y hasta que el script no te funcione correctamente, dejale los parametros "trace" y "exceptions" en "true" para que te muestre los errores, y acordate de pasarme los errores que te este devolviendo, asi puedo ayudarte mejor.

Saludos

P.D.: No seas tan formal, me podes tutear :P ;)

0 0

Gracias de nuevo

Coloque el local cert y el passphrase y me sale esto "probe colocando el certificado en formato .pem y .cer y no funciona" En el error_log sale esto:

[Tue Aug 10 14:40:19 2010] [error] [client 172.16.1.1] PHP Warning: SoapClient::construct() [http://www.php-hispano.net/function.SoapClient---construct]: Unable to set local cert chain file `Empresa.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in /var/www/html/ConsMejorado.php on line 10 [Tue Aug 10 14:40:19 2010] [error] [client 172.16.1.1] PHP Warning: SoapClient::construct() [http://www.php-hispano.net/function.SoapClient---construct]: failed to create an SSL handle in /var/www/html/ConsMejorado.php on line 10

En cuanto al codigo que le mostre... En el link que coloque labs.wso2.... hay uno coloca la url del wsdl y el genera el mapa de clases que usted me comenta... lego hay un try catch que es donde yo hago el consumo del metodo que necesito "que es el codigo que coloque" Es posible que entre a ese link hay le genera el codigo y con el codigo que yo coloque me ayude a mirar que cosas tengo mal? gracias

EDITO Le di permisos a la carpeta de los certficados y puse el siguiente codigo y ahora me saca este error ¿Que puede ser?

HTTP-Could not connect to host.

<? $client = new SoapClient($wsdl, array(

'trace'            => true,
'exceptions'    => true,
'soap_version'   => SOAP_1_1,
'local_cert' => "keycertificado.p12",
'passphrase' => "certificado2010"

)); ?>

por desde Colombia

Registrado desde: 02 Aug 10
0 0

Proba con lo siguiente..., encontre estos 2 posts en el manual de PHP:

[url]http://www.php.net/manual/es/ref.soap.php#71306 [url]http://www.php.net/manual/es/ref.soap.php#73050

Para el curl, verifica que la extension este activa ejecutando la funcion phpinfo();

Tambien, si la PC en donde estas probando el codigo esta tiene Windows, proba con esto: [url]http://www.php.net/manual/es/ref.soap.php#74140

Los 3 links se refieren al 1er mensaje de error que me pasaste.

Cualquier cosa me avisas..., mandame un mensaje privado, porque sino no me entero si posteaste o no.

Saludos

0 0

Que mas

Estive revisando los links que me dio y pues hay muestran basicamente la misma forma para colocar el certificado... Ya probe convirtiendo a otros formatos el certificado y tampoco ..

Ahora me sale el siguiente error en pantalla ... depronto le da mas idea para ayudarme a encotrnar la solución.

Con el .p12 me sale esto

Bad.Security-System.Web.Services.Protocols.SoapException: The security information supplied was not valid.
   at PSEWebServices.WebServiceController.Execute(HttpContext http_context, Hashtable parameters)
   at PSEWebServices.WebServiceController.Execute(HttpContext context, SoapContext requestContext, String action, Hashtable action_parameters, Boolean isAHostedMethod)
   at PSEWebServices.MainServicesImpl.getBankList(getbankListInformationType getBankListInformation).

Con el .pem le sale esto:

ERROR:
HTTP-Could not connect to host.

Gracias

por desde Colombia

Registrado desde: 02 Aug 10
0 0

COmo esta.

Acabo de hablar con la gente de PSE "los dueños del WS". me dicen que el sistema les reporta que hubo una peticion con este mensaje "Que por lo que veo tiene la estructura basica del mensaje que se debe generar realmente"

Lo encierro entre etiquetras php para que el foro no me dañe el codigo

8600672037

Me dicen ellos que falta toda la información de seguridad requerida.... Ellos me dieron un ejemplo de un mensaje bien formado ... sabe como debo hacer para agregarle todo eso???? gracias

<?

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

7Ny+sj+sACaNoscDDrm3uKtA3l8=

1q/NeJj2T5wUpR2L0U+b/ywk1R7/v9cfXdwheHnZjPpyPFWBgA3P3V0b8Vz/Qjf0bK/0xvdiA689 AWZGz2uP3X+NESxHmoz4O3qqa4DdfLySt9+GLYaa/evgdB35pM8e5tMHBdva96Dkj173mjTS/dvC tb6bDzahtbw/Slup1b4=

2010-07-27T20:59:37.000Z

770999910251377099991057057709999105705

8300001672

?>

por desde Colombia

Registrado desde: 02 Aug 10
0 0

Si, todos esos datos que faltan los agrega el SoapClient cuando logre cargar los datos del certificado correctamente...

Los links que te pase no te los pase para que vieras como pasan los parametros del certificado, si no para que leyeras los problemas que tuvieron y las soluciones que hicieron para que les funcione..., los 3 tuvieron el mismo problema que vos, con el mismo mensaje de error, y los 3 hicieron distintas soluciones..., tenes que verificar que vos tengas correctamente las 3 soluciones que ellos tuvieron que hacer; tener la extension curl activada, si estas en un servidor windows poner el path completo al archivo del certificado y verificar que los datos del certificado sean correctos.

Si no, pasame los contenidos de los archivos de los certificados indicandome los nombres de los archivos de cada uno e intento conectarme yo utilizando los certificados e intento encontrar el problema.

Saludos

0 0

Gracias CamEl ..

Si señor yo ya verifique qu tengo curl activo, tambien hay decia que uniera con un comando el certificado y el keysotre en un archivo .pem eso lo hice pero el error sigue hay, y estoy usando un servidor linux asi que por el path creo que no deberia tener problemas...

El certificado al abrirlo con bloc de notas genera otra codificacion, que no me acepta el foro... Si esposible regaleme un correo electronico por privado y se los hago llegar para que me ayude a revisar el tema.

saludos

por desde Colombia

Registrado desde: 02 Aug 10
0 0

Perdon la tardanza...

El certificado que tenes que utilizar en el WebService, deberia estar en un formato standar de PEM, el contenido del archivo tiene que ser similar a este:

-----BEGIN CERTIFICATE-----
MIIDxjCCAq6gAwIBAgIKUokFgwAAAAAFTjANBgkqhkiG9w0BAQUFADASMRAwDgYD
VQQDEwdBQ0hST09UMB4XDTEwMDcyNzEzNDcyM1oXDTEwMDkxMDE5NDgwNFowajEL
MAkGA1UEBhMCQ08xFTATBgNVBAgTDEN1bmRpbmFtYXJjYTEPMA0GA1UEBxMGQm9n
b3RhMQ8wDQYDVQQKEwZRdWFzYXIxETAPBgNVBAsTCFNpc3RlbWFzMQ8wDQYDVQQD
EwZRdWFzYXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL+Mt/ZZSKYpX64C
4hW5V+L2iVUG4QwZw6N5eGk/sGpyi9D9IQysKxKTNqcNvy8/LHWAW/cOja1FpRAw
FV99MwbPexZ6KA0oJ/ygw1FazUmDFrru/dXdtt15nbKK9Tqz8IKfHqaZ9P3JObyG
fSYEbO4e0C0vVXOaszuCQH0StuB3AgMBAAGjggFIMIIBRDAdBgNVHQ4EFgQUj1n8
KukhbY4ne3RopcdDXlIEUYcwHwYDVR0jBBgwFoAUmlO8eZlbyZYH3gb65MUxeL8h
aUkwZwYDVR0fBGAwXjBcoFqgWIYpaHR0cDovL2ludGVncmFjaW9uL0NlcnRFbnJv
bGwvQUNIUk9PVC5jcmyGK2ZpbGU6Ly9cXGludGVncmFjaW9uXENlcnRFbnJvbGxc
QUNIUk9PVC5jcmwwgZgGCCsGAQUFBwEBBIGLMIGIMEEGCCsGAQUFBzAChjVodHRw
Oi8vaW50ZWdyYWNpb24vQ2VydEVucm9sbC9pbnRlZ3JhY2lvbl9BQ0hST09ULmNy
dDBDBggrBgEFBQcwAoY3ZmlsZTovL1xcaW50ZWdyYWNpb25cQ2VydEVucm9sbFxp
bnRlZ3JhY2lvbl9BQ0hST09ULmNydDANBgkqhkiG9w0BAQUFAAOCAQEAMcWK6/n/
MCaWb4LvoJ2ARMPIueOY+ChhQ8i3A/qR8R8EuMsztn5btX7OJgm67TsOtA9CEnD2
I2eAxY+UYaY86TiQ1+RIvzaOxJICOtXhx6p54GgzXrfoDcKr8dJhkO6a2EYsDi4V
gvbnehnqDLvC0n2LSULo2l3BsxXnuS9fcnwjTzeTG8p253mVHsY8JrlyMdfREPEk
CPzR5F2aHJLRDKqFGgiKx3DLBJwG+TtJ/21mpErBwsTtDetfOUN5QTZpe/aLhk2h
H9pOC8IUYtLf20wf79EOrm4iNZuOBI442W49qGCxPOH1lsMHVg+kixSQn6bvckWJ
PScGyLcum0Zf6g==
-----END CERTIFICATE-----

Los certificados que me pasaste vos, estan todos en formato binario. Para convertir alguno de los certificados que tenes a este formato podes utilizar esta pagina: https://www.sslshopper.com/ssl-converter.html

Y seleccionas:

Type of Current Certificate: DER/Binary
Type To Convert To: Standard PEM

El archivo con el key tambien tiene que tener un contenido similar, el cual ya lo tenes, el Quasar.key esta bien. Cuando tengas los 2 archivos, abri el nuevo certificado con un editor de texto, y copia el contenido del archivo con el key, y pegalo debajo del texto con los datos del certificado, cuestion que deberia quedarte un archivo similar a este:

-----BEGIN CERTIFICATE-----
MIIDxjCCAq6gAwIBAgIKUokFgwAAAAAFTjANBgkqhkiG9w0BAQUFADASMRAwDgYD
VQQDEwdBQ0hST09UMB4XDTEwMDcyNzEzNDcyM1oXDTEwMDkxMDE5NDgwNFowajEL
MAkGA1UEBhMCQ08xFTATBgNVBAgTDEN1bmRpbmFtYXJjYTEPMA0GA1UEBxMGQm9n
b3RhMQ8wDQYDVQQKEwZRdWFzYXIxETAPBgNVBAsTCFNpc3RlbWFzMQ8wDQYDVQQD
EwZRdWFzYXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL+Mt/ZZSKYpX64C
4hW5V+L2iVUG4QwZw6N5eGk/sGpyi9D9IQysKxKTNqcNvy8/LHWAW/cOja1FpRAw
FV99MwbPexZ6KA0oJ/ygw1FazUmDFrru/dXdtt15nbKK9Tqz8IKfHqaZ9P3JObyG
fSYEbO4e0C0vVXOaszuCQH0StuB3AgMBAAGjggFIMIIBRDAdBgNVHQ4EFgQUj1n8
KukhbY4ne3RopcdDXlIEUYcwHwYDVR0jBBgwFoAUmlO8eZlbyZYH3gb65MUxeL8h
aUkwZwYDVR0fBGAwXjBcoFqgWIYpaHR0cDovL2ludGVncmFjaW9uL0NlcnRFbnJv
bGwvQUNIUk9PVC5jcmyGK2ZpbGU6Ly9cXGludGVncmFjaW9uXENlcnRFbnJvbGxc
QUNIUk9PVC5jcmwwgZgGCCsGAQUFBwEBBIGLMIGIMEEGCCsGAQUFBzAChjVodHRw
Oi8vaW50ZWdyYWNpb24vQ2VydEVucm9sbC9pbnRlZ3JhY2lvbl9BQ0hST09ULmNy
dDBDBggrBgEFBQcwAoY3ZmlsZTovL1xcaW50ZWdyYWNpb25cQ2VydEVucm9sbFxp
bnRlZ3JhY2lvbl9BQ0hST09ULmNydDANBgkqhkiG9w0BAQUFAAOCAQEAMcWK6/n/
MCaWb4LvoJ2ARMPIueOY+ChhQ8i3A/qR8R8EuMsztn5btX7OJgm67TsOtA9CEnD2
I2eAxY+UYaY86TiQ1+RIvzaOxJICOtXhx6p54GgzXrfoDcKr8dJhkO6a2EYsDi4V
gvbnehnqDLvC0n2LSULo2l3BsxXnuS9fcnwjTzeTG8p253mVHsY8JrlyMdfREPEk
CPzR5F2aHJLRDKqFGgiKx3DLBJwG+TtJ/21mpErBwsTtDetfOUN5QTZpe/aLhk2h
H9pOC8IUYtLf20wf79EOrm4iNZuOBI442W49qGCxPOH1lsMHVg+kixSQn6bvckWJ
PScGyLcum0Zf6g==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,ABC9E28B17224690

yEgNHOj8JVei3OpXhOWVFtYeLi/25NKYKq3EbSVnieLOIrFPdzmb8zhTD1vL+NzX
zEVP4iF8LlCSRdDLyLA1YAGCf1FOuk3ragjGYB0wo85x+4xiFfOEne7RUE0CXutF
y/D5Xi2BolYI9oueZ/YuCJJXsnkqNEN3POpzo9DKJEKacFF4mPfxqwbNwzHx2Svj
P9i8jiIU7pLal+BdaZQ9cQIqX6TW0qLBqkBiYST2gf4cP7dpF+5oQTuSfmSfCGmb
BlbJBP4/UUxQpLRea/hD8P4WEnbJ8ULSaUo3p2Q3PB78zSsIYC06ozJ0YioYcRP1
NXxFuWl5i1p04uMjcnzBYJfM931dS00Eex02EKeR5urZelHb3Bt7kitDXLkzy6rT
REdptZZ9LU9VCpDk3QH7ssGruSqmz790WEwpUpz9AD8xDhc5fn7/+C7OpeKXoLD+
llEDpdwtQVRINL83CjJnmK+bQ0gwG7dXZvwRpMhGCBmRwG3JfgRj049zX/ZDysTT
NfA/VFp9vqnjCqgUDsl0ND7Dxyo3PFiMzIyFoM+l/l5y+gJ7b4iD58ftynM0xaL+
Y0HOb3o2ioPalBJSOgc61hjLr9pys/ktSP9lBpfVb+USOy59y0qkdg+iZxpYWrFR
ARe+jp/Ki+GRv/9PQ6WkoazKkvFVhtuZRywj9wa7cd8tbcN8nkrEx7GQQaMPrtkL
ZuSmhWPpX5YnrBB0pmLLRZZ/4i1bi/oVowhYPA97URQ8uBDtX9GaeEbymhPFCfgl
aRP4JrxHhVdLICIrZ+qvKyjRiKhnkkk6KPnv51oTcu7PWoHmC/RlPg==
-----END RSA PRIVATE KEY-----

Ese archivo guardalo con el nombre que quieras, y es el que vas a utilizar para conectarte al webservice especificandolo en el parametro "local_cert"

Con eso ya deberia funcionar, o al menos eso espero :)

Y si, yo no lo puedo testear porque funciona solo con la ip de servidor para el cual fue creado; lo mismo para vos, solamente podes probarlo en el servidor de produccion para el cual crearon el certificado.

Lo que no se, es cual es el certificado que deberias utilizar, ya que me pasaste varios, pero supongo que vos sabras.

Saludos y espero que esto ultimo sea la solucion ;) Cualquier cosa me avisas. Acordate de copiarme los mensajes de error, si es que llegas a tener alguno( esperemos que no :D)

0 0

Gracias por la ayuda... Acabo de hacerl oque me comento y sigue saliendo error.

Mi codigo es este:

<?php
$wsdl = "https://desarrollo.pse.com.co/PSEWebServices/MainServices.asmx?wsdl";
$client = new SoapClient($wsdl, array('trace' => true,'exceptions' => true,'soap_version' => SOAP_1_1,/*'local_cert' => "ReaEntrada.pem",*/'local_cert' => "IntDiferente.pem",'passphrase' => "empresa2010"));
/*********************************************/
// $HeaCreado = $client->wssecurity_header();
/*********************************************/
/**
* Segun parece, los parametros hay que pasarlos en el tipo de dato que corresponde
* segun la definicion del webservice, estas son las clases necesarias para pasar el dato
*/
class getbankListInformationType {
    public $entityCode;
}

class getBankList {
    public $getBankListInformation;
}

/**
* Luego se deben crear los objetos y asignar los valores de las propiedades/
*/
$var1 = new getbankListInformationType();
$var1->entityCode = '8600672037';

$param  = new getBankList();
$param->getBankListInformation = $var1;

// ******************************************************************************* //

$error = 0;
try {
    //$LisBancos = $client->getBankList($param,$HeaCreado);
    $LisBancos = $client->getBankList($param);
} catch (SoapFault $fault) { 
    print($client->__getLastRequest());
    $error = 1;
    echo "<pre><b>ERROR:</b><br>".$fault->faultcode."-".$fault->faultstring.".</pre>"; 
}

if(is_array($LisBancos))
{ //si hay valores en el array
    for($i=0;$i<count($LisBancos);$i++)
    {
        echo $LisBancos[$i]['financialInstitutionCode'].'<br>';
    }
}else{
    echo 'No hay bancos';
}

?>

El archivo lo guarde en formato .pem

-----BEGIN CERTIFICATE-----
MIIDxjCCAq6gAwIBAgIKUokFgwAAAAAFTjANBgkqhkiG9w0BAQUFADASMRAwDgYD
VQQDEwdBQ0hST09UMB4XDTEwMDcyNzEzNDcyM1oXDTEwMDkxMDE5NDgwNFowajEL
MAkGA1UEBhMCQ08xFTATBgNVBAgTDEN1bmRpbmFtYXJjYTEPMA0GA1UEBxMGQm9n
b3RhMQ8wDQYDVQQKEwZRdWFzYXIxETAPBgNVBAsTCFNpc3RlbWFzMQ8wDQYDVQQD
EwZRdWFzYXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL+Mt/ZZSKYpX64C
4hW5V+L2iVUG4QwZw6N5eGk/sGpyi9D9IQysKxKTNqcNvy8/LHWAW/cOja1FpRAw
FV99MwbPexZ6KA0oJ/ygw1FazUmDFrru/dXdtt15nbKK9Tqz8IKfHqaZ9P3JObyG
fSYEbO4e0C0vVXOaszuCQH0StuB3AgMBAAGjggFIMIIBRDAdBgNVHQ4EFgQUj1n8
KukhbY4ne3RopcdDXlIEUYcwHwYDVR0jBBgwFoAUmlO8eZlbyZYH3gb65MUxeL8h
aUkwZwYDVR0fBGAwXjBcoFqgWIYpaHR0cDovL2ludGVncmFjaW9uL0NlcnRFbnJv
bGwvQUNIUk9PVC5jcmyGK2ZpbGU6Ly9cXGludGVncmFjaW9uXENlcnRFbnJvbGxc
QUNIUk9PVC5jcmwwgZgGCCsGAQUFBwEBBIGLMIGIMEEGCCsGAQUFBzAChjVodHRw
Oi8vaW50ZWdyYWNpb24vQ2VydEVucm9sbC9pbnRlZ3JhY2lvbl9BQ0hST09ULmNy
dDBDBggrBgEFBQcwAoY3ZmlsZTovL1xcaW50ZWdyYWNpb25cQ2VydEVucm9sbFxp
bnRlZ3JhY2lvbl9BQ0hST09ULmNydDANBgkqhkiG9w0BAQUFAAOCAQEAMcWK6/n/
MCaWb4LvoJ2ARMPIueOY+ChhQ8i3A/qR8R8EuMsztn5btX7OJgm67TsOtA9CEnD2
I2eAxY+UYaY86TiQ1+RIvzaOxJICOtXhx6p54GgzXrfoDcKr8dJhkO6a2EYsDi4V
gvbnehnqDLvC0n2LSULo2l3BsxXnuS9fcnwjTzeTG8p253mVHsY8JrlyMdfREPEk
CPzR5F2aHJLRDKqFGgiKx3DLBJwG+TtJ/21mpErBwsTtDetfOUN5QTZpe/aLhk2h
H9pOC8IUYtLf20wf79EOrm4iNZuOBI442W49qGCxPOH1lsMHVg+kixSQn6bvckWJ
PScGyLcum0Zf6g==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,ABC9E28B17224690

yEgNHOj8JVei3OpXhOWVFtYeLi/25NKYKq3EbSVnieLOIrFPdzmb8zhTD1vL+NzX
zEVP4iF8LlCSRdDLyLA1YAGCf1FOuk3ragjGYB0wo85x+4xiFfOEne7RUE0CXutF
y/D5Xi2BolYI9oueZ/YuCJJXsnkqNEN3POpzo9DKJEKacFF4mPfxqwbNwzHx2Svj
P9i8jiIU7pLal+BdaZQ9cQIqX6TW0qLBqkBiYST2gf4cP7dpF+5oQTuSfmSfCGmb
BlbJBP4/UUxQpLRea/hD8P4WEnbJ8ULSaUo3p2Q3PB78zSsIYC06ozJ0YioYcRP1
NXxFuWl5i1p04uMjcnzBYJfM931dS00Eex02EKeR5urZelHb3Bt7kitDXLkzy6rT
REdptZZ9LU9VCpDk3QH7ssGruSqmz790WEwpUpz9AD8xDhc5fn7/+C7OpeKXoLD+
llEDpdwtQVRINL83CjJnmK+bQ0gwG7dXZvwRpMhGCBmRwG3JfgRj049zX/ZDysTT
NfA/VFp9vqnjCqgUDsl0ND7Dxyo3PFiMzIyFoM+l/l5y+gJ7b4iD58ftynM0xaL+
Y0HOb3o2ioPalBJSOgc61hjLr9pys/ktSP9lBpfVb+USOy59y0qkdg+iZxpYWrFR
ARe+jp/Ki+GRv/9PQ6WkoazKkvFVhtuZRywj9wa7cd8tbcN8nkrEx7GQQaMPrtkL
ZuSmhWPpX5YnrBB0pmLLRZZ/4i1bi/oVowhYPA97URQ8uBDtX9GaeEbymhPFCfgl
aRP4JrxHhVdLICIrZ+qvKyjRiKhnkkk6KPnv51oTcu7PWoHmC/RlPg==
-----END RSA PRIVATE KEY-----

El error que me genera es este

ERROR:
q0:Bad.Security-System.Web.Services.Protocols.SoapException: The security information supplied was not valid.
   at PSEWebServices.WebServiceController.Execute(HttpContext http_context, Hashtable parameters)
   at PSEWebServices.WebServiceController.Execute(HttpContext context, SoapContext requestContext, String action, Hashtable action_parameters, Boolean isAHostedMethod)
   at PSEWebServices.MainServicesImpl.getBankList(getbankListInformationType getBankListInformation).

¿Se le ocurre alguna otra solucion? Graaacias

por desde Colombia

Registrado desde: 02 Aug 10
2 0

Pues la verdad es que no, obviamente hay algun problema con el certificado, y el mensaje de error no ayuda en nada.

Intenta ponerte en contacto con la empresa, PSE, para verificar que los datos del cetificado sean correctos.

Si no tendrias que ver de pasar los datos creando Headers [url]http://www.php.net/manual/en/soapheader.soapheader.php, para pasar cada dato como te pasaron ellos que deberian quedar los datos que les llegan..., el problema es que hay varios de esos datos que te pasaron de ejemplo que no se exactamente que son, ni de donde salen.

En teoria el SoapClient, al pasarle el certificado como parametro, deberia crear todos esos Headers automaticamente, pero por el mensaje de error que te esta devolviendo, no esta procesando correctamente los datos del certificado o no se estan validando. Y en este punto yo no puedo hacer pruebas para descubrir el error, ya que nunca me va a validar el certificado.

Intenta hablar con PSE, y que te brinden toda la informacion y ayuda posible.

Saludos

0 0

Hola @helacer,

Sé que ya ha pasado mucho tiempo desde que escribiste tu pregunta. No me vas a creer,, pero en 2017 tengo el mismo problema que tú. Estoy haciendo la integración con PSE y me sale el error "The security information supplied was not valid." Ya he intentado de resolverlo de varias formas, y sin resultado. Ya me siento desesperada y sufro mucho, mientras que la gente de ACH me responde que no puede decirme nada.

Si todavía recuerdes cómo resolviste al final tu problema o me podrías dar alguna pista, estaría muy agradecida.

Creo en ti, porque eres mi esperanza.

Gracias de antemano!

por

Registrado desde: 6 días