DoctorRecetas.API
REST API v2.6.0 — Documentación
v2.6.0 JSON

Introducción

DoctorRecetas API es la API REST de DoctorRecetas.com. Permite registrar usuarios, procesar pagos con tarjeta de crédito (Authorize.Net) y ATH Móvil, gestionar órdenes médicas y consultar el catálogo de productos. Todas las peticiones y respuestas usan JSON.

Flujo de uso típico:
  1. Autenticar usuario con POST /api/login.php para obtener el token JWT.
  2. Usar el token en el header Authorization: Bearer <token> en todos los endpoints protegidos.
  3. Crear la intención de compra con POST /api/crear_compra.php.
  4. Procesar el pago con POST /api/pagar.php o POST /api/pago_ath.php.
  5. Consultar las órdenes con GET /api/mis_ordenes.php.

Autenticación JWT

El token se genera en POST /api/login.php y tiene una duración de 7 días (604,800 segundos). Envíalo en el header Authorization para acceder a los endpoints protegidos.

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
Los endpoints marcados con 🔒 Requiere token necesitan el header Authorization. Los tokens se invalidan al hacer logout.

Formato de respuesta

Todas las respuestas siguen la misma estructura JSON:

✔ Éxito

{
  "success": true,
  "data": { ... }
}

✖ Error

{
  "success": false,
  "message": "Descripción del error."
}

Códigos de estado HTTP

CódigoSignificado
200Petición exitosa
201Recurso creado correctamente
401Token inválido o expirado
403Sin permisos para el recurso
404Recurso no encontrado
409Conflicto — el recurso ya existe
422Datos de entrada inválidos
500Error interno del servidor
POST /api/login.php Autenticación de usuario

Autentica al usuario con su usuario y clave. Devuelve un token JWT válido por 7 días.

Body (JSON)

CampoTipoReq.Descripción
usuariostringUsuario o email
clavestringContraseña del usuario
es_vip: 1 si tiene membresía activa, 0 si no.
Ejemplo de petición
POST /api/login.php
Content-Type: application/json

{
  "usuario": "juanperez",
  "clave":   "MiPassword123"
}
Respuesta 200
{
  "success": true,
  "data": {
    "us_id":     123,
    "us_nombres":"Juan Pérez",
    "es_vip":    1,
    "token":     "eyJ0eXAiOiJKV1Qi...",
    "expires_in":604800
  }
}
POST /api/registro.php Registro de nuevo usuario

Registra un nuevo usuario en el sistema.

Body (JSON)

CampoTipoReq.
us_nombresstring
us_emailstring
us_usuariostring
us_clavestring
us_telefonostring
us_direccionstring
Ejemplo de petición
POST /api/registro.php
Content-Type: application/json

{
  "us_nombres":  "Juan Pérez",
  "us_email":    "juan@ejemplo.com",
  "us_usuario":  "juanperez",
  "us_clave":    "MiPassword123",
  "us_telefono": "787-555-1234"
}
Respuesta 200
{
  "success": true,
  "data": { "us_id": 85 }
}
POST /api/verificar_o_registrar_usuario.php Verificar o registrar usuario por email

Consulta si un usuario existe por correo. Si existe, envía un código de verificación de 6 dígitos (válido 10 min) vía email. Si no existe, lo registra y también envía el código. El token JWT se obtiene en el siguiente paso con /api/verificar_codigo.php.

Caso 1 — Solo verificar (correo existente)

CampoTipoReq.
us_emailstring

Caso 2 — Registrar (correo nuevo)

CampoTipoReq.
us_emailstring
us_nombresstring
us_telefonostring
us_clavestring
Código de 6 dígitos enviado por PHPMailer + Gmail SMTP. Válido 10 minutos. Clave almacenada encriptada con AES-256-CBC.
Respuesta — usuario encontrado 200
{
  "status":  "success",
  "data": {
    "existe":          true,
    "us_id":           42,
    "us_nombres":      "Andrés López",
    "codigo_enviado":  true
  },
  "message": "Usuario encontrado. Ingresa el código enviado a tu correo para continuar."
}
Respuesta — usuario registrado 200
{
  "status":  "success",
  "data": {
    "existe":          false,
    "us_id":           85,
    "codigo_enviado":  true
  },
  "message": "Usuario registrado correctamente. Ingresa el código enviado a tu correo para obtener acceso."
}
POST /api/verificar_codigo.php Verificar código y obtener token JWT

Recibe el correo y el código de 6 dígitos enviado al usuario. Si el código es válido y no ha expirado, devuelve el token JWT de sesión.

