Volver al blog
7 min de lectura27 de junio de 2026

Guía completa de API REST con FastAPI y Python para México: pagos, OAuth y despliegue

Aprende a crear APIs REST con FastAPI en México, integrar OpenPay, Conekta, OAuth2 y desplegar en nubes con región local.

CDMXFastAPIPython

Introducción

FastAPI ha emergido como la opción preferida para desarrollar **APIs REST** en la **Ciudad de México** gracias a su rendimiento cercano a Node.js y su facilidad para escribir código tipado con Python. Los equipos de desarrollo en la CDMX valoran su generación automática de documentación OpenAPI, su compatibilidad con **async/await** y la integración nativa con herramientas de validación como **Pydantic**. Estas ventajas se traducen en tiempos de entrega más cortos, menor deuda técnica y una mejor experiencia para los clientes de startups y PyMEs mexicanas.

En este contexto, **Light Innovations Lab** se posiciona como socio tecnológico estratégico: somos una fábrica de soluciones AI‑native con sede en la CDMX, y acompañamos a los CTOs y arquitectos en la construcción, pruebas y despliegue de APIs productivas, incluyendo integraciones locales de pagos y autenticación. En los siguientes apartados descubrirás cómo levantar una API FastAPI lista para producción en México, conectar con OpenPay y Conekta, asegurarla con OAuth2 nacional y desplegarla en la nube con latencia mínima para usuarios de la CDMX.

---

Configuración inicial y arquitectura orientada a producción en México

Estructura del proyecto

```text

my_fastapi_app/

├─ app/

│ ├─ api/

│ │ ├─ v1/

│ │ │ ├─ endpoints/

│ │ │ └─ __init__.py

│ ├─ core/

│ │ ├─ config.py

│ │ └─ security.py

│ ├─ db/

│ │ ├─ models.py

│ │ └─ session.py

│ └─ main.py

├─ tests/

├─ .env

├─ Dockerfile

├─ docker-compose.yml

└─ requirements.txt

```

Esta arquitectura separa claramente la capa de **API**, la configuración central y el acceso a la base de datos, facilitando el trabajo de equipos distribuidos en la CDMX.

Manejo de entornos con .env

```python

# app/core/config.py

from pydantic import BaseSettings, Field

class Settings(BaseSettings):

ENV: str = Field(..., env='ENV')

DB_URL: str = Field(..., env='DB_URL')

SECRET_KEY: str = Field(..., env='SECRET_KEY')

OPENPAY_KEY: str = Field(..., env='OPENPAY_KEY')

CONEKTA_KEY: str = Field(..., env='CONEKTA_KEY')

class Config:

env_file = '.env'

settings = Settings()

```

Al mantener las credenciales fuera del repositorio, los equipos pueden trabajar en **dev**, **staging** y **prod** sin riesgos de exposición.

Pydantic y dependencias

FastAPI usa **Pydantic** para validar datos de entrada y salida. Definir esquemas claros reduce los errores de integración con sistemas de pago mexicanos.

```python

# app/api/v1/schemas.py

from pydantic import BaseModel, condecimal

class PaymentRequest(BaseModel):

amount: condecimal(gt=0, max_digits=10, decimal_places=2)

currency: str = 'MXN'

description: str

customer_id: str

```

Las dependencias se inyectan mediante el sistema de **Depends**, lo que permite reutilizar lógica de conexión a bases de datos o a clientes externos (OpenPay, Conekta) sin acoplar el código.

---

Integración con servicios de pago mexicanos (OpenPay y Conekta)

1. Configuración del cliente OpenPay

```python

# app/api/v1/dependencies.py

import openpay

from app.core.config import settings

def get_openpay_client():

client = openpay.Openpay(settings.OPENPAY_KEY, 'YOUR_MERCHANT_ID')

client.production = False # Cambiar a True en prod

return client

```

2. Endpoint de cobro

```python

# app/api/v1/endpoints/payments.py

from fastapi import APIRouter, Depends, HTTPException

from app.api.v1.schemas import PaymentRequest

from app.api.v1.dependencies import get_openpay_client

from sqlalchemy.orm import Session

from app.db.session import get_db

router = APIRouter(prefix='/payments', tags=['payments'])

@router.post('/openpay')

async def create_openpay_charge(payload: PaymentRequest,

client = Depends(get_openpay_client),

db: Session = Depends(get_db)):

try:

charge = client.Charge.create({

'method': 'card',

'source_id': payload.customer_id,

'amount': float(payload.amount),

'currency': payload.currency,

'description': payload.description,

})

# Guardar en MySQL/MariaDB

db.execute("INSERT INTO payments (tx_id, amount, status) VALUES (:id, :amt, :st)",

{'id': charge.id, 'amt': payload.amount, 'st': charge.status})

db.commit()

return {'status': 'ok', 'id': charge.id}

except Exception as e:

raise HTTPException(status_code=400, detail=str(e))

```

3. Validación de webhooks

```python

# app/api/v1/endpoints/webhooks.py

from fastapi import Request, APIRouter, Header, HTTPException

import hmac, hashlib

router = APIRouter(prefix='/webhooks', tags=['webhooks'])

@router.post('/openpay')

async def openpay_webhook(request: Request, x_signature: str = Header(None)):

body = await request.body()

expected = hmac.new(settings.OPENPAY_KEY.encode(), body, hashlib.sha256).hexdigest()

if not hmac.compare_digest(expected, x_signature):

raise HTTPException(status_code=401, detail='Invalid signature')

data = await request.json()

# actualizar estado de la transacción en la base de datos

return {'received': True}

```

4. Integración con Conekta (similar)

