/**
  * Ejecuta el método SOAP requestTimbrarCFDI() del Servicio Web de
  * Facturacion Moderna, públicado en FacturacionModerna::url
  * http://developers.facturacionmoderna.com/#requestTimbrarCFDI
  *
  * Recibe como parámetro principal $str que contiene la ruta o contenido del
  * archivo a certificar, el archivo debe ser algunos de los soportados por
  * la API. http://developers.facturacionmoderna.com/#layout
  *
  * En caso de una petición exitosa, el método establece los [Valores] a las
  * propiedades de la clase FacturacionModerna
  *
  * En caso de error establece las propiedades ultimoError y
  * ultimoCodigoError, con el mensaje y código de error correspondientes.
  * El listado de mensajes de error se encuentra en: http://developers.facturacionmoderna.com/#errores
  *
  *
  * [Valores]
  *
  * FacturacionModerna::UUID, contiene el UUID del último comprobante certificado.
  *
  * FacturacionModerna::xml, contiene el comprobante certificado en formato XML.
  *
  * FacturacionModerna::txt, contiene en formato de texto simple el contenido del nodo TimbreFiscalDigital del CFDI.
  * El valor se establece siempre y cuando $opciones['generarTXT'] = true
  *
  * FacturacionModerna::pdf, contiene la representación impresa del CFDI en formato PDF.
  * se debe utilizar cuándo se requiera que FacturacionModerna generé un formato PDF genérico para un CFDI,
  * para ser generado $opciones['generarPDF'] = true
  *
  * FacturacionModerna::png, contiene el Código de Barras Bidimensional o CBB
  * (QR-Code) el cuál debe estar presente en la representación impresa del
  * CFDI.
  *
  * Nota: EL CBB se genera siempre y cuando $opciones['generarCBB'] sea igual a
  * true, utilizar está opción dehabilita 'generarPDF'
  * 
  *
  * @param string $str Contenido o Rutá del del comprobante a certificar.
  * @return void
  */
 public function timbrar($str, $opciones = array('generarCBB' => false, 'generarTXT' => false, 'generarPDF' => false))
 {
     try {
         //Si $str es la ruta a un archivo leerlo.
         if (file_exists($str)) {
             $str = file_get_contents($str);
         }
         //Códificar el comprobante a certificar en Base64
         $opciones['text2CFDI'] = base64_encode($str);
         $opciones = array_merge($opciones, $this->opciones);
         $cliente = new SoapClient($this->url, array('trace' => 1));
         $respuesta = $cliente->requestTimbrarCFDI((object) $opciones);
         //Establecer las propiedades con el objeto de respuesta SOAP.
         foreach (array('xml', 'pdf', 'png', 'txt') as $propiedad) {
             if (isset($respuesta->{$propiedad})) {
                 $this->{$propiedad} = base64_decode($respuesta->{$propiedad});
             }
         }
         if (isset($respuesta->xml)) {
             $xml_cfdi = simplexml_load_string($this->xml);
             $xml_cfdi->registerXPathNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");
             $tfd = $xml_cfdi->xpath('//tfd:TimbreFiscalDigital');
             $this->UUID = (string) $tfd[0]['UUID'];
         }
         if ($this->debug == 1) {
             $this->log("SOAP request:\t" . $cliente->__getLastRequest());
             $this->log("SOAP response:\t" . $cliente->__getLastResponse());
         }
         return true;
     } catch (SoapFault $e) {
         if ($this->debug == 1) {
             $this->log("SOAP request:\t" . $cliente->__getLastRequest());
             $this->log("SOAP response:\t" . $cliente->__getLastResponse());
         }
         $this->ultimoError = $e->faultstring;
         $this->ultimoCodigoError = $e->faultcode;
     } catch (Exception $e) {
         $this->ultimoError = $e->getMessage();
         $this->ultimoCodigoError = "Unknown";
     }
     return false;
 }