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
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.
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
//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.
Muchas gracias, un gran aporte de verdad, me salvaste la vida
ResponderEliminarGracias 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.
ResponderEliminarPorque 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
ResponderEliminarHola 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?
ResponderEliminarI have copied your code, but I get a The request was aborted: Could not create SSL/TLS secure channel.
ResponderEliminarMe genero el mismo error
EliminarHi guys. Seems Banxico updated the SecurityProtocol to TSL 1.2. Used to work with older SP until Sep 7th, 2019
EliminarSo 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.
Changing to .Net Framework 4.6.1 works for me.
EliminarHice los cambios requeridos pero aun no logro el funcionamiento de la api, podrías apoyarme por favor
Eliminarhave you ever tried with tsl 1.3 ?
EliminarPero 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.
ResponderEliminarServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
ResponderEliminarServicePointManager.SecurityProtocol = (SecurityProtocolType)768; //TLS 1.1
Alguien sabe como obtener el token de una forma diferente a la pagina de banxico?
ResponderEliminarSi buscan un ejemplo en Javascript les comparto un ejemplo https://www.programacionparatodos.com/2024/08/api-de-banxico-para-obtener-tipo-de.html
ResponderEliminar