New question

Question:

Date: 07-05-2019 12:40:07 (In Spanish)

API REST con Authorization Basic [Resolved]

Buenas tardes para todos

Lo que pasa es que requiero hacer una petición a una REST API, la cual se debe autenticar con Authorization Basic y en el body debe agregarse un archivo JSON, buscando en internet encontré varios ejemplos, pero hasta el m
momento no he logrado hacerlo funcionar. Me gustaria saber si alguien tiene algun ejemplo sobre este tema.

Este es el código que llevo hasta el momento
//Encabezado factura
$encabezado["codmoneda"] = "COP";
$encabezado["comentarios"] = "";
$encabezado["emisor"] = "12354654";
$encabezado["factortrm"] =  0;
$encabezado["fecha"] =  "2019-04-12";
$encabezado["fvence"] =  "2019-04-12";
$encabezado["idsuc"] =  1;
$encabezado["idvendedor"] =  0;
$encabezado["iva"] =  19000;
$encabezado["nit"] =  784585;
$encabezado["numero"] =  993005001;
$encabezado["ordencompra"] =  "";
$encabezado["prefijo"] =  "FVE";
$encabezado["subtotal"] =  200000;
$encabezado["sucursal"] =  0;
$encabezado["total"] =  219000;
$encabezado["usuario"] =  "";
$encabezado["totalDet"] =  3;
$encabezado["totalImp"] =  2;

//Datos empresa
$sucursal["ciudad"] =  "BOGOTA D.C.";
$sucursal["codcliente"] =  "";
$sucursal["departamento"] =  "BOGOTA D.C.";
$sucursal["direccion1"] =  "CALLE LA BENDICION # 55 - 55";
$sucursal["dpto"] =  "11";
$sucursal["email"] =  "";
$sucursal["emailfe"] =  "leandroalfonso111@hotmail.com.com";
$sucursal["idsuc"] =  0;
$sucursal["idvendedor"] =  0;
$sucursal["movil"] =  "3214567849";
$sucursal["mun"] =  "001";
$sucursal["razonsocial"] =  "EL TALES";
$sucursal["telefono1"] =  "2100518";
$sucursal["telefono2"] =  "";

//Datos tercero o cliente
$tercero["apl2"] = "";
$tercero["apli1"] = "TALES";
$tercero["comentarios"] = "";
$tercero["dv"] = "";
$tercero["identificacion"] = 56456465;
$tercero["idtipoempresa"] = 4;
$tercero["nom1"] = "TALES";
$tercero["nom2"] = "";
$tercero["razonsocial"] = EL TALES";
$tercero["tdoc"] =  13;
$tercero["tipopersona"] = "N";

//impuestos en variables
$imp_1["base_calculo"] = 100000;
$imp_1["porciva"] = 19;
$imp_1["valor"] = 19000;

$imp_2["base_calculo"] = 100000;
$imp_2["porciva"] = 0;
$imp_2["valor"] = 0;

$impuestos = array();
array_push($impuestos , $imp_1);
array_push($impuestos , $imp_2);

//Listado de articulos a facturar
//articulo 1
$detal_1["adicional"] = "linea1";
$detal_1["cantidad"] = 10;
$detal_1["idproducto"] = "01";
$detal_1["idunidad"] = "Und";
$detal_1["iva"] = 19000;
$detal_1["ivausd"] = 0;
$detal_1["nombreproducto"] = "Producto1";
$detal_1["operacion"] = "SA";
$detal_1["porcdcto"] = 0;
$detal_1["porciva"] = 19;
$detal_1["pos"] = 1;
$detal_1["precio"] = 10000;
$detal_1["preciousd"] = 0;
$detal_1["subtotal"] = 100000;
$detal_1["subtotalusd"] = 0;

