{"id":1987,"date":"2023-05-29T07:38:34","date_gmt":"2023-05-29T07:38:34","guid":{"rendered":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=1987"},"modified":"2023-05-29T07:38:34","modified_gmt":"2023-05-29T07:38:34","slug":"como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/","title":{"rendered":"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte)"},"content":{"rendered":"<h2><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1996\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg\" alt=\"\" width=\"914\" height=\"591\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg 914w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3-300x194.jpg 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3-768x497.jpg 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3-610x394.jpg 610w\" sizes=\"auto, (max-width: 914px) 100vw, 914px\" \/><\/h2>\n<p>Azure API Management ofrece la capacidad de delegaci\u00f3n, la cual permite que un sitio web externo gestione la informaci\u00f3n de los usuarios, en lugar de utilizar las funciones integradas del Developers Portal. En este art\u00edculo, nos centraremos espec\u00edficamente en la delegaci\u00f3n de la gesti\u00f3n de suscripciones a productos en Azure Api Management.<\/p>\n<p><!--more--><\/p>\n<h2>Configurando la delegaci\u00f3n de capacidades en el Azure API Management<\/h2>\n<p>El Azure API Management (APIM) proporciona una capacidad llamada \u00abDelegaci\u00f3n\u00bb, la cual s\u00f3lo est\u00e1 disponible en los planes \u00abDeveloper\u00bb, \u00abBasic\u00bb, \u00abStandard\u00bb y \u00abPremium\u00bb del\u00a0 recurso.<\/p>\n<p>Gracias a esta capacidad, el APIM permite que un sitio web externo se apropie de los datos de los usuarios desde el Developers Portal y realice una validaci\u00f3n personalizada. Con la\u00a0 delegaci\u00f3n, por ahora, se pueden controlar aspectos tales como el registro e inicio de\u00a0 sesi\u00f3n de usuarios en el Developers Portal, y la gesti\u00f3n de subscripciones a productos, en lugar de que se emplee la funcionalidad integrada del propio Developers Portal.<\/p>\n<p>Para esta publicaci\u00f3n, nos interesa concretamente la delegaci\u00f3n de la gesti\u00f3n de las\u00a0 subscripciones a productos, la cual sigue el siguiente flujo de trabajo:<\/p>\n<ol>\n<li>El usuario selecciona un producto en el Developers Portal del APIM y hace clic en el bot\u00f3n Suscribir.<\/li>\n<li>El navegador se redirige al <em>endpoint<\/em> de delegaci\u00f3n (en nuestro caso una aplicaci\u00f3n desplegada en un Azure Container Applicationo ACA).<\/li>\n<li>El <em>endpoint<\/em> de delegaci\u00f3n realiza los pasos necesarios para la suscripci\u00f3n al producto. Estos pueden incluir lo siguiente:\n<ul>\n<li>A &#8211; Redirigir a otra p\u00e1gina para solicitar informaci\u00f3n de facturaci\u00f3n y de pago (como tarjeta de cr\u00e9dito).<\/li>\n<li>B &#8211; Hacer preguntas adicionales.<\/li>\n<li>C &#8211; Almacenar la informaci\u00f3n adicional relevante para la facturaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>La delegaci\u00f3n de servicios del APIM se puede realizar f\u00e1cilmente desde el Azure Portal como se muestra en la siguiente imagen:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1883\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12.png\" alt=\"\" width=\"1542\" height=\"458\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12.png 1542w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12-300x89.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12-1024x304.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12-768x228.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12-1536x456.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image12-610x181.png 610w\" sizes=\"auto, (max-width: 1542px) 100vw, 1542px\" \/><\/a><\/p>\n<p>Es fundamental saber que no existe una \u00abDelegation Validation Key\u00bb hasta tanto no le\u00a0 demos al bot\u00f3n de generar y salvemos los cambios. Una vez hecho eso, guardar en un lugar seguro el valor del \u00abDelegation Validation Key\u00bb ya que lo necesitaremos m\u00e1s adelante (aunque perfectamente podemos volver a esta pantalla para recuperarlo o generar uno nuevo).<\/p>\n<h2>Recibiendo la delegaci\u00f3n de subscripciones desde el Azure API Management<\/h2>\n<p>La delegaci\u00f3n de capacidades desde el Azure API Management (APIM) requiere la implementaci\u00f3n de una aplicaci\u00f3n web, no de una API (REST) como podr\u00edamos pensar. Es fundamental que la aplicaci\u00f3n proporcione las pantallas necesarias para que los usuarios puedan suministrar la informaci\u00f3n que necesitemos como relevante para nuestra gesti\u00f3n de sus subscripciones. Para este ejemplo, y la integraci\u00f3n con Stripe, s\u00f3lo necesitamos que el usuario nos suministre el nombre de la subscripci\u00f3n.<\/p>\n<p>Esta aplicaci\u00f3n web la podemos programar con el lenguaje de programaci\u00f3n que mejor se adapte a nuestra forma de trabajar, y que se puede desplegar en cualquier tipo de recursos que consideremos apropiado.<\/p>\n<p>Para esta demo, he querido crear una arquitectura totalmente \u00abCloud Native\u00bb, por lo cual eleg\u00ed desarrollar la aplicaci\u00f3n web como una imagen Docker que perfectamente podr\u00edamos desplegar en un Azure Web Application for Docker, un Azure Container Instance o un Azure Kubernetes Service; sin embargo, he elegido la opci\u00f3n m\u00e1s de moda en cuanto a rendimiento, costo y capacidades que son las Azure Container Applications (ACA).<\/p>\n<p>Como leguaje de programaci\u00f3n he elegido C# con .NET 6 porque es mi favorito, aunque todo lo implementado es perfectamente realizable con otros lenguajes.<\/p>\n<p>En el ejemplo he decidido usar ASP.NET MVC con Razor como tecnolog\u00eda de implementaci\u00f3n.<\/p>\n<p>Recordemos que Azure, y m\u00e1s a\u00fan nuestra aplicaci\u00f3n, no estar\u00e1n certificadas en <a href=\"https:\/\/www.pcisecuritystandards.org\/\">PCI-DSS<\/a>, raz\u00f3n por la cual tenemos que redirigir a las pantallas de Stripe (fuera del contexto de nuestra aplicaci\u00f3n y de Azure) para obtener esta informaci\u00f3n. Otra alternativa es incrustar las pantallas de Stripe en un <span style=\"font-family: monospace;\">&lt;iframe\\&gt;<\/span> pero muchas veces encuentro eso m\u00e1s laborioso e innecesario.<\/p>\n<p>Como nuestra aplicaci\u00f3n se va a integrar con Stripe, primero es necesario tener una referencia a su API a trav\u00e9s de una librer\u00eda que nos permite usarla con C#. Para ello nos basta con usar el paquete NuGet que nos proporciona la misma gente de Stripe <a href=\"https:\/\/www.nuget.org\/packages\/Stripe.net\/\">aqu\u00ed<\/a>: <a href=\"https:\/\/www.nuget.org\/packages\/Stripe.net\/\">https:\/\/www.nuget.org\/packages\/Stripe.net\/<\/a>.<\/p>\n<p>Luego, necesitamos configurar algunos par\u00e1metros que conservaremos en el <span style=\"font-family: monospace;\">appsettings.json<\/span> de nuestra aplicaci\u00f3n y que recuperaremos con una clase de opciones como la siguiente:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1884\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13.png\" alt=\"\" width=\"1200\" height=\"446\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13.png 1200w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13-300x112.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13-1024x381.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13-768x285.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image13-610x227.png 610w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p>Necesitaremos:<\/p>\n<ul>\n<li>Una nueva \u00abRestricted Keys\u00bb que podemos crear desde el portal del desarrollador de Stripe, que podemos llamar \u00abApp Key\u00bb y con permisos otorgados para leer precios y productos, y para poder leer y escribir subscripciones, registros de uso y sesiones de pago (<em>checkout<\/em>).<\/li>\n<li>El valor de la \u00abPublishable key\u00bb que ya nos da Stripe como parte de sus \u00abStandard keys\u00bb.<\/li>\n<li>El secreto del <em>webhook<\/em>, ya sea porque lo conservamos de la ejecuci\u00f3n del <em>script<\/em> de configuraci\u00f3n de Stripe, o porque lo recuperamos desde el portal del desarrollador.<\/li>\n<\/ul>\n<p>Para trabajar con el APIM desde c\u00f3digo C#, lo m\u00e1s conveniente es usar el<br \/>\npaquete NuGet que nos proporciona Microsoft <a href=\"https:\/\/www.nuget.org\/packages\/Azure.ResourceManager.ApiManagement\">aqu\u00ed<\/a>: <a href=\"https:\/\/www.nuget.org\/packages\/Azure.ResourceManager.ApiManagement\">https:\/\/www.nuget.org\/packages\/Azure.ResourceManager.ApiManagement<\/a>.<\/p>\n<p>Para poder usar las librer\u00edas de este paquete necesitamos ciertos valores a obtener de nuestra instancia del APIM a conservar en el appsettings.json de nuestra aplicaci\u00f3n y que recuperaremos con una clase de opciones como la siguiente:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1885\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14.png\" alt=\"\" width=\"1200\" height=\"670\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14.png 1200w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14-300x168.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14-1024x572.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14-768x429.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image14-610x341.png 610w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p>Necesitaremos:<\/p>\n<ul>\n<li>El valor del \u00abDelegation Validation Key\u00bb generado al configurar la delegaci\u00f3n de capacidades del APIM en el Azure Portal<\/li>\n<li>La URL al Developers Portal.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1886 alignright\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15.png\" alt=\"\" width=\"1089\" height=\"180\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15.png 1089w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15-300x50.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15-1024x169.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15-768x127.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image15-610x101.png 610w\" sizes=\"auto, (max-width: 1089px) 100vw, 1089px\" \/><\/a><\/p>\n<ul>\n<li>La URL para la gesti\u00f3n del APIM, que se puede obtener como se muestra en la siguiente imagen. Tambi\u00e9n es importante encenderla.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1887 alignright\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16.png\" alt=\"\" width=\"1549\" height=\"851\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16.png 1549w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16-300x165.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16-1024x563.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16-768x422.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16-1536x844.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image16-610x335.png 610w\" sizes=\"auto, (max-width: 1549px) 100vw, 1549px\" \/><\/a><\/p>\n<ul>\n<li>Por \u00faltimo, necesitamos el nombre de la instancia del APIM, el nombre del grupo de recursos donde la hemos desplegado y el identificador de la subscripci\u00f3n de Azure a la que pertenece dicho grupo de recursos.<\/li>\n<\/ul>\n<p>Con este paquete agregado a nuestro proyecto de aplicaci\u00f3n web, y los valores de integraci\u00f3n ya configurados, s\u00f3lo necesitamos registrarlos en nuestro Program.cs de la siguiente forma:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1888\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17.png\" alt=\"\" width=\"1560\" height=\"558\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17.png 1560w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17-300x107.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17-1024x366.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17-768x275.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17-1536x549.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image17-610x218.png 610w\" sizes=\"auto, (max-width: 1560px) 100vw, 1560px\" \/><\/a><\/p>\n<p>Cada vez que el APIM env\u00ede una delegaci\u00f3n de operaciones, lo har\u00e1 a una ruta que hayamos definido al configurar la delegaci\u00f3n, y siempre acompa\u00f1ada de un par\u00e1metro (por query string) llamado \u00aboperation\u00bb que identifica la operaci\u00f3n que el usuario quiere realizar.<\/p>\n<p>Lo recomendable aqu\u00ed es que tengamos un solo controlador para recibir las peticiones desde el APIM que se encargue de extraer el valor del par\u00e1metro \u00aboperation\u00bb para enrutar al siguiente controlador que se encargar\u00e1 de efectivamente ejecutar la l\u00f3gica de la operaci\u00f3n.<\/p>\n<p>En el c\u00f3digo de ejemplo encontrar\u00e1s dentro del directorio Pages la p\u00e1gina Index.cshtml que contiene la l\u00f3gica de enrutamiento de las peticiones que llegan desde el APIM.<\/p>\n<p>En concreto nos interesan dos operaciones:<\/p>\n<ul>\n<li><span style=\"font-family: monospace;\">Subscribe<\/span> \u2192 recibida cuando se est\u00e1 creando una nueva subscripci\u00f3n a productos desde el Developers Portal.<\/li>\n<li><span style=\"font-family: monospace;\">Unsubscribe<\/span> \u2192 recibida cuando se cancela una subscripci\u00f3n activa desde el Developers Portal.<\/li>\n<\/ul>\n<p>Ahora procedemos a crear una interfaz que defina las operaciones que realizaremos desde c\u00f3digo con C# sobre el Azure API Management usando el paquete NuGet importado anteriormente.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1889\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18.png\" alt=\"\" width=\"1429\" height=\"335\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18-300x70.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18-1024x240.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18-768x180.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image18-610x143.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>Cada una de estas operaciones est\u00e1n implementadas en la clase ApiService, la cual usamos como un Singleton que registramos en nuestro contenedor de dependencias en el Program.cs.<\/p>\n<p>El constructor de la clase ApiService se encarga de crear una instancia de la clase ArmClient (que obtenemos del paquete NuGet) la cual a su vez necesita de las credenciales de Azure para operar correctamente.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1890\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19.png\" alt=\"\" width=\"1560\" height=\"520\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19.png 1560w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19-300x100.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19-1024x341.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19-768x256.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19-1536x512.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image19-610x203.png 610w\" sizes=\"auto, (max-width: 1560px) 100vw, 1560px\" \/><\/a><\/p>\n<p>La clase ArmClient es como un cliente agn\u00f3stico del tipo de servicio o recurso de Azure que vamos a gestionar. Para identificar el recurso del APIM necesitamos ciertos par\u00e1metros que hemos configurado en el appsettings.json y que obtenemos de la clase de opciones ApimServiceOptions, que son el identificador de la subscripci\u00f3n de Azure, el nombre del grupo de recursos y el nombre del servicio, los cuales usaremos para crear un identificador del recurso APIM gracias al m\u00e9todo \u00abCreateResourceIdentifier\u00bb de la clase \u00abApiManagementServiceResource\u00bb la cual representa un APIM junto con las operaciones de instancia que se pueden realizar el mismo.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1891\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20.png\" alt=\"\" width=\"1429\" height=\"264\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20-300x55.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20-1024x189.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20-768x142.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image20-610x113.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>En el c\u00f3digo anterior se obtiene una instancia de <span style=\"font-family: monospace;\">ApiManagementServiceResource<\/span>, que sirve para gestionar aspectos tales como las subscripciones. Sin embargo, existen muchas m\u00e1s como <span style=\"font-family: monospace;\">ApiManagementProductResource<\/span> que sirve para gestionar productos (por ejemplo, obtenerlos a partir de su identificador), <span style=\"font-family: monospace;\">ApiManagementUserResource<\/span> que sirve para gestionar los usuarios creados desde el Developer Portal, entre otros.<\/p>\n<p>Cada m\u00e9todo de la interface <span style=\"font-family: monospace;\">IApimService<\/span> har\u00e1 uso de la instancia del <span style=\"font-family: monospace;\">ArmClient<\/span> creada en el constructor de <span style=\"font-family: monospace;\">ApimService<\/span> as\u00ed como del identificador de creado por <span style=\"font-family: monospace;\">ApiManagementUserResource<\/span> para obtener una instancia del servicio que se necesite para cada operatividad.<\/p>\n<p>La interface (y su implementaci\u00f3n) definen las siguientes operaciones:<\/p>\n<ul>\n<li><span style=\"font-family: monospace;\">CancelSubscriptionAsync<\/span> \u2192 Se encarga de cancelar una subscripci\u00f3n, ya sea porque el usuario lo especifica de esta forma desde el Developer Portal, o porque es cancelada administrativamente desde el portal de Stripe.<\/li>\n<li><span style=\"font-family: monospace;\">CreateSubscriptionAsync<\/span> \u2192 Se encarga de crear la subscripci\u00f3n dentro del APIM una vez que Stripe nos reporte que se ha validado y registrado correctamente el pago.<\/li>\n<li><span style=\"font-family: monospace;\">GetProductAsync<\/span> \u2192 Obtiene informaci\u00f3n de un producto desde el APIM empleado para prop\u00f3sitos de subscripci\u00f3n.<\/li>\n<li><span style=\"font-family: monospace;\">SuspendSubscriptionAsync<\/span> \u2192 Suspende una subscripci\u00f3n, habitualmente por motivos de impago. A diferencia de una cancelaci\u00f3n, si se paga la deuda, la subscripci\u00f3n se reactivar\u00eda.<\/li>\n<li><span style=\"font-family: monospace;\">ValidateRequest<\/span> \u2192 La explico a continuaci\u00f3n<\/li>\n<\/ul>\n<p>Un de los primeros m\u00e9todos a implementar es el <span style=\"font-family: monospace;\">ValidateRequest<\/span>, ya que cada vez que el APIM llama a una aplicaci\u00f3n externa en la delegaci\u00f3n de servicios, es fundamental verificar la validez de la llamada. Esta validaci\u00f3n se hace empleando el algoritmo de HMAC para verificaci\u00f3n de firmas con una encriptaci\u00f3n SHA-512.<\/p>\n<p>As\u00ed, la implementaci\u00f3n del m\u00e9todo <span style=\"font-family: monospace;\">ValidateRequest<\/span> ser\u00eda la siguiente:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1892\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21.png\" alt=\"\" width=\"1430\" height=\"315\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21.png 1430w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21-300x66.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21-1024x226.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21-768x169.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image21-610x134.png 610w\" sizes=\"auto, (max-width: 1430px) 100vw, 1430px\" \/><\/a><\/p>\n<p>La clase <span style=\"font-family: monospace;\">HMACSHA512<\/span> la proporciona .NET 6 en <span style=\"font-family: monospace;\">System.Security.Cryptography<\/span>.<\/p>\n<p>Como puedes ver, se emplea desde la configuraci\u00f3n el valor de la opci\u00f3n <span style=\"font-family: monospace;\">DelegationValidationKey<\/span>, que es utilizada para verificar que efectivamente la petici\u00f3n llega desde el APIM y que un potencial atacante no ha manipulado la petici\u00f3n. Esto importante porque para bien o para mal todas las peticiones del APIM hacia la aplicaci\u00f3n sobre la que delega operaciones env\u00eda los par\u00e1metros por URL (en forma de <em>query strings<\/em>) con lo cual son <em>\u00abcapturables\u00bb<\/em> por un potencial atacante.<\/p>\n<p>Dependiendo de cada operaci\u00f3n que env\u00ede desde el APIM a la aplicaci\u00f3n externa de delegaci\u00f3n de servicios, se debe validar un conjunto espec\u00edfico de par\u00e1metros, los cuales podemos consultar en la documentaci\u00f3n oficial de Microsoft <a href=\"https:\/\/learn.microsoft.com\/es-es\/azure\/api-management\/api-management-howto-setup-delegation#create-your-delegation-endpoint-1\">aqu\u00ed<\/a>:<br \/>\n<a href=\"https:\/\/learn.microsoft.com\/es-es\/azure\/api-management\/api-management-howto-setup-delegation#create-your-delegation-endpoint-1\">https:\/\/learn.microsoft.com\/es-es\/azure\/api-management\/api-management-howto-setup-delegation#create-your-delegation-endpoint-1<\/a><\/p>\n<p>En el caso de nuestro c\u00f3digo tenemos las siguientes implementaciones:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1893\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22.png\" alt=\"\" width=\"1429\" height=\"507\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22-300x106.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22-1024x363.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22-768x272.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image22-610x216.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>Para cada situaci\u00f3n de delegaci\u00f3n necesitaremos controladores y pantallas concretas para atenderlas.<\/p>\n<p>Cubrir todo el c\u00f3digo que las implementa en una publicaci\u00f3n como esta puede ser algo extenso (casi un libro \ud83e\udd13), con lo cual os indicar\u00e9 para qu\u00e9 es cada controlador y pantalla en la aplicaci\u00f3n web y os invito a que os clon\u00e9is el repo para revisarla y adaptarla a vuestras necesidades.<\/p>\n<ul>\n<li><span style=\"font-family: monospace;\">Index<\/span> \u2192 Como os comentaba es el controlador que recibe las peticiones desde el APIM y las enruta al controlador o pantalla m\u00e1s conveniente para atenderla.<\/li>\n<li><span style=\"font-family: monospace;\">Unsubscribe<\/span> \u2192 Se encarga de cancelar una subscripci\u00f3n en el APIM y en Stripe.<\/li>\n<li><span style=\"font-family: monospace;\">Subscribe<\/span> \u2192 Se encarga de capturar la informaci\u00f3n para la subscripci\u00f3n de parte del usuario. En nuestro caso, s\u00f3lo nos interesa el nombre de la subscripci\u00f3n. Al final de procesamiento, nos redirige el procesamiento a StripeCheckout.<\/li>\n<li><span style=\"font-family: monospace;\">StripeCheckout<\/span> \u2192 Se encarga de configurar el cliente JavaScript de Stripe para realizar la redirecci\u00f3n a la pantalla que capturar\u00e1 la informaci\u00f3n de la tarjeta de cr\u00e9dito. Recordemos que como ni Azure ni el APIM est\u00e1n certificadas en certificadas en <a href=\"https:\/\/www.pcisecuritystandards.org\/\">PCI-DSS<\/a>, la pantalla que se muestra para obtener esta informaci\u00f3n del cliente est\u00e1 en la infraestructura y contexto de ejecuci\u00f3n de Stripe, por lo cual Stripe debe eventualmente conocer a donde redirigir si todo ha salido bien. Para ello, la pantalla de <span style=\"font-family: monospace;\">StripeCheckout<\/span> primero hace un POST a su Controller inicializar una sesi\u00f3n de pago con Stripe. El identificador de esa sesi\u00f3n es lo que se usar\u00e1 en el c\u00f3digo del cliente para renderizar la pantalla de Stripe en el navegador, fuera de Azure y nuestra web app, y dentro e Stripe. Uno de esos datos es la direcci\u00f3n donde se est\u00e1 ejecutando nuestra aplicaci\u00f3n, la cual tenemos que capturar desde el navegador pues nuestro aplicativo est\u00e1 en Docker y de hacerlo en el lado servidor nos retornar\u00eda siempre <span style=\"font-family: monospace;\">localhost<\/span>.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1894\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23.png\" alt=\"\" width=\"1426\" height=\"1236\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23.png 1426w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23-300x260.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23-1024x888.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23-768x666.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image23-610x529.png 610w\" sizes=\"auto, (max-width: 1426px) 100vw, 1426px\" \/><\/a><\/p>\n<p>Al recibir el POST, una de las primeras cosas que se hacen es construir las URLs para escenarios de cancelaci\u00f3n y \u00e9xito del pago (ver l\u00edneas 12 a 32 en la siguiente imagen), las cuales necesitan una URL de retorno que se obtiene del lado cliente como se muestra en la imagen anterior, en la l\u00ednea morada dentro del recuadro verde.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1895\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24.png\" alt=\"\" width=\"1429\" height=\"1489\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24-288x300.png 288w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24-983x1024.png 983w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24-768x800.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image24-610x636.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>Con esta informaci\u00f3n (l\u00edneas 36 a 75) se crea una sesi\u00f3n de Stripe.<\/p>\n<p>N\u00f3tese como en las l\u00edneas 55 a 73 se especifica el precio a pagar, as\u00ed como las cantidades. El precio es obtenido desde Stripe empleado una instancia de su clase <span style=\"font-family: monospace;\">PriceService<\/span> e identificando el producto con el identificador de producto del APIM. Esto es posible porque cuando inicializamos Stripe con el script de PowerShell tomamos en cuenta la configuraci\u00f3n de productos del APIM, de la cual, entre otras cosas, se toma el identificador del producto para emplearlo tal cual como identificador en Stripe.<\/p>\n<p>Creada la sesi\u00f3n de Stripe, basta con retornar su identificador como resultado del POST para que el c\u00f3digo del lado del cliente en su navegador (cuadro naranja dos im\u00e1genes m\u00e1s arriba) haga la redirecci\u00f3n.<\/p>\n<ul>\n<li><span style=\"font-family: monospace;\">PaymentCancelled<\/span> \u2192 Notifica al usuario que ha habido alg\u00fan fallo con el pago desde Stripe y le da la oportunidad de reintentar.<\/li>\n<li><span style=\"font-family: monospace;\">PaymentSucceeded<\/span> \u2192 Notifica al usuario que todo ha salido bien con el pago, y que su subscripci\u00f3n estar\u00e1 pronto disponible, redirigi\u00e9ndole al Developers Portal.<\/li>\n<\/ul>\n<p>Ahora bien, una vez que Stripe ha procesado el pago necesita comunicar al APIM que todo ha ido bien para que se realizan las acciones necesarias para que la subscripci\u00f3n est\u00e9 disponible para el usuario y sea visible en el Developer Portal.<\/p>\n<p>Esta integraci\u00f3n con Stripe requiere de un <em>webhook<\/em>, al cual Stripe enviar\u00e1 notificaciones sobre cambios en las subscripciones.<\/p>\n<p>En concreto nos interesan tres eventos:<\/p>\n<ul>\n<li>Subscripci\u00f3n creada representada por el evento \u00ab<span style=\"font-family: monospace;\">CUSTOMER.SUBSCRIPTION.CREATED<\/span>\u00ab, es enviado por Stripe una vez la<br \/>\ninformaci\u00f3n del pago se ha validado y registrado correctamente para que el APIM pueda crear la subscripci\u00f3n.<\/li>\n<li>Subscripci\u00f3n actualizada representada por el evento \u00ab<span style=\"font-family: monospace;\">CUSTOMER.SUBSCRIPTION.UPDATED<\/span>\u00bb es enviada por Stripe cuando algo pasa con la subscripci\u00f3n, por ejemplo, que no se ha podido pagar y que por lo tanto deber\u00eda ser suspendida.<\/li>\n<li>Subscripci\u00f3n cancelada representada por ele vento \u00ab<span style=\"font-family: monospace;\">CUSTOMER.SUBSCRIPTION.DELETED<\/span>\u00bb es enviada por Stripe si la subscripci\u00f3n es borrada desde el propio portal de Stripe para que sea cancelada en el APIM.<\/li>\n<\/ul>\n<p>El <em>webhook<\/em> est\u00e1 implementado por un <span style=\"font-family: monospace;\">Controller<\/span> llamado <span style=\"font-family: monospace;\">StripeWebhook<\/span>, y utiliza los m\u00e9todos de la interface <span style=\"font-family: monospace;\">IApimService<\/span> para atender a cada evento como seg\u00fan corresponda.<\/p>\n<p>En caso de fallo de comunicaci\u00f3n, Stripe se encargar\u00e1 de constantemente llamar al <em>webhook<\/em> para asegurar que las acciones necesarias se lleven a cabo. Por su parte, el\u00a0 <em>webhook<\/em> puede notificar\u00eda a Stripe que todo est\u00e1 en orden simplemente retornando un valor booleano a <span style=\"font-family: monospace;\">true<\/span>.<\/p>\n<h2>Reportando consumo desde Azure API Management a Stripe para su facturaci\u00f3n<\/h2>\n<p>Cuando los usuarios realizan llamadas a las APIs de cada Producto dentro del Azure API Management (APIM) deben hacer uso de una clave de subscripci\u00f3n que les identifica. Gracias a esta clave, una base de datos interna del APIM registra las llamadas (tanto totales, como segregadas por exitosas o fallidas) para que puedan ser reportadas en un informe que se puede utilizar para calcular cu\u00e1nto cobrar a dichos usuarios.<\/p>\n<p>En esta demo usaremos una Azure Function para obtener esta informaci\u00f3n, procesarla y enviarla a Stripe.<\/p>\n<p>La Azure Function se debe ejecutar peri\u00f3dicamente. Para la demo tengo puesto que se ejecute cada minuto, pero esto es un <em>overkill<\/em> en toda regla. Lo suyo ser\u00eda que se ejecute cada 24 horas dentro de una ventana de tiempo que se considere \u00abapropiada\u00bb.<\/p>\n<p>A la hora de recuperar informaci\u00f3n, hay que decidir que plataforma (el APIM o Stripe)\u00a0 consideramos como el maestro de los datos. En mi caso, para la demo he considerado que Stripe lleva la voz cantante en cuanto al estado de las subscripciones, raz\u00f3n por la cual comienza la ejecuci\u00f3n de la Azure Function recuperando las subscripciones activas desde Stripe. No obstante, otra alternativa es obtener las subscripciones activas desde el APIM y luego consultar Stripe. Eleg\u00ed este enfoque porque es el que realiza menos llamadas.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1896\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25.png\" alt=\"\" width=\"1431\" height=\"1020\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25.png 1431w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25-300x214.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25-1024x730.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25-768x547.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image25-610x435.png 610w\" sizes=\"auto, (max-width: 1431px) 100vw, 1431px\" \/><\/a><\/p>\n<p>Una vez que tenemos las subscripciones activas desde Stripe, iteramos sobre \u00e9stas hasta que ya no queden subscripciones por procesar.<\/p>\n<p>Por cada subscripci\u00f3n, se obtiene el identificador de esta en el APIM (el cual es\u00a0 almacenado como metadata en Stripe al crear la subscripci\u00f3n). Tambi\u00e9n se obtiene de la metadata un valor identificado como \u00ab<span style=\"font-family: monospace;\">last-usage-update<\/span>\u00bb el cual es utilizado para calcular que no existan espacios de tiempo entre los usos habidos de un API y sus usos reportados, tal que no se pierda datos de facturaci\u00f3n. Esto lo hago entre las l\u00edneas 26 y 39 de la\u00a0 siguiente imagen, aunque la mayor\u00eda de las veces es un c\u00f3digo que rara vez se ejecuta; no\u00a0 obstante, es importante entender que el \u00abtema del dinero\u00bb es delicado y que tenemos que\u00a0 considerar las casu\u00edsticas l\u00edmite (o borde) para asegurar que no se pierde facturaci\u00f3n.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1897\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26.png\" alt=\"\" width=\"1429\" height=\"1000\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26-300x210.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26-1024x717.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26-768x537.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image26-610x427.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>N\u00f3tese que en la l\u00ednea 30 estamos obteniendo el reporte de uso de la subscripci\u00f3n en un\u00a0 per\u00edodo espec\u00edfico. El m\u00e9todo <span style=\"font-family: monospace;\">GetUsageReportAsync<\/span> est\u00e1 implementado de forma\u00a0 privada dentro de la funci\u00f3n de la siguiente manera:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1898\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27.png\" alt=\"\" width=\"1430\" height=\"134\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27.png 1430w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27-300x28.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27-1024x96.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27-768x72.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image27-610x57.png 610w\" sizes=\"auto, (max-width: 1430px) 100vw, 1430px\" \/><\/a><\/p>\n<p>Los filtros usados para obtener el reporte de consumo usan notaci\u00f3n de OData.<\/p>\n<p>Luego tenemos el m\u00e9todo privado <span style=\"font-family: monospace;\">ProcessReportAsync<\/span> que toma el reporte de uso y lo procesa de forma tal que se env\u00eda informaci\u00f3n a Stripe sobre el consumo. Su\u00a0 implementaci\u00f3n es la siguiente:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1899\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28.png\" alt=\"\" width=\"1429\" height=\"930\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28.png 1429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28-300x195.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28-1024x666.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28-768x500.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/image28-610x397.png 610w\" sizes=\"auto, (max-width: 1429px) 100vw, 1429px\" \/><\/a><\/p>\n<p>El c\u00f3digo determina si existen datos de uso en el reporte obtenido desde el APIM. De haberlos, se crea un registro de consumo con la cantidad de unidades reportadas y en una fecha espec\u00edfica. Luego se actualiza la subscripci\u00f3n en Stripe con un nuevo valor para la metadata identificada como \u00ab<span style=\"font-family: monospace;\">last-usage-update<\/span>\u00bb para asegurarnos como mencionamos antes que no se pierden datos de facturaci\u00f3n.<\/p>\n<p>Y esto es todo lo que hace la Azure Function. Gracias al API de gesti\u00f3n del APIM y a c\u00f3mo \u00e9ste almacena en una base de datos interna la informaci\u00f3n sobre el uso de las APIs, podemos f\u00e1cilmente informar al proveedor de pagos (en este caso Stripe) de forma peri\u00f3dica cu\u00e1ntas llamadas se han realizado para que las conserve y cobre a los usuarios cuando corresponda seg\u00fan el modelo de negocio configurado.<\/p>\n<p>Por \u00faltimo, puede ser interesante destacar que en una implementaci\u00f3n \u00abm\u00e1s real\u00bb que la de esta demo, cada acci\u00f3n que realiza esta Azure Function est\u00e9 repartida entre varias Azure Functions, conectadas entre s\u00ed mediante un mecanismo que siga el patr\u00f3n de dise\u00f1o \u00ab<a href=\"https:\/\/microservices.io\/patterns\/data\/transactional-outbox.html\">Transactional outbox<\/a>\u00ab, el cual es relativamente sencillo de implementar utilizando Cosmos DB y su funcionalidad de \u00ab<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/cosmos-db\/change-feed\">Change Feed<\/a>\u00bb combinada con la capacidad de \u00ab<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/cosmos-db\/nosql\/transactional-batch?tabs=dotnet\">Transactional Batches<\/a>\u00ab, aunque eso es tema para otra conversaci\u00f3n y otra publicaci\u00f3n \ud83d\ude09<\/p>\n<p><strong>\u00a1Muchas gracias por leerme y espero que os sea de utilidad!<\/strong><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Azure API Management ofrece la capacidad de delegaci\u00f3n, la cual permite que un sitio web externo gestione la informaci\u00f3n de los usuarios, en lugar de utilizar las funciones integradas del Developers Portal. En este art\u00edculo, nos centraremos espec\u00edficamente en la &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":199,"featured_media":1996,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[131,2,121,132],"tags":[],"class_list":["post-1987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-api-management","category-cloud-computing","category-data","category-ia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte) | ENCAMINA<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte)\" \/>\n<meta property=\"og:description\" content=\"Azure API Management ofrece la capacidad de delegaci\u00f3n, la cual permite que un sitio web externo gestione la informaci\u00f3n de los usuarios, en lugar de utilizar las funciones integradas del Developers Portal. En este art\u00edculo, nos centraremos espec\u00edficamente en la &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-29T07:38:34+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"914\" \/>\n\t<meta property=\"og:image:height\" content=\"591\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Rodrigo Liberoff\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rliberoff\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rodrigo Liberoff\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/\"},\"author\":{\"name\":\"Rodrigo Liberoff\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/5d872a89111919d7f5072c32fef484e0\"},\"headline\":\"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte)\",\"datePublished\":\"2023-05-29T07:38:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/\"},\"wordCount\":3401,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/05\\\/api-management-3.jpg\",\"articleSection\":[\"Azure API Management\",\"Cloud computing\",\"data\",\"IA\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/\",\"name\":\"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte) | ENCAMINA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/05\\\/api-management-3.jpg\",\"datePublished\":\"2023-05-29T07:38:34+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/5d872a89111919d7f5072c32fef484e0\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/05\\\/api-management-3.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/05\\\/api-management-3.jpg\",\"width\":914,\"height\":591},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/5d872a89111919d7f5072c32fef484e0\",\"name\":\"Rodrigo Liberoff\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g\",\"caption\":\"Rodrigo Liberoff\"},\"description\":\"Arquitecto Cloud y de Soluciones de Software en ENCAMINA, cuento con con m\u00e1s de 19 a\u00f1os de experiencia. Apasionado del dise\u00f1o, conceptualizaci\u00f3n e implementaci\u00f3n de software empleando el lenguaje de programaci\u00f3n C# y las \u00faltimas tecnolog\u00edas de Microsoft, especialmente Azure. Disfruto de crear arquitecturas de software e investigar sobre nuevas tecnolog\u00edas, y su posible implantaci\u00f3n dentro de diversas organizaciones y clientes. Tambi\u00e9n soy un Agile Coach, y me fascina hablar y ayudar en la instituci\u00f3n y uso de metodolog\u00edas \u00e1giles como Scrum, Kamban, Sumban y SAFe.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/rliberoff\\\/\",\"https:\\\/\\\/x.com\\\/rliberoff\"],\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/rliberoff\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte) | ENCAMINA","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte)","og_description":"Azure API Management ofrece la capacidad de delegaci\u00f3n, la cual permite que un sitio web externo gestione la informaci\u00f3n de los usuarios, en lugar de utilizar las funciones integradas del Developers Portal. En este art\u00edculo, nos centraremos espec\u00edficamente en la &hellip; Continue reading &rarr;","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2023-05-29T07:38:34+00:00","og_image":[{"width":914,"height":591,"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg","type":"image\/jpeg"}],"author":"Rodrigo Liberoff","twitter_card":"summary_large_image","twitter_creator":"@rliberoff","twitter_misc":{"Escrito por":"Rodrigo Liberoff","Tiempo de lectura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/"},"author":{"name":"Rodrigo Liberoff","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/5d872a89111919d7f5072c32fef484e0"},"headline":"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte)","datePublished":"2023-05-29T07:38:34+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/"},"wordCount":3401,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg","articleSection":["Azure API Management","Cloud computing","data","IA"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/","name":"C\u00f3mo monetizar nuestras APIs de Inteligencia Artificial con el Azure API Management (3\u00aa parte) | ENCAMINA","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg","datePublished":"2023-05-29T07:38:34+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/5d872a89111919d7f5072c32fef484e0"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-monetizar-nuestras-apis-de-inteligencia-artificial-con-el-azure-api-management-3a-parte\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/05\/api-management-3.jpg","width":914,"height":591},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/5d872a89111919d7f5072c32fef484e0","name":"Rodrigo Liberoff","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb6e449978f2a7277cccb31a42a6114cd3e5d05151c7654632b12691f96d2397?s=96&d=mm&r=g","caption":"Rodrigo Liberoff"},"description":"Arquitecto Cloud y de Soluciones de Software en ENCAMINA, cuento con con m\u00e1s de 19 a\u00f1os de experiencia. Apasionado del dise\u00f1o, conceptualizaci\u00f3n e implementaci\u00f3n de software empleando el lenguaje de programaci\u00f3n C# y las \u00faltimas tecnolog\u00edas de Microsoft, especialmente Azure. Disfruto de crear arquitecturas de software e investigar sobre nuevas tecnolog\u00edas, y su posible implantaci\u00f3n dentro de diversas organizaciones y clientes. Tambi\u00e9n soy un Agile Coach, y me fascina hablar y ayudar en la instituci\u00f3n y uso de metodolog\u00edas \u00e1giles como Scrum, Kamban, Sumban y SAFe.","sameAs":["https:\/\/www.linkedin.com\/in\/rliberoff\/","https:\/\/x.com\/rliberoff"],"url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/rliberoff\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=1987"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media\/1996"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=1987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=1987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=1987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}