CampoTipoReq.
us_emailstring
codigostring (6 dígitos)
El código expira en 10 minutos. Solo puede usarse una vez.
Respuesta 200
{
  "status":  "success",
  "data": {
    "us_id":      42,
    "us_nombres": "Andrés López",
    "token":      "eyJ0eXAiOiJKV1Qi...",
    "expires_in": 604800
  },
  "message": "Código verificado correctamente. Sesión iniciada."
}
Código incorrecto 401
{ "status": "error", "message": "Código incorrecto" }
Código expirado 410
{ "status": "error", "message": "El código ha expirado. Solicita uno nuevo" }
POST /api/logout.php Cerrar sesión e invalidar token
🔒 Requiere token

Cierra la sesión e invalida el token JWT activo.

Header requerido

Authorization: Bearer {token}
Respuesta 200
{
  "success": true,
  "message": "Sesión cerrada exitosamente"
}
GET /api/sesiones.php Validar sesión activa
🔒 Requiere token

Valida el token JWT y devuelve la información del usuario autenticado.

Respuesta 200
{
  "success": true,
  "data": {
    "us_id":       123,
    "us_nombres":  "Juan Pérez",
    "us_email":    "juan@ejemplo.com",
    "token_valido":true
  }
}
POST /api/solicitar_recuperacion.php Solicitar email de recuperación

Envía un email con un token de recuperación al correo registrado.

Body (JSON)

CampoTipoReq.
emailstring
Respuesta 200
{
  "success": true,
  "message": "Email de recuperación enviado"
}
POST /api/validar_token_recuperacion.php Validar token de recuperación
CampoTipoReq.
tokenstring
Respuesta 200
{
  "success": true,
  "valid":   true,
  "message": "Token válido"
}
POST /api/restablecer_contrasena.php Restablecer contraseña con token
CampoTipoReq.
tokenstring
nueva_clavestring
Respuesta 200
{
  "success": true,
  "message": "Contraseña actualizada exitosamente"
}
POST /api/pagar.php Procesar pago con tarjeta (Authorize.Net)
🔒 Requiere token

Procesa un pago con tarjeta de crédito/débito a través de Authorize.Net en producción. Soporta Visa, MasterCard, Amex y Discover.

Body (JSON)

CampoTipoReq.Descripción
pq_idarrayIDs de los productos
anombre_dearrayNombres por producto
pq_precionumberMonto total
card_numberstringNúmero de tarjeta
card_exp_monthstringMes expiración (MM)
card_exp_yearstringAño expiración (YYYY)
card_cvcstringCódigo de seguridad
card_namestringNombre en la tarjeta
Validación Luhn · AVS · CVV activos en producción.
Ejemplo de petición
POST /api/pagar.php
Authorization: Bearer eyJ...
Content-Type: application/json

{
  "pq_id":         [1, 2],
  "anombre_de":    ["Juan Pérez"],
  "pq_precio":     75.00,
  "card_number":   "4111111111111111",
  "card_exp_month":"12",
  "card_exp_year": "2027",
  "card_cvc":      "123",
  "card_name":     "Juan Pérez"
}
Respuesta 200
{
  "success": true,
  "data": {
    "cp_code":        "DR80V0Z6GC",
    "transaction_id": "60123456789",
    "monto":          75.00,
    "metodo":         "tarjeta"
  }
}
POST /api/pago_ath.php Procesar pago con ATH Móvil
🔒 Requiere token

Procesa un pago mediante ATH Móvil. Soporta estados completed y pending.

Body (JSON)

CampoTipoReq.Descripción
data.statusstringcompleted | pending
data.transaction_idstringID de ATH Móvil
pq_idarrayIDs de productos
anombre_dearrayNombres por producto
pq_precionumberMonto total
iny_fechastringFecha inyección
iny_direccionstringDirección inyección
pi_idarrayIDs inyección
pp_idintID pueblo inyección
Respuesta 200
{
  "success": true,
  "data": {
    "mensaje":        "Pago ATH procesado exitosamente",
    "cp_code":        "DR80V0Z6GC",
    "transaction_id": "ATH123456789",
    "monto":          29.99,
    "metodo":         "ATH Móvil",
    "orden_enviada":  true
  }
}
GET /api/mis_pagos.php Historial de pagos del usuario
🔒 Requiere token

Devuelve el historial completo de pagos del usuario autenticado.

Parámetros opcionales (query string)

ParamTipoDescripción
estadoint1 = aprobado · 0 = rechazado
Respuesta 200
{
  "success": true,
  "data": {
    "pagos": [
      {
        "cp_code":        "DR80V0Z6GC",
        "fecha":          "2026-05-13 14:30:00",
        "estado":         "aprobado",
        "metodo":         "tarjeta",
        "transaction_id": "60123456789",
        "total":          75.00
      }
    ],
    "total": 5
  }
}
POST /api/cancelar_membresia.php Cancelar membresía en Authorize.Net
🔒 Requiere token

