webservice soapclient desde consumir consume php wcf soap wsdl soap-client

soapclient - soap php



IntegraciĆ³n con la pasarela de pago SecureNet (2)

Puede extraer el WSDL del servidor de producción y anular la ubicación mediante programación utilizando SoapClient :: __ setLocation

Estoy tratando de integrar nuestro software con SecureNet gateway. Tienen una API basada en SOAP.

El problema que estoy teniendo es que su archivo WSDL realmente no funciona con PHP. Específicamente, su archivo WSDL se divide en varios archivos con una instrucción wsdl:import y la ubicación de importación es http . En su servidor de prueba, los puertos http y https están abiertos, por lo que PHP puede leer el archivo WSDL. En su servidor de producción, solo https está abierto, pero su bloque de ubicación aún hace referencia a http , ¡así PHP agota el tiempo de espera! Si fuera https , funcionaría bien.

Su recomendación era extraer el archivo WSDL de su servidor de prueba, pero anular la ubicación. Me dicen que su servidor de prueba siempre debe estar activo, pero no me siento cómodo confiando en dos sistemas para que funcionen nuestras transacciones.

La otra alternativa es usar su XML post API ... Pero el problema es que debe especificar cada campo (necesario o no) en el orden correcto. La peor parte es que el mensaje de error para esta API es simplemente Unknown Error. , así que es casi imposible descubrir lo que me estoy perdiendo.

Necesito una tercera opción. Soap funciona bien, si puedo cargar el archivo WSDL (puede en prueba, no en producción). Creo que están usando WCF, que es algo de .NET, creo. Se supone que hay una opción "? SimpleWSDL" verses "? Wsdl", pero en su versión de WCF no la tiene.

Aquí está su archivo WSDL (servidor de prueba): https://certify.securenet.com/API/Gateway.svc?wsdl

EDITAR:

Aquí está el código reproducible:

$client = new SoapClient("https://gateway.securenet.com/API/Gateway.svc?wsdl"); // Hangs and throws exception in construct


Suena más como un error en el archivo WSDL remoto, similar a la visita de sitios web a través de SSL que tienen activos no SSL incluidos, lo que provoca una advertencia.

Afortunadamente, parece que podemos evitarlo. La página del manual de SoapClient tiene una solución similar para los números de puerto, publicados por el usuario jjlopez.

La solución consiste en extender la clase base SoapClient para volver a escribir las URL a las que hará las solicitudes, de esta forma:

class SecureSoapClient extends /SoapClient { protected $_scheme; public function __construct($wsdl, $options) { $this->_scheme = parse_url($wsdl, PHP_URL_SCHEME); return parent::__construct($wsdl, $options); } public function __doRequest($request, $location, $action, $version, $one_way = 0) { $currentScheme = parse_url($location, PHP_URL_SCHEME); $location = preg_replace(''^'' . $currentScheme, $this->_scheme, $location); return parent::__doRequest($request, $location, $action, $version, $one_way); } }