Tipo de cambio FIX con WebService de Banxico

El Banco de México (Banxico) cuenta con el Sistema de Información Económica (SIE - API Beta) en el cual mediante la clase HttpWebRequest podemos hacer consultas de diferentes indicadores económicos los cuales se clasifican mediante lo que Banxico define como Serie.

El primer paso es obtener un "Token" en la página del SIE

https://www.banxico.org.mx/SieAPIRest/service/v1/

 


Ese token nos servirá para realizar las consultas al sistema;

Posteriormente buscamos en el Catálogo de Series el indicador de nuestro interés


Para nuestro caso, la Serie que nos interesa es: "SF43718"

Ahora el código fuente el cual toma como base el presentado en la página de Banxico con algunas modificaciones para facilitar el uso.


using System;

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Net;

namespace ServiciosExternos
{

    #region /* Clases para tratar la cadena JSON */
    [DataContract]
    public class Serie
    {
        [DataMember(Name = "titulo")]
        public string Title { get; set; }

        [DataMember(Name = "idSerie")]
        public string IdSerie { get; set; }

        [DataMember(Name = "datos")]
        public DataSerie[] Data { get; set; }

    }

    [DataContract]
    public class DataSerie
    {
        [DataMember(Name = "fecha")]
        public string Date { get; set; }

        [DataMember(Name = "dato")]
        public string Data { get; set; }
    }

    [DataContract]
    public class SeriesResponse
    {
        [DataMember(Name = "series")]
        public Serie[] series { get; set; }
    }

    [DataContract]
    public class Response
    {
        [DataMember(Name = "bmx")]
        public SeriesResponse seriesResponse { get; set; }
    }
    #endregion


    public class Banxico
    {

        #region /* Constantes */
        const string BANXICO_MI_TOKEN = "AQUÍ PONEN EL TOKEN OBTENIDO EN LA PÁGINA DE BANXICO";
        const string BANXICO_URL = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/{0}/datos/{1}/{1}";
        const string BANXICO_FORMATO_FECHA = "yyyy-MM-dd";

        const string BANXICO_HEADER_ITEMTOKEN = "Bmx-Token";
        const string BANXICO_HEADER_FORMATACCEPTED = "application/json";

        const string BANXICO_SERIE_TIPOCAMBIOFIX = "SF43718";
        #endregion


        #region /* Procedimientos WebRequest */
        static Response ReadSerie(string serie)
        {
            return ReadSerie(serie, DateTime.Now);
        }

        static Response ReadSerie(string serie, DateTime fecha)
        {

            Response _result = null;
            string _strSerie = serie;
            string _fmtFecha = fecha.ToString(BANXICO_FORMATO_FECHA);

            try
            {                
                string _url = string.Format(BANXICO_URL, _strSerie, _fmtFecha); 

                HttpWebRequest _webRequest = WebRequest.Create(_url) as HttpWebRequest;
                _webRequest.Accept = BANXICO_HEADER_FORMATACCEPTED;
                _webRequest.Headers[BANXICO_HEADER_ITEMTOKEN] = BANXICO_MI_TOKEN;
                HttpWebResponse _webResponse = _webRequest.GetResponse() as HttpWebResponse;

                if (_webResponse.StatusCode != HttpStatusCode.OK)
                    throw new Exception(String.Format(
                    "Server error (HTTP {0}: {1}).",
                    _webResponse.StatusCode,
                    _webResponse.StatusDescription));

                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response));
                object objResponse = jsonSerializer.ReadObject(_webResponse.GetResponseStream());
                _result = objResponse as Response;
            }
            catch (Exception e)
            {
                //Console.WriteLine(e.Message);
            }

            return _result;
        }
        #endregion


        public static string TipoDeCambioFIX()
        {
            string _result = TipoDeCambioFIX(DateTime.Now);
            return _result;
        }
        
        public static string TipoDeCambioFIX(DateTime fecha)
        {
            string _result = string.Empty;
            Response _responce = ReadSerie(BANXICO_SERIE_TIPOCAMBIOFIX, fecha);
            if (_responce != null)
                _result = _responce.seriesResponse.series[0].Data[0].Data;
            return _result;
        }

    }
}


Para usar el código en un formulario...

Poner la referencia al Namespace