Cancela la suscripción activa del usuario en Authorize.Net. Valida que la membresía pertenezca al usuario autenticado.

Body (JSON)

CampoTipoReq.
subscriptionIdstring
Respuesta 200
{
  "success": true,
  "data": {
    "message":        "Membresía cancelada exitosamente",
    "subscriptionId": "66228033"
  }
}
GET /api/detalle_pago.php?cp_code=DR80V0Z6GC Detalle de un pago específico
🔒 Requiere token

Query param

ParamTipoReq.
cp_codestring
Respuesta 200
{
  "success": true,
  "data": {
    "cp_code":    "DR80V0Z6GC",
    "cp_fecha":   "2026-05-13",
    "cp_metodo":  "tarjeta",
    "items": [
      {
        "pq_id":       1,
        "anombre_de":  "Juan Pérez",
        "txn_id":      "60123456789"
      }
    ]
  }
}
POST /api/enviar_orden.php Enviar orden médica por email
🔒 Requiere token

Envía la orden médica por email al usuario tras un pago exitoso. Se ejecuta automáticamente después de pagar.php y pago_ath.php.

Body (JSON)

CampoTipoReq.
cp_codestring
Respuesta 200
{
  "success":        true,
  "message":        "Orden enviada exitosamente",
  "cp_code":        "DR80V0Z6GC",
  "email":          "juan@ejemplo.com",
  "ordenes_enviadas":2
}
POST /api/crear_compra.php Registrar intención de compra
🔒 Requiere token

Registra una intención de compra en paquetes_compras. Genera automáticamente el cp_code (prefijo DR + 8 chars) y un token único url_generado_pago.

Body (JSON)

CampoTipoReq.
pq_idint
us_idint
anombre_destring
Respuesta 200
{
  "status":  "success",
  "data": {
    "cp_id":             15,
    "cp_code":           "DR80V0Z6GC",
    "pq_id":             1,
    "cp_est":            0,
    "cp_fecha":          "2026-05-13 10:30:00",
    "anombre_de":        "Juan Pérez",
    "url_generado_pago": "MTc0MjM5Nj..."
  }
}
GET /api/mis_ordenes.php Órdenes del usuario agrupadas por código
🔒 Requiere token

Devuelve las órdenes del usuario agrupadas por cp_code. Incluye URLs de descarga por producto según el tipo de orden.

Tipos de orden y descarga

TipoNombreDescargable
1Orden Médica✔ url_orden
2Cita de Evaluación— sin URL
3Certificado Médico— sin URL
4Paquete✔ url_paquetes[]
5Programas✔ url_orden
6Inyecciones— sin URL
Respuesta — tipo 1 ó 5 200
{
  "success": true,
  "data": [{
    "cp_code":          "DR80V0Z6GC",
    "cp_id":            "15",
    "cp_fecha":         "05/13/2026",
    "cp_est":           1,
    "pq_precio_total":  75.00,
    "productos": [{
      "pq_titulo":       "Orden Médica General",
      "pq_tipo_orden":   "1",
      "descargable":     true,
      "url_orden":       "https://doctorrecetas.host/pdf/..."
    }]
  }]
}
Respuesta — tipo 4 Paquete 200
{
  "productos": [{
    "pq_tipo_orden": "4",
    "descargable":   true,
    "url_paquetes": [
      { "titulo":"Labs Básicos",  "url":"https://..." },
      { "titulo":"Consulta",      "url":"https://..." }
    ]
  }]
}
GET /api/todas_las_ordenes.php Todas las órdenes del sistema (admin)
🔒 Requiere token

Devuelve todas las órdenes del sistema. Solo usuarios con rol de administrador pueden acceder.

Parámetros opcionales

ParamTipoDescripción
limitintDefault: 100
offsetintDefault: 0
fecha_desdedateYYYY-MM-DD
fecha_hastadateYYYY-MM-DD
estadoint1 = pagado · 0 = pendiente
Respuesta 200
{
  "success": true,
  "data": [
    {
      "cp_code":      "DR80V0Z6GC",
      "us_nombres":   "Juan Pérez",
      "cp_fecha":     "2026-05-13",
      "cp_est":       1,
      "total_pagado": 75.00
    }
  ],
  "total_registros": 150
}
GET /api/perfil.php Perfil del usuario autenticado
🔒 Requiere token

Devuelve la información del perfil del usuario.

