Tässä on esimerkki Matkahuollon XML-rajapinnan käyttämisestä. Koodi on kirjoitettu Matkahuollon oman esimerkkikoodin pohjalta mutta huomattavasti lyhyemmin, selvemmin ja paremmin.
pdf.php:
<?php require_once "Matkahuolto.php"; $mh = new Matkahuolto(); $mh->MessageType = "N"; $mh->Weight = "3.25"; $mh->Packages = "2"; $mh->SenderId = "09430023"; $mh->ReceiverName1 = "Metabolix"; $mh->ReceiverPostal = "00280"; $mh->ReceiverCity = "HELSINKI"; $mh->ProductCode = "30"; try { $mh->sendRequest("09430023", "456", "https://mhhkiweb1.matkahuolto.fi/scripts101c/mhshipmentxmltesti.wsc/ovtinxml"); $mh->outputPDF(); } catch (MatkahuoltoException $e) { header("Content-Type: text/plain"); echo $e->getMessage(); }
Matkahuolto.php:
<?php class MatkahuoltoException extends Exception { } class Matkahuolto { // Pyynnössä tarvittavat kentät private static $shipment_vars = array('MessageType', 'ShipmentNumber', 'ShipmentDate', 'Weight', 'Volume', 'Packages', 'SenderId', 'SenderName1', 'SenderName2', 'SenderAddress', 'SenderPostal', 'SenderCity', 'SenderContactName', 'SenderContactNumber', 'SenderEmail', 'SenderReference', 'DeparturePlaceCode', 'DeparturePlaceName', 'ReceiverId', 'ReceiverName1', 'ReceiverName2', 'ReceiverAddress', 'ReceiverPostal', 'ReceiverCity', 'ReceiverContactName', 'ReceiverContactNumber', 'ReceiverEmail', 'ReceiverReference', 'DestinationPlaceCode', 'DestinationPlaceName', 'PayerCode', 'Remarks', 'ProductCode', 'ProductName', 'Pickup', 'PickupPayer', 'PickupRemarks', 'Delivery', 'DeliveryPayer', 'DeliveryRemarks', 'CODSum', 'CODCurrency', 'CODAccount', 'CODReference', 'Goods', 'VAKCode', 'VAKDescription', 'DocumentType'); // Vastauksen kentät private static $response_vars = array('ShipmentNumber', 'SenderReference', 'ShipmentPdf', 'ErrorNbr', 'ErrorMsg'); // Puuttuvien muuttujien hakeminen public function __get($x) { if (in_array($x, self::$shipment_vars) || in_array($x, self::$response_vars)) { return null; } throw new MatkahuoltoException("Unknown variable: $x"); } // Puuttuvien muuttujien asettaminen public function __set($x, $value) { if (in_array($x, self::$shipment_vars) || in_array($x, self::$response_vars)) { return $this->$x = $value; } throw new MatkahuoltoException("Unknown variable: $x"); } // Pyynnön lähetys public function sendRequest($user, $password, $url) { if (!class_exists("XMLWriter")) { throw new MatkahuoltoException("XMLWriter missing"); } if (!class_exists("XMLReader")) { throw new MatkahuoltoException("XMLReader missing"); } // Luodaan pyyntö. $xml = new XMLWriter(); $xml->openMemory(); $xml->startDocument('1.0'); $xml->startElement('MHShipmentRequest'); $xml->writeElement("Version", "1.0"); $xml->writeElement("pUserId", $user); $xml->writeElement("Password", $password); $xml->startElement('Shipment'); foreach (self::$shipment_vars as $x) if ($this->$x !== null) { $xml->writeElement($x, $this->$x); } $xml->endElement(); $xml->endElement(); $xml->endDocument(); $xml = $xml->flush(); if (function_exists("curl_init")) { // Lähetetään pyyntö. $ch = curl_init(); if (!($ch = curl_init())) { throw new MatkahuoltoException("cURL: curl_init failed"); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 1000); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); $data = curl_exec($ch); if (curl_errno($ch)) { throw new MatkahuoltoException("cURL: ". curl_errno($ch). ": ". curl_error($ch)); } curl_close($ch); } else { // Lähetetään pyyntö. $ctx = stream_context_create(array("http" => array( "method" => "POST", "content" => $xml, "header" => "Content-Type: text/xml", "timeout" => 10, ))); $data = @file_get_contents($url, null, $ctx); if ($data === false) { $tmp = error_get_last(); throw new MatkahuoltoException($tmp["message"]); } } // Tulkitaan vastaus. $xml = new XMLReader(); $xml->XML($data); foreach (array_diff(self::$response_vars, self::$shipment_vars) as $x) { $this->$x = null; } while ($xml->read()) { if ($xml->nodeType == 1) { if (in_array($name = $xml->name, self::$response_vars)) { $xml->read(); $this->$name = $xml->value; } } } if ($this->ErrorNbr) { throw new MatkahuoltoException("{$this->ErrorNbr}: {$this->ErrorMsg}"); } // Puretaan PDF. $this->ShipmentPdf = base64_decode($this->ShipmentPdf); } // PDF:n näyttäminen public function outputPDF() { if (headers_sent()) { throw new MatkahuoltoException("Headers already sent"); } header("Content-Type: application/pdf"); header("Content-Length: ".strlen($this->ShipmentPdf)); header("Content-Disposition: attachment; filename=\"{$this->ShipmentNumber}.pdf\""); echo $this->ShipmentPdf; } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.