using MDICore.ServiciosExternos

//En el procedimiento de un botón por ejemplo:

//Tipo de cambio del día actual;
Debug.Print("Tipo de cambio: {0} ", Banxico.TipoDeCambioFIX());

//Tipo de cambio de una fecha específica
Debug.Print("Tipo de cambio: {0} ", Banxico.TipoDeCambioFIX(DateTime.Parse("2017/08/01")));


EL SOFTWARE SE PROPORCIONA "TAL CUAL" Y EL AUTOR RECHAZA TODAS LAS 
GARANTÍAS CON RESPECTO A ESTE SOFTWARE, INCLUIDAS TODAS LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y ADECUACIÓN. EN NINGÚN CASO EL AUTOR SERÁ RESPONSABLE POR CUALQUIER DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENTE, O CUALQUIER DAÑO QUE RESULTE DE LA PÉRDIDA DE USO, DATOS O BENEFICIOS, YA SEA EN UNA ACCIÓN DE CONTRATO, NEGLIGENCIA U OTRA ACCIÓN EXTRACONTRACTUAL QUE SURJA DE O EN CONEXIÓN CON EL USO O RENDIMIENTO DE ESTE SOFTWARE.

/* ----------------------------------------- */ 

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Comentarios

  1. Muchas gracias, un gran aporte de verdad, me salvaste la vida

    ResponderEliminar
  2. Gracias gran aporte. Sabes si el precio de compra y venta se aplica para todas las divisas, No encuentro el precio de compra y venta del dirham.

    ResponderEliminar
  3. Porque usas la de tipo de cambio fix SF43718, para pesos a dolares USD tambien existe SF60653 que tiene como razón Tipo de cambio pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de liquidación

    ResponderEliminar
  4. Hola no soy desarrollador, pero utilizo Microsoft Flow para consultar web services y parsear datos de json, he estado intentando obtener el tipo de cambio desde Microsoft Flow pero al consultar la API marca error, segun me regresas un mensaje de que estoy usando caracteres raros o que la pagina no responde, pero si consulto la URL en un navegador si funciona. ¿Alguien alguna vez ha contactado al webmaster?

    ResponderEliminar
  5. I have copied your code, but I get a The request was aborted: Could not create SSL/TLS secure channel.

    ResponderEliminar
    Respuestas
    1. Me genero el mismo error

      Eliminar
    2. Hi guys. Seems Banxico updated the SecurityProtocol to TSL 1.2. Used to work with older SP until Sep 7th, 2019

      So make sure you use this line before you instantiate the HttpWebRequet object. It took some time to figure this out for me but got it after couple hours...

      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // <= this line
      HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
      request.Accept = "application/json";
      request.Headers["Bmx-Token"] = _token;

      //Add your proxy credentials if required by your organization
      WebProxy proxy = new WebProxy(_proxyUrlPort, true)
      {
      Credentials = new NetworkCredential(_proxyUser, _proxyPassword, _proxyDomain)
      };
      request.Proxy = proxy;
      //Now get your response.
      HttpWebResponse response = request.GetResponse() as HttpWebResponse;

      All this is not mentioned in the RestAPI documentation.

      Eliminar
    3. Changing to .Net Framework 4.6.1 works for me.

      Eliminar
    4. Hice los cambios requeridos pero aun no logro el funcionamiento de la api, podrías apoyarme por favor

      Eliminar
    5. have you ever tried with tsl 1.3 ?

      Eliminar
  6. Pero se puede utilizar el mismo token para hacer la consulta por ejemplo otro dia o cada dia tienes que generar nuevo token?, tenia un servicio automatizado para que me metiera el tipo de cambio cada dia distinto pero pues si tengo que utilizar un token distinto me generaria un problema y mas que tiene captcha la pagina para obtenerlo.

    ResponderEliminar
  7. ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)768; //TLS 1.1

    ResponderEliminar
  8. Alguien sabe como obtener el token de una forma diferente a la pagina de banxico?

    ResponderEliminar
  9. Si buscan un ejemplo en Javascript les comparto un ejemplo https://www.programacionparatodos.com/2024/08/api-de-banxico-para-obtener-tipo-de.html

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Complemento - Leyendas Fiscales

Colecciones en C# - Implementación IList e IBindingList