Respuesta 200
{
  "success": true,
  "data": {
    "us_id":          123,
    "us_nombres":     "Juan Pérez",
    "us_email":       "juan@ejemplo.com",
    "us_telefono":    "787-123-4567",
    "us_direccion":   "123 Main St",
    "us_ciudad":      "San Juan",
    "us_code_postal": "00901"
  }
}
POST /api/actualizar_perfil.php Actualizar perfil con soporte de archivos
🔒 Requiere token multipart/form-data
CampoTipoReq.
us_nombresstring
us_telefonostring
us_paisstring
us_direccionstring
us_ciudadstring
us_fech_nacdate
us_code_postalstring
num_idstring
num_id_tipostring
archivofile
Imagen: JPEG/PNG · máx. 5MB
Respuesta 200
{
  "success": true,
  "data": {
    "mensaje":    "Perfil actualizado exitosamente",
    "usuario": {
      "us_id":      123,
      "us_nombres": "Juan Pérez Updated",
      "archivo_url":"https://doctorrecetas.com/upload/..."
    }
  }
}
GET /api/ver_uploads.php Ver archivos subidos del usuario
🔒 Requiere token

Devuelve los datos del usuario y la información del archivo de identificación subido.

Respuesta 200
{
  "success": true,
  "data": {
    "usuario": {
      "us_id":      123,
      "num_id":     "123456789",
      "num_id_tipo":"Licencia"
    },
    "archivo": {
      "url":    "https://doctorrecetas.com/upload/...",
      "existe": true,
      "tamano_legible":"240.11 KB"
    }
  }
}
GET /api/categorias_principales.php Categorías principales de productos

Devuelve las categorías principales activas del catálogo.

Respuesta 200
{
  "success": true,
  "data": [
    {
      "ct_id":          1,
      "ct_nombre":      "Certificados Médicos",
      "ct_descripcion": "Certificados para trabajo, escuela",
      "ct_activo":      1
    }
  ]
}
GET /api/lista_categorias.php Listado con subcategorías

Devuelve todas las categorías con sus subcategorías anidadas.

Respuesta 200
{
  "success": true,
  "data": [{
    "ct_id":      1,
    "ct_nombre":  "Certificados Médicos",
    "subcategorias": [{
      "sc_id":     10,
      "sc_nombre": "Certificado de Trabajo",
      "sc_precio": 29.99
    }]
  }]
}
GET /api/obtener_productos.php Productos filtrados por categoría

Query params opcionales

ParamTipoDescripción
ct_idintID de categoría
activoint1 = activos · 0 = inactivos
Respuesta 200
{
  "success": true,
  "data": [{
    "pq_id":             1,
    "pq_nombre":         "Certificado Médico",
    "pq_precio":         29.99,
    "ct_nombre":         "Certificados Médicos",
    "pq_tiempo_entrega": "24 horas"
  }]
}
GET /api/productos_todos.php Todos los productos del catálogo

Devuelve el catálogo completo de productos sin filtros.

Respuesta 200
{
  "success": true,
  "data": [ { "pq_id": 1, ... }, ... ]
}
GET /api/estados.php Listado de estados / países

Devuelve los estados y países disponibles para selección de dirección.

Respuesta 200
{
  "success": true,
  "data": [
    { "es_id":1, "es_nombre":"Puerto Rico",    "es_codigo":"PR" },
    { "es_id":2, "es_nombre":"Estados Unidos", "es_codigo":"US" }
  ]
}
GET /api/pueblos.php Pueblos / ciudades por estado

Query params opcionales

ParamTipoDescripción
es_idintID del estado para filtrar
Respuesta 200
{
  "success": true,
  "data": [
    { "pl_id":1,  "pl_nomb":"San Juan", "pl_code_postal":"00901" },
    { "pl_id":2,  "pl_nomb":"Bayamón",  "pl_code_postal":"00956" }
  ]
}
POST /api/chat-ana.php Chat con asistente virtual Ana (Gemini AI)

Interactúa con la asistente virtual Ana, impulsada por Google Gemini AI. Especializada en consultas sobre los servicios de DoctorRecetas.

Body (JSON)

CampoTipoReq.Descripción
mensajestringPregunta del usuario
historialarrayMensajes previos del chat
Ejemplo de petición
POST /api/chat-ana.php
Content-Type: application/json

{
  "mensaje":   "¿Qué servicios médicos ofrecen?",
  "historial": []
}
Respuesta 200
{
  "success": true,
  "data": {
    "respuesta":  "Ofrecemos certificados médicos, recetas...",
    "timestamp":  "2026-05-13 10:30:00"
  }
}