Conekta ofrece SDK en Python; el flujo es análogo: crear cliente, generar cargo y registrar webhook. La diferencia principal está en los campos de **order_id** y la necesidad de enviar **livemode** según el entorno.

---

Autenticación y autorización con proveedores OAuth2 nacionales

En México, además de Google y Azure, muchas empresas requieren integración con el **SAT (e.firma)** para validar la identidad de usuarios de gobierno. FastAPI Security simplifica la configuración.

```python

# app/core/security.py

from fastapi.security import OAuth2AuthorizationCodeBearer

from starlette.config import Config

config = Config('.env')

# Google México

google_oauth = OAuth2AuthorizationCodeBearer(

authorizationUrl='https://accounts.google.com/o/oauth2/v2/auth',

tokenUrl='https://oauth2.googleapis.com/token',

scopes={'openid': 'OpenID Connect'}

)

# Azure AD (Región México)

azure_oauth = OAuth2AuthorizationCodeBearer(

authorizationUrl='https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize',

tokenUrl='https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token',

scopes={'api://your-api/.default': 'Acceso a la API'}

)

# SAT e.firma (ejemplo simplificado)

sat_oauth = OAuth2AuthorizationCodeBearer(

authorizationUrl='https://login.sat.gob.mx/oauth/authorize',

tokenUrl='https://login.sat.gob.mx/oauth/token',

scopes={'signature': 'Firma electrónica'}

)

```

Uso en rutas protegidas

```python

@router.get('/secure-data')

async def secure_endpoint(token: str = Depends(google_oauth)):

# Decodificar y validar token, refrescar si es necesario

return {'msg': 'Acceso concedido'}

```

FastAPI permite combinar varios esquemas; basta con declarar varios **Depends** y validar el origen del token.

---

Despliegue en la nube con región México (DigitalOcean México, Azure México, AWS Saúl)

Dockerfile optimizado

```Dockerfile

FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

```

CI/CD con GitHub Actions (region‑aware)

```yaml

name: Deploy to DigitalOcean

on:

push:

branches: [main]

jobs:

build-and-deploy:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v3
  • name: Set up Python

uses: actions/setup-python@v4

with:

python-version: '3.11'

  • name: Install deps

run: pip install -r requirements.txt

  • name: Build Docker image

run: |

docker build -t registry.digitalocean.com/mi-registro/fastapi-app:${{ github.sha }} .

  • name: Push to DOCR

env:

DOCKER_PASSWORD: ${{ secrets.DOCR_PASSWORD }}

run: |

echo $DOCKER_PASSWORD | docker login registry.digitalocean.com -u ${{ secrets.DOCR_USER }} --password-stdin

docker push registry.digitalocean.com/mi-registro/fastapi-app:${{ github.sha }}

  • name: Deploy to App Platform (Mexico)

uses: digitalocean/app-action@v1

with:

api-token: ${{ secrets.DO_API_TOKEN }}

app-id: ${{ secrets.DO_APP_ID }}

```

Configuración de bases de datos gestionadas

  • **DigitalOcean Managed PostgreSQL – Región: `nyc3` (latencia mínima para CDMX)**
  • **Azure Database for MySQL – Región: `Mexico Central`**
  • **AWS RDS (Saúl) – Región: `us-east-2` (proximal a la CDMX)**

En los archivos de configuración (`.env`) se añaden los endpoints y credenciales seguros.

CDN y SSL local

Utiliza **Cloudflare México** o **Azure Front Door** para servir la documentación OpenAPI vía HTTPS y reducir la latencia. Configura certificados automáticos con **Let’s Encrypt** dentro del contenedor o delega a la plataforma cloud.

---

Pruebas de carga, profiling y buenas prácticas de seguridad para producción en CDMX

Herramientas de carga

  • **Locust** – script Python que simula usuarios concurrentes desde un servidor en la CDMX.
  • **k6** – ejecutable ligero que se puede correr en una VM de DigitalOcean México.

```bash

locust -f tests/load_test.py --host=https://api.midominio.com.mx

```

Profiling con Py‑Spy

```bash

py-spy top --pid $(pgrep -f uvicorn) --rate 1000

```

Esto ayuda a identificar cuellos de botella en rutas críticas, como la generación de cargos.

Hardening de FastAPI

  • **CORS**: limitar orígenes a dominios `.mx` y sub‑dominios de la empresa.

```python

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(

CORSMiddleware,

allow_origins=["https://*.midominio.com.mx"],

allow_credentials=True,

allow_methods=["GET", "POST", "PUT", "DELETE"],

allow_headers=["*"],

)

```

  • **Rate limiting** con **slowapi** para evitar ataques de fuerza bruta.
  • **HTTPS obligatorio** – forzar redirección en el nivel del load balancer (Azure Application Gateway, DigitalOcean Load Balancer).
  • **Monitoreo**: Grafana + Loki + Prometheus desplegados en una VM en la CDMX para recolectar métricas de latencia, errores 5xx y trazas de logs.

---

Conclusión

FastAPI se ha convertido en la herramienta ideal para crear APIs REST robustas y escalables en México, ofreciendo rendimiento, tipado y una experiencia de desarrollo que encaja con los equipos de la **Ciudad de México**. Con esta guía has visto cómo estructurar el proyecto, integrar pagos locales como OpenPay y Conekta, asegurar la API con OAuth2 nacional y desplegarla en la nube con latencia mínima para usuarios de la CDMX. ¿Listo para llevar tu producto al siguiente nivel? Descarga nuestro checklist de despliegue y **[Contáctanos](https://lightinnovationlab.com/#contact)** para recibir asesoría personalizada de Light Innovations Lab.

¿Necesitas ayuda con esto?

Somos Light Innovations Lab, AI Factory con base en Ciudad de México. Construimos productos con IA desde el primer día.

Contáctanos