Ayuda

SOAP: los .svc del servicio anterior

Si tu integración habla SOAP con el servicio anterior, migras cambiando el host. Las rutas, las operaciones, los nombres y el orden de los campos y los WSDL son los mismos.

Cada .svc del servicio anterior responde aquí en la misma ruta, con SOAP 1.1 (basicHttpBinding), el namespace http://tempuri.org/ y los tipos de ServiciosMexico.Responses. El WSDL que se sirve es el del servicio anterior con la dirección de este host, así que un proxy que ya generaste sigue sirviendo sin regenerarlo.

WSDL
curl "https://pruebas.timbrado.idea15.com/TimbradoObjeto/CFDI/Service.svc?wsdl"

Las rutas

RutaEquivale a
/TimbradoObjeto/CFDI/Service.svcTimbrado, SeguimientoCFDIEl comprobanteModel del WSDL se convierte al mismo comprobante que TimbrarCfdiObj; la Addenda viaja tal cual.
/SelladoTimbradoXML/CFDI/Service.svcSelladoTimbradoCFDI, TimbradoCFDI, SeguimientoCFDI, CancelarCFDI, ConsultarEstatusCFDI, ConsultarRelacionadosCFDIselladoTimbCFDI, TimbradoCFDI y los de cancelar y consultar.
/SelladoTimbradoXML/Retenciones/Service.svcSelladoTimbradoRetencion, TimbradoRetencion, CancelarRetencion, CargarPFXRetencionselladoTimbRetencion, TimbradoCFDI (acepta Retenciones), cancelarRetencion y cargarPfx.
/Cancelacion/Service.svcCancelarCFDI, ConsultarEstatusCFDI, ObtenerAcuseCancelacion, CancelarRetencion, CargarPFXRetencionLos mismos de cancelar; acuseCancelacion devuelve el acuse de una cancelación pedida aquí.
/CargarCertificado/Service.svcCargarCertificado, ObtenerDatosCertificadoCargarCertificado y datosCertificado.
/ConsultaPDF/Service.svcObtenerPDF_CFDI, ObtenerPDF_Retenciones, ObtenerQR_CFDIconsultaPDF-CFDI, consultaPDF-Retenciones y consultaQR-CFDI.
/SelladoTimbradoXML/CFDI/Lamuno/Service.svcTimbrarCFDI, ConsultaPDF, CancelarCFDI, ConsultarEstatusCFDIIgual que antes: primero las reglas de TipoCambio (CFDI40113 a CFDI40117, CFDITC001), el XML ya sellado o sin sellar, siempre el PDF y el correo a los correos de la información adicional.
/TimbradoTXT/CFDI/Service.svcTimbrado, SeguimientoCFDI, CancelarCFDI, CancelarCFDICasinos, ConsultarEstatusCFDIEl mismo layout TXT, con sus validaciones por renglón y sus addendas; también por REST como timbradoTXT. CancelarCFDICasinos cancela con el sello de la sucursal (claveSucursal).
/TimbradoTXT/Retenciones/Service.svcTimbrado, CancelarRetencion, CargarPFXRetencionEl TXT de Retenciones; también por REST como timbradoTXT-Retenciones.
/AdmonUsuarios/Service.svcCrearUsuario, EliminarUsuario, ObtenerConfigUsuarioIgual que antes, con las credenciales de administrador que te damos. Las cuentas que crea responden como el servicio anterior.
/SelladoTimbradoXML/Service.svcSelladoTimbradoCFDI, SeguimientoCFDI, CancelarCFDI, ConsultarEstatusCFDI, CargarCertificado, ObtenerDatosCertificado, ObtenerPDF_CFDI, CargarLogoUn servicio hecho a la medida de un cliente, con sus propios tipos de respuesta y sus textos. CargarLogo pone tu logo en los PDF.

Qué debes saber

  • El usuario y la contraseña van en el cuerpo (user, password), como antes. Con credenciales malas recibes un objeto con Codigo 500 y el mensaje de siempre, no un Fault.
  • Todo desenlace llega con HTTP 200 y su Codigo, también lo incierto: Codigo 500 con IdSeguimiento. Pregunta por él con SeguimientoCFDI antes de volver a mandar el comprobante; si lo reenvías igual, recibes 506 con el mismo UUID, nunca dos timbres. Está explicado en Reintentos sin doble timbre.
  • Los catálogos del comprobanteModel llegan como los serializa tu proxy (Item01, Null, fechas dateTime, banderas Specified) y se leen igual que antes.
  • Los campos vacíos se reportan con los mismos textos y en el mismo orden que antes: primero la lista de requeridos, después las credenciales.
  • Un XML roto recibe HTTP 400 sin cuerpo y una operación que no existe, el s:Fault de siempre (HTTP 500).
  • Las rutas no distinguen mayúsculas, como IIS. ?wsdl y ?singleWsdl dan el mismo documento.

Un ejemplo

Petición
POST /Cancelacion/Service.svc HTTP/1.1
Host: pruebas.timbrado.idea15.com
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IService/ConsultarEstatusCFDI"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ConsultarEstatusCFDI xmlns="http://tempuri.org/">
      <user>tu-usuario</user>
      <password>tu-contraseña</password>
      <rfcEmisor>EKU9003173C9</rfcEmisor>
      <rfcReceptor>EKU9003173C9</rfcReceptor>
      <uuid>AAAAAAAA-BBBB-4CCC-8DDD-EEEEEEEEEEEE</uuid>
      <total>116.00</total>
    </ConsultarEstatusCFDI>
  </s:Body>
</s:Envelope>
Respuesta · HTTP 200
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ConsultarEstatusCFDIResponse xmlns="http://tempuri.org/">
      <ConsultarEstatusCFDIResult xmlns:a="http://schemas.datacontract.org/2004/07/ServiciosMexico.Responses"
                                  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:Codigo>100</a:Codigo>
        <a:EsCancelable>Cancelable sin aceptación</a:EsCancelable>
        <a:Estado>Vigente</a:Estado>
        <a:EstatusCancelacion i:nil="true"/>
        <a:Mensaje>S - Comprobante obtenido satisfactoriamente.</a:Mensaje>
        <a:Operacion>true</a:Operacion>
      </ConsultarEstatusCFDIResult>
    </ConsultarEstatusCFDIResponse>
  </s:Body>
</s:Envelope>
Con el proxy de .NET que ya tienes
// El proxy que ya tienes, generado del WSDL del servicio anterior: sólo cambia la dirección.
var cliente = new TimbradoObjeto.ServiceClient();
cliente.Endpoint.Address = new System.ServiceModel.EndpointAddress(
    "https://timbrado.idea15.com/TimbradoObjeto/CFDI/Service.svc");

var respuesta = cliente.Timbrado("tu-usuario", "tu-contraseña", comprobanteModel, obtenerPDF: false);
if (respuesta.Codigo == "100" || respuesta.Codigo == "506")
    GuardarXml(Convert.FromBase64String(respuesta.XMLBase64));   // 506: ya estaba timbrado, mismo UUID
else if (respuesta.Codigo == "500" && respuesta.IdSeguimiento != null)
    Pendiente(respuesta.IdSeguimiento);                           // no se sabe: pregunta con SeguimientoCFDI

Para una integración nueva, REST

SOAP está para que lo que ya funciona siga funcionando. Si empiezas de cero, la API REST es la misma funcionalidad con JSON y está documentada método por método en la referencia.