//articulo 2
$detal_2["adicional"] = "linea2";
$detal_2["cantidad"] = 1;
$detal_2["idproducto"] = "02";
$detal_2["idunidad"] = "EA";
$detal_2["iva"] = 0;
$detal_2["ivausd"] = 0;
$detal_2["nombreproducto"] = "Producto2";
$detal_2["operacion"] = "SA";
$detal_2["porcdcto"] = 0;
$detal_2["porciva"] = 0;
$detal_2["pos"] = 1;
$detal_2["precio"] = 60000;
$detal_2["preciousd"] = 0;
$detal_2["subtotal"] = 60000;
$detal_2["subtotalusd"] = 0;

//articulo 3
$detal_3["adicional"] = "linea3";
$detal_3["cantidad"] = 2;
$detal_3["idproducto"] = "03";
$detal_3["idunidad"] = "ME";
$detal_3["iva"] = 0;
$detal_3["ivausd"] = 0;
$detal_3["nombreproducto"] = "Producto3";
$detal_3["operacion"] = "SA";
$detal_3["porcdcto"] = 0;
$detal_3["porciva"] = 0;
$detal_3["pos"] = 1;
$detal_3["precio"] = 20000;
$detal_3["preciousd"] = 0;
$detal_3["subtotal"] = 40000;
$detal_3["subtotalusd"] = 0;

$detalle = array();
array_push($detalle , $detal_1);
array_push($detalle , $detal_2);
array_push($detalle , $detal_3);

//agregamos la informacion al json documento
$documento["detalle"] = $detalle;
$documento["encabezado"] = $encabezado;
$documento["sucursal"] = $sucursal;
$documento["tercero"] = $tercero;
$documento["impuesto"] = $impuestos;

//creamos el json con el documento final
$final["documento"] = $documento;

$cuerpo = json_encode($final);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://ws.proveedor-prueba.co/Factura/nrodocumento",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $cuerpo,
  CURLOPT_HTTPHEADER => array(
    "Accept: **",
    "Authorization: Basic dVZUNEh5K3JGdExKRDVp09",
    "Cache-Control: no-cache",
    "Connection: keep-alive",
    "Host: ws.dsnube.co",
    "Postman-Token: 9d1a43d0-8199-48c3-b7a7-41ce21766ba3,c860d256-7167-4b16-bde4-513bde1763f9",
    "User-Agent: PostmanRuntime/7.11.0",
    "accept-encoding: gzip, deflate",
    "cache-control: no-cache",
    "content-length: 2346"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}


En este link se puede ver el comportamiento del código

Prueba

De antemano gracias

