/** * processes SOAP message returned from server * * @param array $headers The HTTP headers * @param string $data unprocessed response data from server * @return mixed value of the message, decoded into a PHP type * @access private */ function parseResponse($headers, $data) { $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); $this->appendDebug($this->varDump($headers)); if (!strstr($headers['content-type'], 'text/xml')) { $this->setError('Response not of type text/xml: ' . $headers['content-type']); return false; } if (strpos($headers['content-type'], '=')) { $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); $this->debug('Got response encoding: ' . $enc); if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) { $this->xml_encoding = strtoupper($enc); } else { $this->xml_encoding = 'US-ASCII'; } } else { // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 $this->xml_encoding = 'ISO-8859-1'; } $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); $parser = new nusoap_parser($data, $this->xml_encoding, $this->operation, $this->decode_utf8); // add parser debug data to our debug $this->appendDebug($parser->getDebug()); // if parse errors if ($errstr = $parser->getError()) { $this->setError($errstr); // destroy the parser object unset($parser); return false; } else { // get SOAP headers $this->responseHeaders = $parser->getHeaders(); // get SOAP headers $this->responseHeader = $parser->get_soapheader(); // get decoded message $return = $parser->get_soapbody(); // add document for doclit support $this->document = $parser->document; // destroy the parser object unset($parser); // return decode message return $return; } }
/** * processes SOAP message received from client * * @param array $headers The HTTP headers * @param string $data unprocessed request data from client * @return mixed value of the message, decoded into a PHP type * @access private */ function parseRequest($headers, $data) { $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' headers:'); $this->appendDebug($this->publicDump($headers)); if (!isset($headers['content-type'])) { $this->setError('Request not of type text/xml (no content-type header)'); return false; } if (!strstr($headers['content-type'], 'text/xml')) { $this->setError('Request not of type text/xml'); return false; } if (strpos($headers['content-type'], '=')) { $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); $this->debug('Got response encoding: ' . $enc); if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) { $this->xml_encoding = strtoupper($enc); } else { $this->xml_encoding = 'US-ASCII'; } } else { // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 $this->xml_encoding = 'ISO-8859-1'; } $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); // parse response, get soap parser obj $parser = new nusoap_parser($data, $this->xml_encoding, '', $this->decode_utf8); // parser debug $this->debug("parser debug: \n" . $parser->getDebug()); // if fault occurred during message parsing if ($err = $parser->getError()) { $this->result = 'fault: error in msg parsing: ' . $err; $this->fault('SOAP-ENV:Client', "error in msg parsing:\n" . $err); // else successfully parsed request into soapval object } else { // get/set methodname $this->methodURI = $parser->root_struct_namespace; $this->methodname = $parser->root_struct_name; $this->debug('methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); $this->debug('calling parser->get_soapbody()'); $this->methodparams = $parser->get_soapbody(); // get SOAP headers $this->requestHeaders = $parser->getHeaders(); // get SOAP Header $this->requestHeader = $parser->get_soapheader(); // add document for doclit support $this->document = $parser->document; } }
// return false; return array('username' => $parameters->getParameter('username'), 'name' => 'Prueba', 'type' => 'test', 'email' => '*****@*****.**'); })); ////////////////////////////////////////////////////////////////////////////////////////////////////////// $xml = file_get_contents('php://input'); if (!preg_match('/\\<SOAP\\-ENV\\:Body\\>\\<\\w+\\:([^\\> ]+)[^\\>]*\\>/', $xml, $aux)) { //file_put_contents('error', 'Es un error'); die; } //require_once(realpath(dirname(__FILE__) . '/../lib/nusoap/nusoap.php')); require_once realpath(dirname(__FILE__) . '/../../extras/nusoap/nusoap.php'); //$h = HTTPRequest::getParameter('soap'); $h = 'users'; $c = $aux[1]; preg_match('/xml [^ ]+ encoding="([^"]+)"/', $xml, $aux2); $parser = new nusoap_parser($xml, $aux2[1], '', 1); if (!$control->isExecutable("{$h}_c.{$c}")) { header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found"); die; } function var_error_log($object = null) { ob_start(); // start buffer capture var_dump($object); // dump the values $contents = ob_get_contents(); // put the buffer into a variable ob_end_clean(); // end capture return $contents;
function parseResponse($headers, $data) { $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); $this->appendDebug($this->varDump($headers)); if (!isset($headers['content-type'])) { $this->setError('Response not of type text/xml (no content-type header)'); return false; } if (!strstr($headers['content-type'], 'text/xml')) { $this->setError('Response not of type text/xml: ' . $headers['content-type']); return false; } if (strpos($headers['content-type'], '=')) { $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); $this->debug('Got response encoding: ' . $enc); if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) { $this->xml_encoding = strtoupper($enc); } else { $this->xml_encoding = 'US-ASCII'; } } else { $this->xml_encoding = 'ISO-8859-1'; } $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); $parser = new nusoap_parser($data, $this->xml_encoding, $this->operation, $this->decode_utf8); $this->appendDebug($parser->getDebug()); if ($errstr = $parser->getError()) { $this->setError($errstr); unset($parser); return false; } else { $this->responseHeaders = $parser->getHeaders(); $this->responseHeader = $parser->get_soapheader(); $return = $parser->get_soapbody(); $this->document = $parser->document; unset($parser); return $return; } }
/** * This method parses, validates and routes the incoming request to the correct methods. * * @param string $soapaction optional, if not provided it will be taken from $_SERVER['HTTP_SOAPACTION'] * @param string $body optional, if not provided it will be taken directly from php://input */ public function handleRequest($soapaction = null, $body = null) { $this->log->LogSystemDebug('ebay', 'Incoming eBay notification'); if ($soapaction === null) { if (isset($_SERVER['HTTP_SOAPACTION'])) { // for some reason, the soapaction header value is double-quoted, so... $soapaction = stripcslashes(trim($_SERVER['HTTP_SOAPACTION'], '"')); if (!preg_match('#^http://developer\\.ebay\\.com/notification/([^/]+)$#', $soapaction, $matches)) { $this->log->LogSystemDebug('ebay', 'Invalid SOAPACTION header', $soapaction); return; } $soapaction = $matches[1]; unset($matches); } } if (!$soapaction) { $this->log->LogSystemDebug('ebay', 'No SOAPACTION header defined'); return; } if ($body === null) { $body = file_get_contents('php://input'); } // parse incoming xml require_once(ISC_BASE_PATH . '/lib/nusoap/nusoap.php'); $parser = new nusoap_parser($body); if ($parser->getError()) { $this->log->LogSystemDebug('ebay', 'eBay notification could not be parsed to xml: ' . $parser->getError(), $body); return; } unset($body); // validate signature as genuine ebay notification, see http://developer.ebay.com/DevZone/XML/docs/WebHelp/WorkingWithNotifications-Receiving_Platform_Notifications.html $header = $parser->get_soapheader(); $body = $parser->get_soapbody(); $providedSignature = $header['RequesterCredentials']['NotificationSignature']; $timestamp = $body['Timestamp']; $expectedSignature = base64_encode(md5($timestamp . GetConfig("EbayDevId") . GetConfig("EbayAppId") . GetConfig("EbayCertId"), true)); if (strcmp($expectedSignature, $providedSignature) !== 0) { $this->log->LogSystemDebug('ebay', 'eBay notification failed signature validation, provided signature was: ' . $providedSignature); return; } unset($expectedSignature, $providedSignature, $timestamp, $body, $header); // route to protected methods or ignore if a method for this notification is not implemented $method = '_handle' . $soapaction; if (!is_callable(array($this, $method))) { $this->log->LogSystemDebug('ebay', 'No processor defined for eBay notification event: ' . $soapaction); return false; } $body = $parser->get_soapbody(); unset($parser); $this->log->LogSystemDebug('ebay', 'Accepted eBay notification event: ' . $soapaction, '<pre>' . isc_html_escape(var_export($body, true)) . '</pre>'); return $this->$method($body); }