LEANDRO AREVALO
Tags: PHP - Webservices Votes: 0 - Answers: 5 - Views: 9 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 08-05-2019 08:55:00 Saludos, trate de entrar a la pagina que pusiste pero se queda cargando....

    Te recomiendo para probar : Insomnia
    Recomiendo para el acceso usar mejor tokens o parametro referente a ello.
    Te dejo una url muy bueno de rest con PHP
    Aqui

    Saludos™
      Votes: 0 - Link answer
     
  • Date: 08-05-2019 09:32:04 Ernesto muchas gracias por el interés:

    Efectivamente, eso es lo que sucede, se queda cargando y despues de un bueeeeeen rato, devuelve este error:

    cURL Error #:Operation timed out after 30000 milliseconds with 0 bytes received
    


    Por otro lado ya hice la prueba con insonmia, pero el resultado es el mismo.

    Voy a leer el articulo y comento.

    Saludos
      Votes: 0 - Link answer
     
  • Date: 08-05-2019 12:26:14 Saludos, entonces primero ve en tu php que este activo el CURL
    Segundo ponle tiempo maximo de espera...
    Y tercero ve si tienes ciclo en algun lado forzal a salir (un numero maximo de repeticiones o intentos)
    Por lo regular cuando se queda asi es por ello...
    No se si pusiste todo el codigo... pero al intentar leer ips luego se queda asi...

    Saludos...

    Stryfe™
      Votes: 0 - Link answer
     
  • Date: 08-05-2019 14:16:09 Ernesto de nuevo gracias por el interés...

    Efectivamente, le coloque el tiempo de espera y le quite otras opciones innecesarias del encabezado y funciono. También hable con el desarrollador del WS y me dijo que tenía otros errores en el body de la petición.

    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://ws.proveedor-prueba.co/Factura/nrodocumento",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 120,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => $cuerpo,
      CURLOPT_HTTPHEADER => array(
        "Authorization: Basic dVZUNEh5K3JGdExKRDVZz09",   
        "cache-control: no-cache"
      ),
    ));
    


    Muchas Gracias
      Votes: 0 - Link answer
     
  • Date: 08-05-2019 14:22:43 Tienes dos problemas.

    1. el sitio https://ws.dsnube.co está utilizando un certificado de una compañía llamada Let's Encrypt.

    Tienes que hacer es darle a tu código el certificado que necesita para validar la petición.

    Descarga el archivo .pem del sitio (Dándole click al candado que aparece junto a la URL) y agrégalo a tu petición con las siguientes opciones:

        //Suponiendo que el certificado está en el mismo directorio que tu archivo:
        CURLOPT_SSL_VERIFYHOST => __DIR__ . DS . 'wsdsnubeco.pem',
        CURLOPT_SSL_VERIFYPEER => __DIR__ . DS . 'wsdsnubeco.pem',
    


    2. El otro error sucede porque copiaste los encabezados de la petición de algún ejemplo con una petición diferente. Tus encabezados mandan datos incorrectos e innecesarios. Lo único que debes mandar es el encabezado de autorización.

    Una vez corregidos ambos detalles ya se recibe el mensaje de vuelta:

    {"error":"Factura ya existe"}
    


    Te dejo el código functionando aquí para que le des un vistazo.

    <?php
    //Encabezado factura
    $encabezado['codmoneda']   = 'COP';
    $encabezado['comentarios'] = '';
    $encabezado['emisor']      = '830106032';
    $encabezado['factortrm']   = 0;
    $encabezado['fecha']       = '2019-04-12';
    $encabezado['fvence']      = '2019-04-12';
    $encabezado['idsuc']       = 1;
    $encabezado['idvendedor']  = 0;
    $encabezado['iva']         = 19000;
    $encabezado['nit']         = 78903450;
    $encabezado['numero']      = 993005001;
    $encabezado['ordencompra'] = '';
    $encabezado['prefijo']     = 'FVE';
    $encabezado['subtotal']    = 200000;
    $encabezado['sucursal']    = 0;
    $encabezado['total']       = 219000;
    $encabezado['usuario']     = '';
    $encabezado['totalDet']    = 3;
    $encabezado['totalImp']    = 2;
    
    //Datos empresa
    $sucursal['ciudad']       = 'BOGOTA D.C.';
    $sucursal['codcliente']   = '';
    $sucursal['departamento'] = 'BOGOTA D.C.';
    $sucursal['direccion1']   = 'CALLE 111 # 23 - 55';
    $sucursal['dpto']         = '11';
    $sucursal['email']        = '';
    $sucursal['emailfe']      = 'hymplus@outlook.com';
    $sucursal['idsuc']        = 0;
    $sucursal['idvendedor']   = 0;
    $sucursal['movil']        = '312340890';
    $sucursal['mun']          = '001';
    $sucursal['razonsocial']  = 'MORALES NESTOR';
    $sucursal['telefono1']    = '2100518';
    $sucursal['telefono2']    = '';
    
    //Datos tercero o cliente
    $tercero['apl2']           = '';
    $tercero['apli1']          = 'MORALES';
    $tercero['comentarios']    = '';
    $tercero['dv']             = '';
    $tercero['identificacion'] = 78903450;
    $tercero['idtipoempresa']  = 4;
    $tercero['nom1']           = 'NESTOR';
    $tercero['nom2']           = '';
    $tercero['razonsocial']    = 'MORALES NESTOR';
    $tercero['tdoc']           = 13;
    $tercero['tipopersona']    = 'N';
    
    //impuestos en variables
    $imp_1['base_calculo'] = 100000;
    $imp_1['porciva']      = 19;
    $imp_1['valor']        = 19000;
    
    $imp_2['base_calculo'] = 100000;
    $imp_2['porciva']      = 0;
    $imp_2['valor']        = 0;
    
    $impuestos = [$imp_1, $imp_2];
    
    //Listado de articulos a facturar
    //articulo 1
    $detal_1['adicional']      = 'linea1';
    $detal_1['cantidad']       = 10;
    $detal_1['idproducto']     = '01';
    $detal_1['idunidad']       = 'Und';
    $detal_1['iva']            = 19000;
    $detal_1['ivausd']         = 0;
    $detal_1['nombreproducto'] = 'Producto1';
    $detal_1['operacion']      = 'SA';
    $detal_1['porcdcto']       = 0;
    $detal_1['porciva']        = 19;
    $detal_1['pos']            = 1;
    $detal_1['precio']         = 10000;
    $detal_1['preciousd']      = 0;
    $detal_1['subtotal']       = 100000;
    $detal_1['subtotalusd']    = 0;
    
    //articulo 2
    $detal_2['adicional']      = 'linea2';
    $detal_2['cantidad']       = 1;
    $detal_2['idproducto']     = '02';
    $detal_2['idunidad']       = 'EA';
    $detal_2['iva']            = 0;
    $detal_2['ivausd']         = 0;
    $detal_2['nombreproducto'] = 'Producto2';
    $detal_2['operacion']      = 'SA';
    $detal_2['porcdcto']       = 0;
    $detal_2['porciva']        = 0;
    $detal_2['pos']            = 1;
    $detal_2['precio']         = 60000;
    $detal_2['preciousd']      = 0;
    $detal_2['subtotal']       = 60000;
    $detal_2['subtotalusd']    = 0;
    
    //articulo 3
    $detal_3['adicional']      = 'linea3';
    $detal_3['cantidad']       = 2;
    $detal_3['idproducto']     = '03';
    $detal_3['idunidad']       = 'ME';
    $detal_3['iva']            = 0;
    $detal_3['ivausd']         = 0;
    $detal_3['nombreproducto'] = 'Producto3';
    $detal_3['operacion']      = 'SA';
    $detal_3['porcdcto']       = 0;
    $detal_3['porciva']        = 0;
    $detal_3['pos']            = 1;
    $detal_3['precio']         = 20000;
    $detal_3['preciousd']      = 0;
    $detal_3['subtotal']       = 40000;
    $detal_3['subtotalusd']    = 0;
    
    $detalle = [
        $detal_1,
        $detal_2,
        $detal_3,
    ];
    
    //agregamos la informacion al json documento
    $documento['detalle']    = $detalle;
    $documento['encabezado'] = $encabezado;
    $documento['sucursal']   = $sucursal;
    $documento['tercero']    = $tercero;
    $documento['impuesto']   = $impuestos;
    
    //creamos el json con el documento final
    $final['documento'] = $documento;
    
    $cuerpo = json_encode($final);
    
    $curl = curl_init();
    
    $certificate_location = __DIR__ . DS . 'wsdsnubeco.pem';
    
    curl_setopt_array($curl, [
        CURLOPT_URL            => 'https://ws.dsnube.co/dsrest/dsdatasnapfe.dll/datasnap/rest/TFactura/docfe',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING       => '',
        CURLOPT_MAXREDIRS      => 10,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST  => 'POST',
        CURLOPT_POSTFIELDS     => $cuerpo,
        CURLOPT_SSL_VERIFYHOST => __DIR__ . DS . 'wsdsnubeco.pem',
        CURLOPT_SSL_VERIFYPEER => __DIR__ . DS . 'wsdsnubeco.pem',
        CURLOPT_HTTPHEADER     => [
            'Authorization: Basic dVZUNEh5K3JGdExKRDVpVUh2SENkVTZzcmhPeHpJa3B5R2M3ZWVuWWVBeHhMOHJ2ejl3QW53endmUW05OGFiNTpkS3cxWXNHRXJyNUxaN3d4TCtudFhrTTF6L3YrT2RnSjM2UGdSWWF6L3pNdmRQMUFaRExKdmRNL3VsbEZlQWNBanY1UHVycC96ajhrL2RHRklSZStwZz09',
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
        echo 'cURL Error #:' . $err;
    } else {
        echo $response;
    }
    
      Votes: 2 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In