Compare commits

..

No commits in common. "89065c9db6a783b91bd30ab97561b2aab52e3eb8" and "311efcae62205571182c5e86f12efa6c0a77086b" have entirely different histories.

34 changed files with 1191 additions and 6743 deletions

View File

@ -1,129 +0,0 @@
---
title: "PNG, WebP or SVG? Choosing the Right Format for Your QR Code"
description: "Technical comparison between PNG, WebP and SVG for QR codes via API. Learn which format to use depending on your use case: email, printing, web or apps."
keywords: "qr code png, qr code webp, qr code svg, qr code image format, api qr code format"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# PNG, WebP or SVG? Choosing the Right Format for Your QR Code
The QRRapido API supports three output formats: `png`, `webp` and `svg`. Each has distinct characteristics that impact file size, quality and compatibility. Use the `outputFormat` parameter in the request to choose.
```json
{
"content": "https://yoursite.com",
"type": "url",
"outputFormat": "webp"
}
```
---
## Quick Summary
| Format | Size | Lossless scaling | Compatibility | Ideal for |
|---|---|---|---|---|
| **PNG** | Medium | No (raster) | Universal | Printing, email, legacy |
| **WebP** | Small (~30% smaller) | No (raster) | Modern browsers | Web, apps, APIs |
| **SVG** | Variable (usually smaller) | **Yes** | Browsers, Adobe, Figma | Logos, banners, vector printing |
---
## PNG — The Universal Standard
PNG is a lossless raster format, ideal for QR codes because it preserves 100% of the black and white pixels without introducing artifacts.
**When to use:**
- Sending by email (legacy email clients don't support WebP)
- Integration with legacy systems
- When maximum compatibility is a priority
**Why not JPEG?**
> JPEG uses lossy compression that introduces blur artifacts on the edges of QR code modules. This can make the code unreadable, especially at smaller sizes. **Never use JPEG for QR codes.**
```json
{ "outputFormat": "png" }
```
---
## WebP — Recommended for Web and Apps
WebP is the ideal format for most modern integrations. Visual quality is indistinguishable from PNG for QR codes, with **2535% smaller file size**.
**Advantages:**
- Faster loading on web pages
- Lower bandwidth usage in APIs with high volume
- Native support in all modern browsers (Chrome, Safari 14+, Firefox, Edge)
- Lower storage consumption in buckets (S3, GCS, etc.)
**When to use:**
- Display in `<img>` on websites and web applications
- iOS/Android apps (both support WebP)
- When you store the generated QR codes
```json
{ "outputFormat": "webp" }
```
To display in HTML:
```html
<picture>
<source srcset="data:image/webp;base64,{{ qrCodeBase64 }}" type="image/webp">
<img src="data:image/png;base64,{{ fallbackBase64 }}" alt="QR Code">
</picture>
```
---
## SVG — For Lossless Scaling
SVG is a vector format: the QR code is described mathematically, not as pixels. This means it can be resized to any size — from a 16px icon to a 3-meter banner — without loss of quality.
**When to use:**
- Graphic materials (banners, posters, packaging, merchandise)
- Integration with design tools (Figma, Illustrator, Canva)
- High-quality printing without depending on resolution
**Caution:**
- Do not use SVG for email sending (most email clients block SVG for security reasons)
- Some older QR readers may have difficulty with SVG rendered directly via `<img>`
```json
{ "outputFormat": "svg" }
```
To display SVG inline, the `qrCodeBase64` must be decoded first:
```js
const svgString = atob(qrCodeBase64);
document.getElementById('qr').innerHTML = svgString;
```
---
## Size Comparison (real example — 400px, simple URL)
| Format | Typical size |
|---|---|
| PNG | ~812 KB |
| WebP | ~58 KB |
| SVG | ~36 KB |
> Sizes vary depending on content complexity (QR codes with more data have more modules).
---
## Recommendation by Use Case
| Scenario | Recommended format |
|---|---|
| Display on website/app | **WebP** |
| Send by email | **PNG** |
| Graphic printing / design | **SVG** |
| Store in cloud | **WebP** |
| Maximum compatibility | **PNG** |
| No concern about size | **PNG** |

View File

@ -1,129 +0,0 @@
---
title: "PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR"
description: "Comparativa técnica entre PNG, WebP y SVG para códigos QR vía API. Conoce cuál formato usar según tu caso de uso: e-mail, impresión, web o apps."
keywords: "qr code png, qr code webp, qr code svg, formato imagen qr code, api qr code formato"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR
La API QRRapido soporta tres formatos de salida: `png`, `webp` y `svg`. Cada uno tiene características distintas que impactan el tamaño del archivo, la calidad y la compatibilidad. Usa el parámetro `outputFormat` en la solicitud para elegir.
```json
{
"content": "https://tuempresa.com",
"type": "url",
"outputFormat": "webp"
}
```
---
## Resumen Rápido
| Formato | Tamaño | Escala sin pérdida | Compatibilidad | Ideal para |
|---|---|---|---|---|
| **PNG** | Medio | No (raster) | Universal | Impresión, e-mail, sistemas legados |
| **WebP** | Pequeño (~30% menor) | No (raster) | Browsers modernos | Web, apps, APIs |
| **SVG** | Variable (generalmente menor) | **Sí** | Browsers, Adobe, Figma | Logos, banners, impresión vectorial |
---
## PNG — El Estándar Universal
PNG es un formato raster sin pérdida, ideal para códigos QR porque preserva 100% de los píxeles blancos y negros sin introducir artefactos.
**Cuándo usarlo:**
- Envío por e-mail (clientes de correo antiguos no soportan WebP)
- Integración con sistemas legados
- Cuando la compatibilidad máxima es prioridad
**¿Por qué no JPEG?**
> JPEG usa compresión con pérdida que introduce artefactos de borrosidad en los bordes de los módulos del código QR. Eso puede volverlo ilegible, especialmente en tamaños pequeños. **Nunca uses JPEG para códigos QR.**
```json
{ "outputFormat": "png" }
```
---
## WebP — Recomendado para Web y Apps
WebP es el formato ideal para la mayoría de las integraciones modernas. La calidad visual es indistinguible del PNG para códigos QR, con **2535% menos tamaño de archivo**.
**Ventajas:**
- Carga más rápida en páginas web
- Menor uso de ancho de banda en APIs con alto volumen
- Soporte nativo en todos los browsers modernos (Chrome, Safari 14+, Firefox, Edge)
- Menor consumo de almacenamiento en la nube (S3, GCS, etc.)
**Cuándo usarlo:**
- Visualización en `<img>` en sitios y aplicaciones web
- Apps iOS/Android (ambos soportan WebP)
- Cuando guardas los QR generados
```json
{ "outputFormat": "webp" }
```
Para mostrar en HTML:
```html
<picture>
<source srcset="data:image/webp;base64,{{ qrCodeBase64 }}" type="image/webp">
<img src="data:image/png;base64,{{ fallbackBase64 }}" alt="Código QR">
</picture>
```
---
## SVG — Para Escalar sin Pérdida
SVG es un formato vectorial: el código QR se describe matemáticamente, no como píxeles. Eso significa que se puede redimensionar a cualquier tamaño — desde un ícono de 16px hasta un banner de 3 metros — sin perder calidad.
**Cuándo usarlo:**
- Material gráfico (banners, carteles, packaging, camisetas)
- Integración con herramientas de diseño (Figma, Illustrator, Canva)
- Impresión de alta calidad sin depender de la resolución
**Atención:**
- No uses SVG para envío por e-mail (la mayoría de los clientes bloquea SVG por seguridad)
- Algunos lectores de QR antiguos pueden tener dificultad con SVG renderizado directamente vía `<img>`
```json
{ "outputFormat": "svg" }
```
Para mostrar SVG inline, el `qrCodeBase64` debe decodificarse primero:
```js
const svgString = atob(qrCodeBase64);
document.getElementById('qr').innerHTML = svgString;
```
---
## Comparativa de Tamaño (ejemplo real — 400px, URL simple)
| Formato | Tamaño típico |
|---|---|
| PNG | ~812 KB |
| WebP | ~58 KB |
| SVG | ~36 KB |
> Los tamaños varían según la complejidad del contenido (los QR con más datos tienen más módulos).
---
## Recomendación por Caso de Uso
| Escenario | Formato recomendado |
|---|---|
| Mostrar en sitio/app | **WebP** |
| Enviar por e-mail | **PNG** |
| Impresión gráfica / diseño | **SVG** |
| Guardar en la nube | **WebP** |
| Máxima compatibilidad | **PNG** |
| Sin preocupación por tamaño | **PNG** |

View File

@ -1,186 +0,0 @@
---
title: "How to Generate QR Codes via API: All Supported Types"
description: "Complete guide to generating QR codes via REST API using each available type: URL, Pix, Wi-Fi, vCard, WhatsApp, SMS, email and free text."
keywords: "api qr code, generate qr code api, qr code rest api, qrrapido api, qr code types"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# How to Generate QR Codes via API: All Supported Types
The QRRapido API supports 8 QR code types. All use the same endpoint — the only difference is the `type` field and the specific fields that make up the `content`.
## Endpoint
```
POST /api/v1/QRManager/generate
X-API-Key: your_key_here
Content-Type: application/json
```
## Base Request Structure
```json
{
"content": "...",
"type": "url",
"size": 400,
"primaryColor": "#000000",
"backgroundColor": "#FFFFFF",
"outputFormat": "png"
}
```
| Field | Type | Default | Description |
|---|---|---|---|
| `content` | string | required | QR code content |
| `type` | string | `"url"` | QR code type (see below) |
| `size` | int | `300` | Size in pixels (1002000) |
| `primaryColor` | string | `"#000000"` | Module color (hex) |
| `backgroundColor` | string | `"#FFFFFF"` | Background color (hex) |
| `outputFormat` | string | `"png"` | Format: `png`, `webp`, `svg` |
---
## Type `url` — Link / URL
The simplest: any valid URL.
```json
{
"type": "url",
"content": "https://yoursite.com/product/123"
}
```
> Use `https://` whenever possible. QR codes with HTTP may be blocked by some modern readers.
---
## Type `pix` — Pix Payment
The `content` must be the **Pix key** of the recipient. The generation produces a static Pix QR code (without connection to the Central Bank — see the dedicated Pix tutorial).
```json
{
"type": "pix",
"content": "contact@yourcompany.com"
}
```
Accepted keys: CPF/CNPJ (digits only), email, phone in `+5511999999999` format, or random key (UUID).
---
## Type `wifi` — Wi-Fi Network
The `content` uses the standard `WIFI:` format:
```json
{
"type": "wifi",
"content": "WIFI:S:NetworkName;T:WPA;P:NetworkPassword;;"
}
```
| Parameter | Meaning | Values |
|---|---|---|
| `S:` | SSID (network name) | text |
| `T:` | Security type | `WPA`, `WEP`, `nopass` |
| `P:` | Password | text |
| `H:` | Hidden network (optional) | `true` / `false` |
---
## Type `vcard` — Business Card
The `content` must be a complete vCard v3:
```json
{
"type": "vcard",
"content": "BEGIN:VCARD\nVERSION:3.0\nFN:John Smith\nORG:Company Inc\nTEL:+15559876543\nEMAIL:john@company.com\nURL:https://company.com\nEND:VCARD"
}
```
---
## Type `whatsapp` — WhatsApp Link
```json
{
"type": "whatsapp",
"content": "https://wa.me/15559876543?text=Hi%2C%20I%27d%20like%20to%20know%20more"
}
```
The number must include country code and area code, without spaces or symbols. The `text` parameter is optional.
---
## Type `email` — Email with subject and body
```json
{
"type": "email",
"content": "mailto:contact@company.com?subject=Subject&body=Initial%20message"
}
```
---
## Type `sms` — Pre-filled SMS
```json
{
"type": "sms",
"content": "sms:+15559876543?body=Hi%2C%20I%20want%20more%20information"
}
```
---
## Type `texto` — Free Text
Any string up to 2048 characters:
```json
{
"type": "texto",
"content": "Table 12 — Priority service available at the main counter."
}
```
---
## Success Response
```json
{
"success": true,
"qrCodeBase64": "iVBORw0KGgo...",
"qrId": "abc123",
"generationTimeMs": 180,
"remainingCredits": 42,
"fromCache": false,
"format": "png",
"mimeType": "image/png"
}
```
To display the image directly in HTML:
```html
<img src="data:image/png;base64,{{ qrCodeBase64 }}" alt="QR Code" />
```
---
## General Tips
- **Colors**: maintain high contrast between `primaryColor` and `backgroundColor`. Avoid yellow on white or light gray on white.
- **Minimum printed size**: use `size` ≥ 400 for printing. For digital use (screens), 300 is sufficient.
- **Cache**: identical requests return `fromCache: true` without consuming additional credit.
- **Rate limit**: the `X-RateLimit-Remaining` and `X-Quota-Remaining` headers in the response indicate your current balance.

View File

@ -1,186 +0,0 @@
---
title: "Cómo Generar Códigos QR por la API: Todos los Tipos"
description: "Guía completa para generar códigos QR vía API REST usando cada tipo disponible: URL, Pix, Wi-Fi, vCard, WhatsApp, SMS, e-mail y texto libre."
keywords: "api qr code, generar qr code api, qr code rest api, qrrapido api, tipos qr code"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# Cómo Generar Códigos QR por la API: Todos los Tipos
La API QRRapido soporta 8 tipos de código QR. Todos usan el mismo endpoint — lo que cambia es el campo `type` y los campos específicos que forman el `content`.
## Endpoint
```
POST /api/v1/QRManager/generate
X-API-Key: tu_clave_aqui
Content-Type: application/json
```
## Estructura Base de la Solicitud
```json
{
"content": "...",
"type": "url",
"size": 400,
"primaryColor": "#000000",
"backgroundColor": "#FFFFFF",
"outputFormat": "png"
}
```
| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
| `content` | string | obligatorio | Contenido del QR |
| `type` | string | `"url"` | Tipo de QR (ver abajo) |
| `size` | int | `300` | Tamaño en píxeles (1002000) |
| `primaryColor` | string | `"#000000"` | Color de los módulos (hex) |
| `backgroundColor` | string | `"#FFFFFF"` | Color de fondo (hex) |
| `outputFormat` | string | `"png"` | Formato: `png`, `webp`, `svg` |
---
## Tipo `url` — Link / URL
El más simple: cualquier URL válida.
```json
{
"type": "url",
"content": "https://tuempresa.com/producto/123"
}
```
> Usa `https://` siempre que sea posible. Los QR con HTTP pueden ser bloqueados por algunos lectores modernos.
---
## Tipo `pix` — Pago Pix
El `content` debe ser la **clave Pix** del receptor. La generación produce un QR de Pix estático (sin conexión con el Banco Central — consulta el tutorial dedicado sobre Pix).
```json
{
"type": "pix",
"content": "contacto@tuempresa.com.br"
}
```
Claves aceptadas: CPF/CNPJ (solo dígitos), e-mail, teléfono en formato `+5511999999999`, o clave aleatoria (UUID).
---
## Tipo `wifi` — Red Wi-Fi
El `content` usa el formato estándar `WIFI:`:
```json
{
"type": "wifi",
"content": "WIFI:S:NombreDeRed;T:WPA;P:ContraseñaDeRed;;"
}
```
| Parámetro | Significado | Valores |
|---|---|---|
| `S:` | SSID (nombre de la red) | texto |
| `T:` | Tipo de seguridad | `WPA`, `WEP`, `nopass` |
| `P:` | Contraseña | texto |
| `H:` | Red oculta (opcional) | `true` / `false` |
---
## Tipo `vcard` — Tarjeta de Visita
El `content` debe ser un vCard v3 completo:
```json
{
"type": "vcard",
"content": "BEGIN:VCARD\nVERSION:3.0\nFN:Juan Pérez\nORG:Empresa SRL\nTEL:+5491199999999\nEMAIL:juan@empresa.com\nURL:https://empresa.com\nEND:VCARD"
}
```
---
## Tipo `whatsapp` — Link para WhatsApp
```json
{
"type": "whatsapp",
"content": "https://wa.me/5491199999999?text=¡Hola!%20Quisiera%20más%20información"
}
```
El número debe incluir código de país y área, sin espacios ni símbolos. El parámetro `text` es opcional.
---
## Tipo `email` — E-mail con asunto y cuerpo
```json
{
"type": "email",
"content": "mailto:contacto@empresa.com?subject=Consulta&body=¡Hola!%20Quisiera%20saber%20más"
}
```
---
## Tipo `sms` — SMS pre-cargado
```json
{
"type": "sms",
"content": "sms:+5491199999999?body=¡Hola!%20Quiero%20más%20información"
}
```
---
## Tipo `texto` — Texto Libre
Cualquier string de hasta 2048 caracteres:
```json
{
"type": "texto",
"content": "Mesa 5 — Atención preferencial disponible en el mostrador central."
}
```
---
## Respuesta Exitosa
```json
{
"success": true,
"qrCodeBase64": "iVBORw0KGgo...",
"qrId": "abc123",
"generationTimeMs": 180,
"remainingCredits": 42,
"fromCache": false,
"format": "png",
"mimeType": "image/png"
}
```
Para mostrar la imagen directamente en HTML:
```html
<img src="data:image/png;base64,{{ qrCodeBase64 }}" alt="Código QR" />
```
---
## Consejos Generales
- **Colores**: mantén alto contraste entre `primaryColor` y `backgroundColor`. Evita amarillo sobre blanco o gris claro sobre blanco.
- **Tamaño mínimo impreso**: usa `size` ≥ 400 para impresiones. Para uso digital, 300 es suficiente.
- **Caché**: solicitudes idénticas devuelven `fromCache: true` sin consumir crédito adicional.
- **Rate limit**: los headers `X-RateLimit-Remaining` y `X-Quota-Remaining` en la respuesta indican tu saldo actual.

View File

@ -1,142 +0,0 @@
---
title: "Static Pix QR Code: How It Works and Developer Responsibilities"
description: "Understand what a static Pix QR Code is, how it is generated by the API, its limitations, and why payment verification is your application's responsibility — not QRRapido's."
keywords: "pix qr code, static pix, pix qr code api, pix qr code integration, pix without central bank"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# Static Pix QR Code: How It Works and Developer Responsibilities
## What is a Static Pix QR Code?
Pix has two types of QR codes: **static** and **dynamic**.
| | Static Pix | Dynamic Pix |
|---|---|---|
| Amount | Variable (payer decides) | Fixed (set by recipient) |
| Generation | Any system | PSP/Central Bank intermediary |
| Central Bank registration | **No** | Yes |
| Payment notification | **No** | Yes (webhook) |
| Typical use | Donations, simple charges | E-commerce, tracked billing |
The QRRapido API generates **exclusively static Pix QR codes**. This is deliberate and sufficient for most use cases.
---
## How the API Generates the Pix QR Code
When you send a request with `type: "pix"`, the API assembles a string in the **EMV® QR Code** standard (the international standard adopted by Brazil's Central Bank) and generates the image:
```json
{
"type": "pix",
"content": "contact@yourcompany.com"
}
```
The `content` field must contain **only the Pix key** of the recipient. The API handles assembling the EMV payload correctly.
**Accepted keys:**
- Email: `contact@company.com`
- CPF/CNPJ: digits only — `12345678901` or `12345678000195`
- Phone: `+5511999999999`
- Random key (EVP): `123e4567-e89b-12d3-a456-426614174000`
---
## What the API Does NOT Do (and Why This Matters)
> **QRRapido has no integration with the Central Bank, any bank, or any PSP (Payment Service Provider).**
This means:
1. **The API does not know if the payment was made.** It only generates the QR code image. What happens after — whether the customer scanned it, whether the Pix was sent, whether it landed in the right account — is outside the scope of the API.
2. **There is no payment confirmation webhook.** The API does not send notifications when a Pix is received.
3. **The QR code does not expire automatically.** A static Pix QR code is valid indefinitely (or until the Pix key is removed by the recipient at the bank).
4. **There is no transaction traceability.** Two requests with the same key generate the same QR code (with cache). It is not possible to associate a scan with a specific transaction via the API.
---
## Your Application's Responsibility
If you use the API to generate Pix QR codes in a payment flow, **it is your application's responsibility to verify receipt**. The correct ways to do this are:
### Option 1 — Recipient's Bank Pix API
Connect directly to the Pix API of the bank where the key is registered. Most banks offer:
- Query of received charges
- Real-time notification webhook (when the bank supports it)
### Option 2 — PSP / Payment Gateway
Use an intermediary such as Mercado Pago, PagSeguro, Efí Bank, Asaas, etc. They offer dynamic Pix with full control: fixed amount, expiration, webhooks and unique identification per charge.
### Option 3 — Manual Verification
For low volumes or informal contexts (donations, in-person sales), the person responsible for receiving verifies the bank statement manually.
---
## Recommended Flow (with confirmation)
```
Your App QRRapido API Recipient's Bank
| | |
|-- POST /generate (pix) -->| |
|<-- qrCodeBase64 ----------| |
| | |
|-- Shows QR to customer | |
| | |
|-- Query payment ---------------------------------->|
|<-- Received status or not --------------------------|
| | |
|-- Releases product/service| |
```
---
## Complete Request Example
```bash
curl -X POST https://qrrapido.site/api/v1/QRManager/generate \
-H "X-API-Key: your_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "contact@yourcompany.com",
"type": "pix",
"size": 400,
"outputFormat": "webp"
}'
```
---
## Appropriate Use Cases for Static Pix via API
- Donation QR code on an institutional website
- Digital menu with key for in-person payment
- Batch QR generation for printed materials (flyers, cards)
- Applications where the seller and buyer interact in person and the seller confirms receipt in the bank app
## Use Cases That Require Dynamic Pix (not supported by this API)
- E-commerce with automatic order confirmation
- Fixed-amount billing with expiration
- Invoice issuance linked to payment
- Automated financial reconciliation
---
## Summary
| What the API does | What the API does NOT do |
|---|---|
| Generates the Pix QR code image | Verifies if the payment was made |
| Formats the EMV payload correctly | Sends confirmation webhook |
| Delivers PNG, WebP or SVG | Communicates with the Central Bank or banks |
| Works with any valid Pix key | Guarantees the key belongs to who claims it does |
Correct QR code generation is the API's responsibility. **Payment confirmation is your application's responsibility.**

View File

@ -1,142 +0,0 @@
---
title: "Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador"
description: "Entiende qué es el QR Pix estático, cómo lo genera la API, sus limitaciones y por qué la verificación del pago es responsabilidad de tu aplicación — no de QRRapido."
keywords: "qr code pix, pix estatico, qr code pix api, integración pix qr code, pix sin bacen"
author: "QRRapido"
date: 2026-03-08
lastmod: 2026-03-08
image: ""
---
# Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador
## ¿Qué es un Código QR Pix Estático?
El Pix tiene dos tipos de QR: **estático** y **dinámico**.
| | Pix Estático | Pix Dinámico |
|---|---|---|
| Valor | Variable (lo decide el pagador) | Fijo (definido por el receptor) |
| Generación | Cualquier sistema | Intermediario PSP/BACEN |
| Registro en BACEN | **No** | Sí |
| Notificación de pago | **No** | Sí (webhook) |
| Uso típico | Donaciones, cobros simples | E-commerce, cobro con control |
La API QRRapido genera **exclusivamente QR Pix estático**. Eso es intencional y suficiente para la mayoría de los casos de uso.
---
## Cómo la API Genera el QR Pix
Al enviar una solicitud con `type: "pix"`, la API arma un string en el estándar **EMV® QR Code** (estándar internacional adoptado por el Banco Central de Brasil) y genera la imagen:
```json
{
"type": "pix",
"content": "contacto@tuempresa.com.br"
}
```
El campo `content` debe contener **solo la clave Pix** del receptor. La API se encarga de armar el payload EMV correctamente.
**Claves aceptadas:**
- E-mail: `contacto@empresa.com.br`
- CPF/CNPJ: solo dígitos — `12345678901` o `12345678000195`
- Teléfono: `+5511999999999`
- Clave aleatoria (EVP): `123e4567-e89b-12d3-a456-426614174000`
---
## Lo que la API NO hace (y por qué eso importa)
> **QRRapido no tiene integración con el Banco Central, con ningún banco ni PSP (Proveedor de Servicio de Pago).**
Eso significa:
1. **La API no sabe si el pago fue realizado.** Solo genera la imagen del QR. Lo que pasa después — si el cliente escaneó, si el Pix fue enviado, si llegó a la cuenta correcta — está fuera del alcance de la API.
2. **No hay webhook de confirmación de pago.** La API no envía notificaciones cuando se recibe un Pix.
3. **El QR no expira automáticamente.** Un QR Pix estático es válido indefinidamente (o hasta que la clave Pix sea eliminada por el receptor en su banco).
4. **No hay rastreabilidad de transacción.** Dos solicitudes con la misma clave generan el mismo QR (con caché). No es posible asociar un escaneo a una transacción específica vía API.
---
## Responsabilidad de Tu Aplicación
Si usas la API para generar QR Pix en un flujo de pago, **es responsabilidad de tu aplicación verificar el cobro**. Las formas correctas de hacerlo son:
### Opción 1 — API Pix del Banco del Receptor
Conéctate directamente a la API Pix del banco donde está registrada la clave. La mayoría de los bancos ofrece:
- Consulta de cobros recibidos
- Webhook de notificación en tiempo real (cuando el banco lo soporta)
### Opción 2 — PSP / Gateway de Pago
Usa un intermediario como Mercado Pago, PagSeguro, Efí Bank, Asaas, etc. Ofrecen Pix dinámico con control completo: valor fijo, expiración, webhooks e identificación única por cobro.
### Opción 3 — Verificación Manual
Para volúmenes bajos o contextos informales (donaciones, ventas presenciales), el responsable del cobro verifica el extracto bancario manualmente.
---
## Flujo Recomendado (con confirmación)
```
Tu App API QRRapido Banco del Receptor
| | |
|-- POST /generate (pix) -->| |
|<-- qrCodeBase64 ----------| |
| | |
|-- Muestra QR al cliente | |
| | |
|-- Consulta pago ---------------------------------->|
|<-- Estado recibido o no ----------------------------|
| | |
|-- Libera producto/servicio| |
```
---
## Ejemplo de Solicitud Completa
```bash
curl -X POST https://qrrapido.site/api/v1/QRManager/generate \
-H "X-API-Key: tu_clave_aqui" \
-H "Content-Type: application/json" \
-d '{
"content": "contacto@tuempresa.com.br",
"type": "pix",
"size": 400,
"outputFormat": "webp"
}'
```
---
## Casos de Uso Adecuados para Pix Estático vía API
- QR de donación en sitio institucional
- Menú digital con clave para pago presencial
- Generación de QR en lote para materiales impresos (flyers, tarjetas)
- Aplicaciones donde el vendedor y comprador interactúan presencialmente y el vendedor confirma el cobro en la app del banco
## Casos de Uso que Requieren Pix Dinámico (no cubiertos por esta API)
- E-commerce con confirmación automática del pedido
- Cobro con valor fijo y expiración
- Emisión de factura vinculada al pago
- Conciliación financiera automatizada
---
## Resumen
| Lo que la API hace | Lo que la API NO hace |
|---|---|
| Genera la imagen del QR Pix | Verifica si el pago fue hecho |
| Formatea el payload EMV correctamente | Envía webhook de confirmación |
| Entrega PNG, WebP o SVG | Se comunica con el BACEN o bancos |
| Funciona con cualquier clave Pix válida | Garantiza que la clave pertenece a quien dice |
La generación correcta del QR es responsabilidad de la API. La **confirmación del pago es responsabilidad de tu aplicación** — y eso queda claro desde el principio.

View File

@ -1,108 +0,0 @@
---
title: "Cómo Crear Código QR para WhatsApp"
description: "Aprende a crear un código QR para WhatsApp que permite a los usuarios iniciar una conversación contigo instantáneamente"
keywords: "codigo qr whatsapp, whatsapp codigo qr, qr para whatsapp, crear qr whatsapp"
author: "QR Rapido"
date: 2025-10-08
lastmod: 2025-10-08
image: "/images/tutoriais/whatsapp-qr-hero.jpg"
---
# Cómo Crear Código QR para WhatsApp
Crear un **código QR para WhatsApp** es una de las formas más eficientes de facilitar el contacto directo con tus clientes, amigos o seguidores. Con un simple escaneo, cualquier persona puede iniciar una conversación contigo instantáneamente, sin necesidad de guardar tu número.
## 📱 ¿Por qué usar código QR para WhatsApp?
Los códigos QR para WhatsApp son extremadamente útiles para:
- **Empresas**: Facilitar la atención al cliente
- **Freelancers**: Agilizar el contacto con potenciales clientes
- **Eventos**: Permitir networking rápido
- **Marketing**: Aumentar la conversión en campañas
## 🎯 Paso a Paso
### 1. Prepara tu número
Primero, necesitas tener tu número en formato internacional:
```
+1 555 123-4567
```
Elimina todos los espacios y guiones, quedando:
```
15551234567
```
### 2. Crea la URL de WhatsApp
La URL de WhatsApp sigue este patrón:
```
https://wa.me/15551234567
```
Puedes agregar un mensaje predefinido:
```
https://wa.me/15551234567?text=¡Hola!%20Quisiera%20más%20información
```
### 3. Genera el código QR
Accede a [QR Rapido](https://qrrapido.site) y:
1. Selecciona el tipo **URL**
2. Pega la URL de WhatsApp
3. Personaliza los colores (opcional)
4. Haz clic en **Generar Código QR**
5. Descarga en alta calidad
## 💡 Consejos Profesionales
### Personaliza el Mensaje Inicial
Configura un mensaje de bienvenida automático para mejorar la experiencia:
```
https://wa.me/15551234567?text=¡Hola!%20Vine%20a%20través%20de%20tu%20código%20QR
```
### Úsalo en Materiales Impresos
- **Tarjetas de visita**: Facilita el contacto instantáneo
- **Folletos**: Aumenta el engagement
- **Embalajes**: Ofrece soporte directo al cliente
- **Banners**: En eventos y ferias
### Monitorea los Resultados
Para rastrear cuántas personas escanearon tu código QR, considera usar un acortador de URL con analytics antes de generar el QR.
## ⚠️ Cuidados Importantes
1. **Prueba antes de imprimir**: Siempre escanea para verificar que funciona
2. **Tamaño mínimo**: Mantén al menos 3x3 cm para fácil lectura
3. **Contraste adecuado**: Usa colores que contrasten bien (negro sobre blanco es ideal)
4. **Mensaje claro**: Indica para qué sirve el código QR
## 🚀 Ventajas de usar QR Rapido
- ⚡ **Ultra rápido**: Genera en menos de 1 segundo
- 🎨 **Personalizable**: Elige colores y estilos
- 📥 **Alta calidad**: Descarga en PNG, SVG y PDF
- 🔒 **Seguro**: Tus datos no son almacenados
- 💯 **Gratis**: 10 códigos QR por día
## Conclusión
Crear un código QR para WhatsApp es simple y puede revolucionar la forma en que te comunicas con tu público. Con QR Rapido, tienes todo lo que necesitas para crear códigos QR profesionales en segundos.
**¿Listo para empezar?** [Crea tu código QR ahora →](https://qrrapido.site/es)
---
*¿Tienes dudas? [Contáctanos](https://qrrapido.site/es/Contact)!*

View File

@ -1,271 +0,0 @@
---
title: "Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos"
description: "Aprende a crear código QR WiFi gratuito en pocos clics. Comparte la contraseña de tu red sin escribir con nuestro generador rápido y seguro."
keywords: "codigo qr wifi, crear codigo qr wifi, generador qr wifi gratis, qr wifi, compartir contraseña wifi, codigo qr red wifi, como hacer qr wifi"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-wifi-hero.jpg"
---
# Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos
¿Cansado de escribir contraseñas largas y complicadas cada vez que un visitante pide el WiFi? Con un **Código QR WiFi**, puedes compartir tu red instantáneamente. En este tutorial completo, aprenderás a crear un código QR para WiFi gratuitamente en menos de 2 minutos.
## ¿Por Qué Usar Código QR para WiFi?
Compartir tu red WiFi mediante código QR ofrece varias ventajas:
- **Practicidad**: Los visitantes se conectan instantáneamente sin escribir contraseñas
- **Seguridad**: No necesitas decir la contraseña en voz alta o anotarla
- **Profesionalismo**: Ideal para empresas, cafeterías, restaurantes y consultorios
- **Ahorro de tiempo**: Elimina errores de escritura y pedidos repetidos
- **Compatibilidad**: Funciona en prácticamente todos los smartphones modernos
## Paso a Paso: Cómo Crear tu Código QR WiFi
### Paso 1: Selecciona el Tipo de Código QR
Accede al generador y elige la opción **WiFi** en la lista de tipos de códigos QR disponibles.
**[INSERTAR IMAGEN 1 AQUÍ: Pantalla de selección de tipo de código QR con WiFi destacado]**
En el menú desplegable encontrarás varias opciones como URL/Link, Texto Simple, Tarjeta de Visita, SMS y Email. Para este tutorial, selecciona **WiFi**.
### Paso 2: Completa los Datos de tu Red WiFi
Ahora necesitas informar los datos de tu red. Ve los campos obligatorios:
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de creación de código QR WiFi con campos completados]**
#### NetworkName (Nombre de la Red) *
Escribe exactamente el nombre de tu red WiFi (SSID). Por ejemplo: "NombreDeTuRed"
**Consejo importante**: El nombre debe ser idéntico al que aparece cuando buscas redes WiFi en el celular. ¡Respeta mayúsculas y minúsculas!
#### SecurityType (Tipo de Seguridad)
Selecciona el tipo de encriptación de tu red:
- **Red WPA (la más común)**: WPA/WPA2/WPA3 - recomendado y más seguro
- **WEP (muy antiguo)**: No recomendado por ser inseguro
- **Sin contraseña**: Para redes públicas sin protección
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario WiFi completado con "Rede-do-meu-comercio"]**
#### NetworkPassword (Contraseña de la Red) *
Introduce la contraseña de tu red WiFi. Usa el ícono de ojo para visualizar y verificar que escribiste correctamente.
**Importante**: La contraseña también distingue mayúsculas de minúsculas. ¡Verifica con atención!
#### HiddenNetwork (Red Oculta)
Marca esta opción solo si tu red está configurada como oculta (no aparece en la lista de redes disponibles).
### Paso 3: Personaliza tu Código QR (Opcional)
¡Dale a tu código QR la identidad de tu negocio!
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización avanzada]**
#### Opciones de Personalización:
**Color Principal**: Elige el color de los cuadrados del código QR (predeterminado: azul)
**Color de Fondo**: Define el color de fondo (predeterminado: blanco)
**Tamaño**: Selecciona entre:
- Pequeño (200px) - Para uso digital
- Mediano (300px) - Recomendado para impresión
- Grande (500px) - Para banners y pósters
**Margen**:
- Compacto - Ocupa menos espacio
- Normal - Recomendado (mejor lectura)
- Amplio - Para impresiones grandes
**Consejo de diseño**: Mantén buen contraste entre el color principal y el fondo para garantizar que todos los celulares puedan leer el código.
### Paso 4: Generar y Descargar
Haz clic en el botón azul **"⚡ Generar Código QR Rápidamente"** y ¡listo! Tu código QR WiFi será generado instantáneamente.
Puedes:
- Descargar la imagen en alta calidad
- Imprimir y colocar en lugares visibles
- Compartir digitalmente
- Guardar para usar después
## Cómo tus Visitantes Usarán el Código QR WiFi
¡Es muy simple! Tus visitantes solo necesitan:
1. Abrir la cámara del celular (iOS o Android)
2. Apuntar al código QR
3. Tocar la notificación que aparece
4. Conectarse automáticamente al WiFi
**¡No necesitas descargar aplicaciones!** La mayoría de los smartphones desde 2018 ya tienen lectores de códigos QR integrados en la cámara.
## Dónde Usar tu Código QR WiFi
### Para Empresas
- Recepción de oficinas
- Salas de reuniones
- Áreas de espera
- Espacios de coworking
### Para Comercios
- Mesas de restaurantes
- Mostradores de cafeterías
- Tiendas y boutiques
- Salones de belleza
### Para Residencias
- Cuadro de entrada
- Área de parrilla
- Heladera (para fiestas)
- Home office
### Para Eventos
- Credenciales de eventos
- Stands de ferias
- Conferencias
- Bodas y fiestas
## Consejos de Seguridad
⚠️ **Importante**: Considera crear una red WiFi separada para visitantes (red guest) si deseas:
- Proteger tus dispositivos personales
- Limitar velocidad para invitados
- Tener control sobre quién accede
- Mantener tu red principal privada
Muchos routers modernos permiten crear redes guest fácilmente en las configuraciones.
## Preguntas Frecuentes (FAQ)
### ¿El Código QR WiFi expira?
¡No! El código QR funciona indefinidamente mientras los datos de la red (nombre y contraseña) permanezcan iguales.
### ¿Funciona en iPhone y Android?
¡Sí! Funciona en prácticamente todos los smartphones fabricados después de 2018 que tienen cámara.
### ¿Puedo crear para red 5GHz?
¡Sí! El proceso es exactamente el mismo. Solo usa el nombre correcto de la red 5GHz.
### ¿Es seguro?
¡Sí! El código QR solo facilita la escritura de los datos. Es tan seguro como informar la contraseña verbalmente o por escrito.
### ¿Puedo editar después de creado?
No es posible editar el código QR después de generado. Si cambias la contraseña del WiFi, necesitarás generar un nuevo código QR.
### ¿Cuántas personas pueden usar el mismo código QR?
¡Ilimitadas! No hay límite de usos para el código QR.
## Casos de Uso Reales
### Restaurantes y Cafeterías
Muchos negocios gastronómicos están adoptando códigos QR WiFi. Los clientes aprecian poder conectarse sin interrumpir al personal. Coloca el código QR en:
- Carteles en las mesas
- Menús impresos
- Pared cerca de la caja
### Consultorios Médicos
Los pacientes en la sala de espera pueden conectarse fácilmente mientras aguardan. Esto mejora la experiencia y reduce el estrés de la espera.
### Oficinas y Coworking
Facilita el acceso de clientes, proveedores y visitantes sin comprometer la seguridad de tu red principal. Ideal para espacios colaborativos.
### Hoteles y Hospedajes
Proporciona códigos QR en las habitaciones para que los huéspedes se conecten inmediatamente al llegar.
## Errores Comunes a Evitar
### ❌ Error 1: Nombre de Red Incorrecto
Verifica que escribiste exactamente el SSID de tu red. Un error común es confundir la red 2.4GHz con la 5GHz.
### ❌ Error 2: Contraseña con Espacios
Si tu contraseña tiene espacios, inclúyelos exactamente como están configurados en el router.
### ❌ Error 3: Tipo de Seguridad Incorrecto
Asegúrate de seleccionar el tipo correcto (WPA, WEP o sin contraseña). Si no estás seguro, verifica en la configuración de tu router.
### ❌ Error 4: QR Code Muy Pequeño
Para impresión, usa tamaño mediano (300px) o grande (500px). Los códigos pequeños pueden ser difíciles de escanear.
### ❌ Error 5: Bajo Contraste
Evita combinaciones de colores como amarillo sobre blanco o gris claro sobre gris. El contraste es esencial para la lectura correcta.
## Mejores Prácticas para Imprimir
Si vas a imprimir tu código QR WiFi, sigue estas recomendaciones:
### Material Recomendado
- **Papel fotográfico**: Para mejor calidad y durabilidad
- **Laminado**: Protege contra humedad y suciedad
- **Acrílico**: Solución premium para negocios
- **Vinilo adhesivo**: Fácil de colocar en paredes y superficies
### Tamaño de Impresión
- **Mínimo**: 5x5 cm para lectura cercana
- **Recomendado**: 10x10 cm para lectura a 30-50 cm de distancia
- **Grande**: 15x15 cm o más para lectura a mayor distancia
### Ubicación Estratégica
- A la altura de los ojos (1.40m - 1.60m)
- Bien iluminado
- Sin reflejos o brillos
- Fácilmente visible desde donde la gente se sienta o espera
## Tips para Negocios
### Agrega un Texto Atractivo
No solo coloques el código QR. Agrega texto como:
- "WiFi Gratis - Escanea y Conecta"
- "Internet Rápido - Solo Escanea"
- "Conéctate fácil con un clic"
### Diseño Personalizado
Usa los colores de tu marca en el código QR para mantener la coherencia visual con tu negocio.
### Múltiples Ubicaciones
En locales grandes, coloca varios códigos QR en diferentes puntos para facilitar el acceso.
### Actualización Periódica
Por seguridad, considera cambiar la contraseña WiFi cada 3-6 meses y generar un nuevo código QR.
## Conclusión
Crear un código QR WiFi es rápido, fácil y completamente gratuito en QR Rapido. En menos de 2 minutos puedes:
✅ Generar tu código QR personalizado
✅ Compartir tu red sin esfuerzo
✅ Proporcionar mejor experiencia a los visitantes
✅ Demostrar profesionalismo
**Prueba ahora mismo**: [Crear mi Código QR WiFi Gratis](/)
---
**¿Te gustó este tutorial?** ¡Comparte con amigos que también quieren facilitar el acceso a la red WiFi! Explora también nuestros otros tipos de códigos QR para diferentes necesidades.
## Otros Tutoriales Útiles
- Cómo crear código QR para WhatsApp
- Código QR para Tarjeta de Visita Digital
- Cómo crear código QR para URLs y Links
- Personalización avanzada de códigos QR
**¡Crea ahora tu código QR WiFi gratuito y transforma la experiencia de tus visitantes!** 🚀📱
---
## Soporte Técnico
¿Tienes problemas para crear tu código QR WiFi? Contáctanos:
- **Email**: soporte@qrrapido.site
- **WhatsApp**: [Agregar número]
- **Horario**: Lunes a Viernes, 8:00 - 18:00
¡Estamos aquí para ayudarte a crear el código QR perfecto para tu negocio o hogar!

View File

@ -1,89 +0,0 @@
---
title: "How to Create a Static PIX QR Code"
description: "Learn how to create a static PIX QR Code to receive instant payments easily and securely. Complete guide with QR Rapido."
keywords: "pix qr code, generate pix qr code, static pix, create payment qr code, pix qr code free, pix qr code no fee"
author: "QR Rapido"
date: 2026-01-24
lastmod: 2026-01-24
image: "/images/tutoriais/pix-qr-hero.jpg"
---
# How to Create a Static PIX QR Code: The Complete Guide
**PIX** revolutionized the way payments are made in Brazil. And for those who sell products or receive donations, the **PIX QR Code** is an essential tool. In this tutorial, you will learn how to generate a **Static PIX QR Code** for free using **QR Rapido**, ensuring speed and security in your transactions.
## 💸 What is a Static PIX QR Code?
The PIX Static QR Code is ideal for those who want to receive multiple payments of the same amount or varying amounts using a single code. It always "points" to the same bank account (your PIX key) and can contain additional information such as the recipient's name and city.
**Main advantages:**
- **Does not expire:** Use the same code indefinitely.
- **No fees:** Generation is free and does not depend on intermediaries (gateways).
- **Versatile:** Can have a fixed value set or leave the amount open for the payer to fill in.
- **Ideal for:** Merchants, freelancers, donations, crowdfunding and service providers.
## 🎯 Step by Step to Generate on QR Rapido
**QR Rapido** now has a native and secure tool to generate your PIX code. Follow the steps:
### 1. Access the Generator
Open [QR Rapido](https://qrrapido.site) and in the QR Code type menu, select the **"💸 PIX"** option.
### 2. Fill in the Required Data
For the code to work at any bank, the Central Bank standard requires three pieces of information:
- **PIX Key:** Can be your CPF, CNPJ, Email, Phone or Random Key.
- **Beneficiary Name:** Your name or your company's name (must be the same as on the bank account).
- **City:** The city where the account was opened or where you reside.
> **⚠️ Note:** Fill in the data exactly as registered at your bank to avoid errors during payment.
### 3. Set Amount and Description (Optional)
- **Amount:** If you sell a product with a fixed price (e.g., "Coffee $3.00"), fill in the amount field. If it's a donation or variable payment, leave it blank so the customer can enter the amount.
- **Transaction ID (TxID):** An optional code to help you identify the payment in your statement (e.g., "ORDER01"). If not filled, the system will use the default `***`.
- **Description:** A message that may appear on the payer's confirmation screen (e.g., "Service Payment").
### 4. Generate and Customize
Click **"Generate QR Code"**. You can customize the color and style (rounded corners, for example) to match your brand, but remember: **Keep high contrast** (preferably black on white) to ensure any phone can read it.
### 5. Download
Download the image in **PNG** for use on social media or **PDF/SVG** to print in high quality on signs and posters.
## 🏪 Tip for Merchants and Sellers
If you sell **many different products** and want to speed up payment at the checkout or on shelves, QR Rapido has the ideal solution:
> **Subscribe to our Monthly Plan!**
> With the Premium plan, you can create and manage an **exclusive QR Code for each product** in your catalog. That way, the customer scans the specific product's code and the correct amount is already filled in, avoiding errors and speeding up the sale. [Learn more about the Premium plan](/Pagamento/SelecaoPlano).
## 💡 Professional Tips for Your PIX
### Print with Quality
If you're going to place the QR Code on your store counter, print it at a readable size (at least 2" x 2"). Protect the paper with lamination or use an acrylic display.
### Test Before Distributing
Before printing 1000 flyers or posting on Instagram, do a real test! Open your bank app, read the generated QR Code and transfer a symbolic amount to make sure the data is correct and the money goes to the right account.
### Security
QR Rapido generates the code directly in your browser. We do **not** have access to your bank account and do **not** intermediate the money. The payment goes directly from the customer to your account.
## 🚀 Why use QR Rapido for PIX?
- **EMVCo Compliance:** We use the official international standard, guaranteeing compatibility with all major banking apps.
- **Privacy:** Your sensitive data is not stored.
- **Speed:** Generate your code in seconds, without lengthy registrations.
## Conclusion
Having a PIX QR Code on hand speeds up service and conveys professionalism. With **QR Rapido**, you create yours for free, customize it and start receiving payments right away.
**Ready to receive payments?** [Generate your PIX QR Code now →](https://qrrapido.site)
---
*Questions about generation? [Contact us](https://qrrapido.site/en/Contact) or check our FAQ.*

View File

@ -1,108 +0,0 @@
---
title: "How to Create a QR Code for WhatsApp"
description: "Learn how to create a WhatsApp QR Code that allows users to instantly start a conversation with you"
keywords: "whatsapp qr code, qr code for whatsapp, create whatsapp qr code, whatsapp qr"
author: "QR Rapido"
date: 2025-10-08
lastmod: 2025-10-08
image: "/images/tutoriais/whatsapp-qr-hero.jpg"
---
# How to Create a QR Code for WhatsApp
Creating a **WhatsApp QR Code** is one of the most efficient ways to facilitate direct contact with your customers, friends or followers. With a simple scan, anyone can instantly start a conversation with you without needing to save your number.
## 📱 Why use a QR Code for WhatsApp?
WhatsApp QR Codes are extremely useful for:
- **Businesses**: Facilitating customer service
- **Freelancers**: Speeding up contact with potential clients
- **Events**: Enabling quick networking
- **Marketing**: Increasing conversion in campaigns
## 🎯 Step by Step
### 1. Prepare your number
First, you need to have your number in international format:
```
1 555 987-6543
```
Remove all spaces and dashes:
```
15559876543
```
### 2. Create the WhatsApp URL
The WhatsApp URL follows this pattern:
```
https://wa.me/15559876543
```
You can add a pre-defined message:
```
https://wa.me/15559876543?text=Hi!%20I%20would%20like%20more%20information
```
### 3. Generate the QR Code
Access [QR Rapido](https://qrrapido.site) and:
1. Select the **URL** type
2. Paste the WhatsApp URL
3. Customize the colors (optional)
4. Click **Generate QR Code**
5. Download in high quality
## 💡 Professional Tips
### Customize the Initial Message
Set up an automatic welcome message to improve the experience:
```
https://wa.me/15559876543?text=Hi!%20I%20found%20you%20through%20your%20QR%20Code
```
### Use on Printed Materials
- **Business cards**: Make instant contact easy
- **Flyers and leaflets**: Increase engagement
- **Packaging**: Offer direct customer support
- **Banners**: At events and trade shows
### Monitor the Results
To track how many people scanned your QR Code, consider using a URL shortener with analytics before generating the QR Code.
## ⚠️ Important Cautions
1. **Test before printing**: Always scan to verify it works
2. **Minimum size**: Keep at least 1.2" x 1.2" for easy reading
3. **Adequate contrast**: Use colors that contrast well (black on white is ideal)
4. **Clear message**: Indicate what the QR Code is for
## 🚀 Advantages of using QR Rapido
- ⚡ **Ultra-fast**: Generate in less than 1 second
- 🎨 **Customizable**: Choose colors and styles
- 📥 **High quality**: Download in PNG, SVG and PDF
- 🔒 **Secure**: Your data is not stored
- 💯 **Free**: up to 50 QR codes per day after login
## Conclusion
Creating a QR Code for WhatsApp is simple and can revolutionize the way you communicate with your audience. With QR Rapido, you have everything you need to create professional QR Codes in seconds.
**Ready to start?** [Create your QR Code now →](https://qrrapido.site/en)
---
*Have questions? [Contact us](https://qrrapido.site/en/Contact)!*

View File

@ -1,179 +0,0 @@
---
title: "How to Create a Free WiFi QR Code: Share Your Network in Seconds"
description: "Learn how to create a free WiFi QR Code in a few clicks. Share your network password without typing with our fast and secure generator."
keywords: "wifi qr code, create wifi qr code, free wifi qr code generator, wifi network qr code, share wifi password, free wifi qr code, how to make wifi qr code"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-wifi-hero.jpg"
---
# How to Create a Free WiFi QR Code: Share Your Network in Seconds
Tired of typing long and complicated passwords every time a guest asks for your WiFi password? With a **WiFi QR Code**, you can share your network instantly! In this complete tutorial, you'll learn how to create a WiFi QR Code for free in less than 2 minutes.
## Why Use a QR Code for WiFi?
Sharing your WiFi network through a QR Code offers several advantages:
- **Convenience**: Guests connect instantly without typing passwords
- **Security**: No need to say the password out loud or write it down
- **Professionalism**: Ideal for businesses, cafes, restaurants and offices
- **Time saving**: Eliminates typing errors and repeated requests
- **Compatibility**: Works on virtually all modern smartphones
## Step by Step: How to Create Your WiFi QR Code
### Step 1: Select the QR Code Type
Access the generator and choose the **WiFi** option from the list of available QR Code types.
In the dropdown menu, you'll find various options like URL/Link, Plain Text, Business Card, SMS and Email. For this tutorial, select **WiFi**.
### Step 2: Fill in Your WiFi Network Details
Now you need to enter your network details. See the required fields:
#### NetworkName (Network Name) *
Type exactly the name of your WiFi network (SSID). For example: "YourNetworkName"
**Important tip**: The name must be identical to what appears when you search for WiFi networks on your phone. It is case-sensitive!
#### SecurityType (Security Type)
Select the encryption type of your network:
- **WPA Network (most common)**: WPA/WPA2/WPA3 - recommended and most secure
- **WEP (very old)**: Not recommended as it is insecure
- **No password**: For public networks without protection
#### NetworkPassword (Network Password) *
Enter your WiFi network password. Use the eye icon to view and verify you typed it correctly.
**Important**: The password is also case-sensitive. Check it carefully!
#### HiddenNetwork (Hidden Network)
Check this option only if your network is configured as hidden (does not appear in the list of available networks).
### Step 3: Customize Your QR Code (Optional)
Give your QR Code your business's look!
#### Customization Options:
**Primary Color**: Choose the color of the QR Code squares (default: black)
**Background Color**: Set the background color (default: white)
**Size**: Choose from:
- Small (200px) - For digital use
- Medium (300px) - Recommended for printing
- Large (500px) - For banners and posters
**Margin**:
- Compact - Takes up less space
- Normal - Recommended (better readability)
- Wide - For large prints
**Design tip**: Maintain good contrast between the primary color and background to ensure all phones can read the code.
### Step 4: Generate and Download
Click the **"⚡ Generate QR Code Quickly"** button and you're done! Your WiFi QR Code will be generated instantly.
You can:
- Download the image in high quality
- Print and place in visible locations
- Share digitally
- Save to use later
## How Your Guests Will Use the WiFi QR Code
It's very simple! Your guests just need to:
1. Open the phone camera (iOS or Android)
2. Point at the QR Code
3. Tap the notification that appears
4. Connect automatically to the WiFi
**No app download needed!** Most smartphones since 2018 already have built-in QR Code readers in the camera.
## Where to Use Your WiFi QR Code
### For Businesses
- Office reception areas
- Meeting rooms
- Waiting areas
- Coworking spaces
### For Retail
- Restaurant tables
- Café counters
- Stores and boutiques
- Beauty salons
### For Homes
- Entry hallway
- Barbecue area
- Refrigerator (for parties)
- Home office
### For Events
- Event credentials
- Trade show booths
- Conferences
- Weddings and parties
## Security Tips
⚠️ **Important**: Consider creating a separate WiFi network for guests (guest network) if you want to:
- Protect your personal devices
- Limit speed for guests
- Have control over who accesses your network
- Keep your main network private
Many modern routers allow you to easily create guest networks in the settings.
## Frequently Asked Questions (FAQ)
### Does the WiFi QR Code expire?
No! The QR Code works indefinitely as long as the network data (name and password) remains the same.
### Does it work on iPhone and Android?
Yes! It works on virtually all smartphones made after 2018 that have a camera.
### Can I create one for a 5GHz network?
Yes! The process is exactly the same. Just use the correct 5GHz network name.
### Is it safe?
Yes! The QR Code simply makes it easier to enter the data. It is just as safe as sharing the password verbally or in writing.
### Can I edit it after it's created?
You cannot edit the QR Code after it's generated. If you change your WiFi password, you'll need to generate a new QR Code.
### How many people can use the same QR Code?
Unlimited! There is no usage limit for the QR Code.
## Conclusion
Creating a WiFi QR Code is quick, easy and completely free at QR Rapido! In less than 2 minutes you can:
✅ Generate your custom QR Code
✅ Share your network effortlessly
✅ Provide a better experience for guests
✅ Demonstrate professionalism
**Try it now**: [Create my Free WiFi QR Code](/)
---
**Liked this tutorial?** Share it with friends who also want to make WiFi access easier! Also explore our other QR Code types for different needs.
## Other Useful Tutorials
- How to create a QR Code for WhatsApp
- QR Code for Digital Business Cards
- How to create a QR Code for URLs and Links
- Advanced QR Code customization
**Create your free WiFi QR Code now and transform your guests' experience!** 🚀📱

View File

@ -1,598 +0,0 @@
---
title: "Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes"
description: "Descubre cómo usar código QR en etiquetas adhesivas, carteles y volantes inmobiliarios. Aumenta tus ventas con tecnología gratuita y profesional."
keywords: "codigo qr corredor inmuebles, etiqueta corredor inmobiliaria, qr inmobiliaria, etiquetas adhesivas corredores, divulgar corredor propiedades, qr cartel se vende"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-corretor-imoveis-hero.jpg"
---
# Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes
Si eres corredor de inmuebles, sabes que **captar leads calificados** es esencial para cerrar negocios. Imagina transformar tus carteles de "Se Vende", volantes y etiquetas adhesivas en herramientas interactivas que conectan clientes directamente a tu WhatsApp, ficha del inmueble o tarjeta de visita digital - todo esto **gratuitamente** con códigos QR.
En esta guía completa, aprenderás a crear y aplicar códigos QR profesionales en materiales inmobiliarios, aumentando tus conversiones y destacándote de la competencia.
## ¿Por Qué los Corredores de Inmuebles Deben Usar Códigos QR?
### **Ventajas Comprobadas**
- ✅ **Captación 24/7**: Tu cartel trabaja para ti incluso cuando estás durmiendo
- ✅ **Contacto Instantáneo**: Cliente escanea y ya está en tu WhatsApp
- ✅ **Cero Escritura**: Elimina errores al anotar números
- ✅ **Rastreo**: Sabe cuántas personas se interesaron
- ✅ **Profesionalismo**: Demuestra modernidad e innovación
- ✅ **Costo Cero**: Genera códigos QR ilimitados gratuitamente
- ✅ **Tour Virtual**: Lleva al cliente dentro del inmueble virtualmente
### **Estadísticas del Mercado**
Según estudios del sector inmobiliario:
- **78%** de los compradores investigan propiedades por celular
- **65%** prefieren contacto vía WhatsApp en lugar de llamada
- **43%** escanean códigos QR en carteles de inmuebles cuando los ven
- Corredores que usan código QR tienen **35% más leads** mensuales
---
## Dónde Aplicar Códigos QR en Marketing Inmobiliario
### **1. Carteles de "Se Vende" y "Se Alquila"**
**¡El uso más poderoso!** El cartel al frente del inmueble es visto por cientos de personas diariamente.
**Qué colocar en el código QR:**
- Link directo a tu WhatsApp
- vCard con tus contactos completos
- Tour virtual 360° del inmueble
- Ficha técnica detallada (PDF)
- Video del inmueble en YouTube
**Consejo profesional**: Coloca texto llamativo como:
- "Escanea y agenda tu visita AHORA"
- "Tour Virtual - Apunta tu cámara aquí"
- "WhatsApp Directo del Corredor"
### **2. Etiquetas Adhesivas y Tags**
Etiquetas pequeñas (5x5cm hasta 10x10cm) son perfectas para:
**Aplicaciones:**
- Pegar en autos de la inmobiliaria
- Fijar en portones de inmuebles
- Aplicar en vitrinas de locales
- Distribuir en establecimientos asociados
- Colocar en ascensores de edificios
**Ventajas:**
- Bajo costo de impresión
- Fácil distribución masiva
- Pueden ser cambiadas rápidamente
- Óptimas para acciones promocionales
### **3. Volantes y Flyers**
¡Transforma volantes de papel en herramientas digitales!
**Dónde aplicar:**
- Esquina superior derecha (lugar de mayor atención)
- Centro, si es el foco principal
- Reverso, con llamada destacada
**Contenido recomendado:**
- Portafolio digital de inmuebles
- Formulario de registro
- Calculadora de financiamiento
- Lista completa de propiedades disponibles
### **4. Folders y Revistas Inmobiliarias**
Materiales impresos premium merecen códigos QR estratégicos.
**Uso ideal:**
- 1 QR por inmueble destacado
- QR en la portada para portafolio completo
- QR en la contraportada con tus contactos
- QR en cada página con más información
### **5. Tarjetas de Visita**
¡El clásico nunca pasa de moda, pero puede ser mejorado!
**Código QR en la tarjeta permite:**
- Guardar contacto automáticamente (vCard)
- Ver portafolio online
- Agendar reunión directo en la agenda
- Enviar mensaje vía WhatsApp
### **6. Firma de Email**
¡Cada email que envías es una oportunidad!
**Incluye código QR para:**
- Tu vCard completo
- Último lanzamiento inmobiliario
- Evaluación gratuita de inmueble
- Agendamiento de visitas
---
## Paso a Paso: Cómo Crear Código QR para Corredores
Voy a mostrar cómo crear **3 tipos de códigos QR** esenciales para corredores:
### **Tipo 1: Código QR de vCard (Tarjeta de Visita Digital)**
Perfecto para: Tarjetas de visita, firma de email, credenciales
**[INSERTAR IMAGEN 1 AQUÍ: Selección del tipo de código QR - vCard destacado]**
#### Paso 1: Selecciona "Tarjeta de Visita"
Accede al generador y elige la opción **Tarjeta de Visita** en el menú de tipos.
#### Paso 2: Completa tus Datos Profesionales
**Información obligatoria:**
- **Nombre completo**: Juan Silva
- **Cargo**: Corredor de Inmuebles - Matrícula 12345
- **Empresa**: Inmobiliaria Success
- **Teléfono**: +1 555 123-4567
- **Email**: juan.silva@inmuebles.com
- **Website**: www.juansilva.inmuebles.com
**Campos opcionales estratégicos:**
- WhatsApp Business
- Instagram profesional
- LinkedIn
- Canal de YouTube con tours virtuales
#### Paso 3: Genera y Descarga
Haz clic en **"Generar Código QR"** y descarga en alta resolución.
**Dónde usar este QR:**
- Etiquetas adhesivas en el auto
- Tarjetas de visita
- Firma de email
- Credencial profesional
---
### **Tipo 2: Código QR para WhatsApp Directo**
Perfecto para: Carteles de inmuebles, volantes, anuncios
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de WhatsApp con código QR completado]**
#### Paso 1: Selecciona "WhatsApp"
En el generador, elige la opción **WhatsApp** (o SMS si prefieres).
#### Paso 2: Configura el Mensaje Pre-llenado
**Ejemplo de mensaje eficaz:**
```
¡Hola! Vi el cartel del inmueble en [CALLE/BARRIO] y me gustaría agendar una visita. ¿Puede pasarme más información?
```
**Por qué el mensaje pre-llenado funciona:**
- Cliente no necesita pensar qué escribir
- Ya sabes de qué inmueble está hablando
- Aumenta en 80% la tasa de conversión
#### Paso 3: Personaliza para Cada Inmueble
**Consejo importante**: ¡Crea códigos QR diferentes para cada inmueble!
Ejemplo para apartamento en Recoleta:
```
¡Hola! Vi el cartel del Departamento 3 dormitorios en Recoleta (Ref: DEPT-001). Me gustaría saber más detalles y agendar visita.
```
**Ventaja**: ¡Ya sabes exactamente qué inmueble quiere ver el cliente!
---
### **Tipo 3: Código QR para URL (Tour Virtual / Ficha Técnica)**
Perfecto para: Inmuebles de alto estándar, lanzamientos, propiedades rurales
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario URL completado]**
#### Paso 1: Prepara el Contenido Digital
Antes de crear el QR, necesitas tener:
**Opción A - Tour Virtual:**
- Video en YouTube del inmueble
- Tour 360° (Google Street View, Matterport)
- Galería de fotos en Instagram/Facebook
**Opción B - Landing Page:**
- Ficha técnica completa del inmueble
- Fotos en alta resolución
- Mapa de ubicación
- Calculadora de financiamiento
- Formulario de interés
#### Paso 2: Acorta la URL (¡Importante!)
Usa acortadores como:
- bit.ly
- tinyurl.com
- QR Rapido (si tiene función de acortamiento)
**Ejemplo:**
- ❌ URL larga: `https://www.miinmobiliaria.com/inmuebles/departamento-3-dormitorios-recoleta-ref-dept001?utm_source=cartel`
- ✅ URL corta: `bit.ly/dept-recoleta-001`
**Ventaja de URL corta**: Genera código QR más simple y fácil de escanear
#### Paso 3: Crea el Código QR
Pega la URL corta en el campo **URL/Link** y genera el código.
---
## Cómo Personalizar tu Código QR Profesionalmente
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización con colores personalizados]**
### **Elección de Colores Estratégicos**
**Para Inmobiliarias Tradicionales:**
- Azul marino + Blanco (confianza, seriedad)
- Negro + Dorado (lujo, exclusividad)
- Verde oscuro + Blanco (crecimiento, estabilidad)
**Para Inmobiliarias Modernas:**
- Naranja + Blanco (energía, innovación)
- Púrpura + Blanco (creatividad, diferenciación)
- Rojo + Blanco (urgencia, acción)
**Regla de oro**: ¡Siempre mantén alto contraste entre color principal y fondo!
### **Tamaños Recomendados por Aplicación**
**Carteles de calle (distancia 2-5 metros):**
- Código QR: 15x15cm o mayor
- Resolución: 500px mínimo
**Volantes A5/A4:**
- Código QR: 4x4cm a 6x6cm
- Resolución: 300px
**Etiquetas adhesivas:**
- Código QR: 5x5cm (tamaño del adhesivo)
- Resolución: 300px
**Tarjetas de visita:**
- Código QR: 2,5x2,5cm
- Resolución: 200px
### **Agrega Llamadas a la Acción (CTA)**
¡Nunca coloques solo el código QR! Agrega texto atractivo:
**Ejemplos eficaces:**
- 📱 "Apunta la cámara y habla conmigo en WhatsApp"
- 🏠 "Tour Virtual 360° - Escanea Aquí"
- 💬 "Agenda tu Visita Ahora"
- 📋 "Ve Fotos y Detalles Completos"
- 🎯 "Guarda Mi Contacto Automáticamente"
---
## Estrategias Avanzadas para Corredores
### **1. Códigos QR Rastreables (Dinámicos)**
Usa servicios de código QR dinámico para:
- Saber cuántas personas escanearon
- Ver horario de los escaneos
- Identificar ubicación aproximada
- Cambiar el destino sin reimprimir
**Cuándo usar:**
- Campañas con muchos materiales impresos
- Pruebas A/B de diferentes enfoques
- Carteles permanentes en inmuebles
### **2. Múltiples Códigos QR en el Mismo Cartel**
¿Cartel grande? ¡Usa 2-3 códigos QR diferentes!
**Ejemplo de cartel completo:**
- **QR 1** (arriba): "Habla en WhatsApp"
- **QR 2** (centro): "Tour Virtual 360°"
- **QR 3** (abajo): "Guarda Mi Contacto"
**Ventaja**: Cliente elige la acción que prefiere hacer
### **3. Código QR + Realidad Aumentada**
Para lanzamientos y emprendimientos:
- Código QR lleva a app de RA
- Cliente apunta celular y ve el edificio terminado
- Visualiza departamento decorado
- ¡Extremadamente impactante!
### **4. Campañas de Temporada**
Crea códigos QR específicos para:
- **Enero**: "Planifica este año - Compra tu inmueble"
- **Junio**: "Vacaciones en tu Nuevo Hogar"
- **Noviembre**: "Black Friday Inmobiliaria"
- **Diciembre**: "Empieza el Año en Casa Propia"
### **5. Alianzas Estratégicas**
Distribuye etiquetas con código QR en:
- Tiendas de materiales de construcción
- Oficinas de arquitectura
- Gestorías y escribanías
- Gimnasios y restaurantes del barrio
- Edificios comerciales (tablero de avisos)
---
## Modelos de Etiquetas Adhesivas Profesionales
### **Modelo 1: Etiqueta Minimalista (5x5cm)**
```
┌─────────────────┐
│ [CÓDIGO QR] │
│ │
│ Juan Silva │
│ Matrícula 12345 │
│ (555) 123-4567 │
└─────────────────┘
```
### **Modelo 2: Etiqueta con Destaque (7x7cm)**
```
┌─────────────────────┐
│ VENDE TU INMUEBLE │
│ SIN BUROCRACIA │
│ │
│ [CÓDIGO QR] │
│ │
│ "Escanea y habla │
│ directo conmigo" │
│ │
│ Juan Silva │
│ Corredor Mat. XXXX │
└─────────────────────┘
```
### **Modelo 3: Etiqueta Tour Virtual (10x10cm)**
```
┌───────────────────────────┐
│ TOUR VIRTUAL 360° │
│ Visita este inmueble │
│ ¡sin salir del sofá! │
│ │
│ [CÓDIGO QR GRANDE] │
│ │
│ 📱 Apunta tu cámara │
│ │
│ Inmobiliaria Success │
│ (555) 123-4567 │
└───────────────────────────┘
```
---
## Mejores Prácticas de Impresión
### **Materiales Recomendados**
**Para carteles externos:**
- **Vinilo adhesivo resistente a UV**
- **Lona con impresión UV**
- **ACM (Aluminio Compuesto)**
Duración: 2-3 años expuestos al sol
**Para etiquetas adhesivas:**
- **Papel BOPP (Polipropileno)**
- **Vinilo blanco brillante**
- **Papel couché con laminación**
Duración: 6-12 meses
**Para volantes:**
- **Couché 115g o 150g**
- **Barniz localizado en el código QR** (destaque)
### **Pruebas Antes de Imprimir en Masa**
⚠️ **SIEMPRE haz esto:**
1. Imprime 1 muestra en tamaño real
2. Prueba con 5 celulares diferentes
3. Prueba a diferentes distancias
4. Prueba con poca luz
5. Solo entonces imprime grandes cantidades
**Celulares para probar:**
- iPhone (iOS actualizado)
- Samsung (Android)
- Xiaomi o Motorola (Android popular)
### **Dónde Imprimir**
**Imprentas rápidas locales:**
- Etiquetas adhesivas: consulta precios en tu zona
- Volantes A5: consulta precios en tu zona
**Online (más económico):**
- Marketplaces locales
- Imprentas con pedido online
**Consejo**: ¡Pide presupuesto en 3 lugares diferentes!
---
## Errores Comunes que Corredores Deben Evitar
### ❌ **Error 1: Código QR Muy Pequeño**
**Problema**: En carteles de calle vistos de lejos, QR pequeño no funciona
**Solución**: Mínimo 15x15cm para carteles externos
### ❌ **Error 2: Colores con Bajo Contraste**
**Problema**: QR amarillo en fondo blanco no escanea
**Solución**: Usa siempre colores oscuros en fondo claro (o viceversa)
### ❌ **Error 3: No Probar Antes de Imprimir**
**Problema**: Imprime 1000 volantes y descubre que QR no funciona
**Solución**: Siempre prueba impresión piloto
### ❌ **Error 4: URL Rota o Temporal**
**Problema**: Link del inmueble expira, QR queda inútil
**Solución**: Usa URLs permanentes o QR dinámico editable
### ❌ **Error 5: Sin Instrucción de Uso**
**Problema**: Persona mayor no sabe qué hacer con el QR
**Solución**: Agrega "Apunta la cámara del celular aquí"
### ❌ **Error 6: Código QR Único para Todos los Inmuebles**
**Problema**: No sabes qué inmueble generó el lead
**Solución**: Crea QR específico para cada propiedad
### ❌ **Error 7: Material de Baja Calidad**
**Problema**: Etiqueta se desvanece en 1 mes al sol
**Solución**: Invierte en material UV resistente
---
## Casos de Éxito
### **Caso 1: Corredor en zona urbana**
**Estrategia**: Colocó código QR en todos los 12 carteles de inmuebles
**Resultado:**
- 98 escaneos en el primer mes
- 28 conversaciones en WhatsApp
- 7 visitas agendadas
- 2 ventas cerradas
**ROI**: Invirtió en etiquetas, facturó comisiones significativas
### **Caso 2: Inmobiliaria en ciudad grande**
**Estrategia**: Volantes con QR para tour virtual de lanzamiento
**Resultado:**
- 3.000 volantes distribuidos
- 645 accesos al tour virtual
- 112 registros de interesados
- 18 departamentos vendidos en preventa
### **Caso 3: Corredor Autónomo**
**Estrategia**: Etiquetas adhesivas en establecimientos asociados
**Resultado:**
- 150 etiquetas distribuidas en 30 locales
- 52 nuevos contactos en 3 meses
- 9 evaluaciones de inmuebles agendadas
- 2 captaciones exclusivas
---
## Preguntas Frecuentes
### **¿Necesito pagar para crear código QR?**
¡No! En QR Rapido creas códigos QR ilimitados gratuitamente. Solo pagas si quieres recursos premium como rastreo avanzado.
### **¿El código QR funciona para siempre?**
Códigos QR estáticos (gratuitos) funcionan para siempre, pero no pueden ser editados. Códigos QR dinámicos (pagos) pueden ser editados incluso después de impresos.
### **¿Qué tipo de QR usar en carteles de inmuebles?**
Recomiendo **WhatsApp** con mensaje pre-llenado. Así el cliente ya inicia la conversación sabiendo de qué inmueble se trata.
### **¿Puedo colocar logo de la inmobiliaria en el QR?**
Sí, ¡pero con cuidado! Logos muy grandes pueden dificultar la lectura. Mantén el logo pequeño (máximo 20% del QR).
### **¿Cuántas personas escanean QR en carteles?**
Según investigaciones, entre 5-15% de las personas que ven el cartel escanean el QR. En áreas movimentadas, esto puede generar decenas de leads por mes.
### **¿El código QR funciona de noche?**
Sí, siempre que haya alguna iluminación (poste de calle, luz de la pantalla del celular ya ayuda). Para mejor resultado, ilumina el cartel.
### **¿Puedo usar el mismo QR en varios materiales?**
Puedes, pero no es recomendado. Crea códigos QR diferentes para saber de dónde viene cada lead (cartel, volante, etiqueta, etc).
---
## Checklist del Corredor Profesional
Antes de imprimir, verifica:
- [ ] Código QR probado en al menos 3 celulares diferentes
- [ ] Tamaño adecuado para la distancia de escaneo
- [ ] Alto contraste entre QR y fondo
- [ ] Llamada a la acción clara ("Escanea aquí")
- [ ] Información de contacto visible (nombre, matrícula, teléfono)
- [ ] URL corta si es link (más fácil de escanear)
- [ ] Material de impresión resistente (especialmente externo)
- [ ] Margen de seguridad alrededor del QR (mínimo 1cm)
---
## Conclusión
Los códigos QR son la **herramienta más económica y eficaz** para corredores modernos captar leads calificados. Con una pequeña inversión en etiquetas y volantes, puedes:
✅ Captar leads 24 horas al día
✅ Facilitar el contacto instantáneo vía WhatsApp
✅ Mostrar tours virtuales impresionantes
✅ Rastrear qué materiales generan más resultado
✅ Destacarte de la competencia conservadora
**El mercado inmobiliario está cada vez más digital. Quien no se adapta, queda atrás.**
---
## ¡Empieza Ahora!
**Crea tu primer código QR para corredor gratuitamente:**
1. [Generar Código QR de WhatsApp](/) - Para carteles de inmuebles
2. [Generar Código QR vCard](/) - Para tarjetas de visita
3. [Generar Código QR de URL](/) - Para tour virtual
**¡Transforma tus carteles y volantes en máquinas de captar leads!** 🏠📱🚀

View File

@ -1,630 +0,0 @@
---
title: "QR Code for Real Estate Agents: Complete Guide for Labels and Flyers"
description: "Discover how to use QR Codes on adhesive labels, signs and real estate flyers. Increase your sales with free and professional technology."
keywords: "qr code real estate agent, realtor label, real estate qr code, adhesive labels realtors, promote real estate agent, qr code for sale sign"
author: "QR Rapido"
date: 2025-10-10
lastmod: 2025-10-10
image: "/images/tutoriais/qr-code-corretor-imoveis-hero.jpg"
---
# QR Code for Real Estate Agents: Complete Guide for Labels and Flyers
If you are a real estate agent, you know that **capturing qualified leads** is essential to closing deals. Imagine turning your "For Sale" signs, flyers and adhesive labels into interactive tools that connect clients directly to your WhatsApp, property listing or digital business card — all of this **for free** with QR Codes!
In this complete guide, you will learn how to create and apply professional QR Codes on real estate materials, increasing your conversions and standing out from the competition.
## Why Real Estate Agents Should Use QR Codes?
### **Proven Advantages**
- ✅ **24/7 Lead Generation**: Your sign works for you even while you sleep
- ✅ **Instant Contact**: Client scans and is already on your WhatsApp
- ✅ **Zero Typing**: Eliminates errors when noting numbers
- ✅ **Tracking**: Know how many people were interested
- ✅ **Professionalism**: Demonstrates modernity and innovation
- ✅ **Zero Cost**: Generate unlimited QR Codes for free
- ✅ **Virtual Tour**: Take the client inside the property virtually
### **Market Statistics**
According to real estate industry studies:
- **78%** of buyers research properties on their phones
- **65%** prefer contact via WhatsApp instead of a call
- **43%** scan QR Codes on property signs when they see them
- Agents who use QR Codes have **35% more monthly leads**
---
## Where to Apply QR Codes in Real Estate Marketing
### **1. "For Sale" and "For Rent" Signs**
**The most powerful use!** The sign in front of the property is seen by hundreds of people daily.
**What to put in the QR Code:**
- Direct link to your WhatsApp
- vCard with your complete contacts
- 360° virtual tour of the property
- Detailed property spec sheet (PDF)
- Property video on YouTube
**Professional tip**: Add eye-catching text like:
- "Scan and schedule your visit NOW"
- "Virtual Tour - Point your camera here"
- "Direct WhatsApp to the Agent"
### **2. Adhesive Labels and Tags**
Small labels (2"x2" to 4"x4") are perfect for:
**Applications:**
- Sticking on agency cars
- Fixing on property gates
- Applying to store windows
- Distributing at partner businesses
- Placing in building elevators
**Advantages:**
- Low printing cost
- Easy mass distribution
- Can be replaced quickly
- Great for promotional actions
### **3. Flyers and Leaflets**
Transform paper flyers into digital tools!
**Where to apply:**
- Top right corner (area of greatest attention)
- Center, if it's the main focus
- Back, with highlighted call to action
**Recommended content:**
- Digital property portfolio
- Registration form
- Mortgage calculator
- Complete list of available properties
### **4. Brochures and Real Estate Magazines**
Premium printed materials deserve strategic QR Codes.
**Ideal use:**
- 1 QR per featured property
- QR on the cover for the complete portfolio
- QR on the back cover with your contacts
- QR on each page with more information
### **5. Business Cards**
The classic never goes out of style, but can be enhanced!
**QR Code on the card allows:**
- Save contact automatically (vCard)
- View online portfolio
- Schedule a meeting directly in the calendar
- Send message via WhatsApp
### **6. Email Signature**
Every email you send is an opportunity!
**Include QR Code for:**
- Your complete vCard
- Latest property launch
- Free property valuation
- Scheduling visits
---
## Step by Step: How to Create QR Codes for Agents
Here's how to create **3 essential QR Code types** for real estate agents:
### **Type 1: vCard QR Code (Digital Business Card)**
Perfect for: Business cards, email signature, badges
#### Step 1: Select "Business Card"
Access the generator and choose the **Business Card** option from the type menu.
#### Step 2: Fill in Your Professional Data
**Required information:**
- **Full name**: John Smith
- **Title**: Real Estate Agent License #12345
- **Company**: Success Real Estate
- **Phone**: +1 555 987-6543
- **Email**: john.smith@realestate.com
- **Website**: www.johnsmith.realestate
- **Address**: 1000 Main St - New York, NY
**Strategic optional fields:**
- WhatsApp Business
- Professional Instagram
- LinkedIn
- YouTube channel with virtual tours
#### Step 3: Generate and Download
Click **"Generate QR Code"** and download in high resolution.
**Where to use this QR:**
- Adhesive labels on the car
- Business cards
- Email signature
- Professional badge
---
### **Type 2: Direct WhatsApp QR Code**
Perfect for: Property signs, flyers, ads
#### Step 1: Select "WhatsApp"
In the generator, choose the **WhatsApp** option (or SMS if you prefer).
#### Step 2: Set Up the Pre-Written Message
**Example of an effective message:**
```
Hi! I saw the property sign at [STREET/NEIGHBORHOOD] and would like to schedule a visit. Can you send me more information?
```
**Why a pre-written message works:**
- Client doesn't need to think about what to write
- You already know which property they're talking about
- Increases conversion rate by 80%
#### Step 3: Customize for Each Property
**Important tip**: Create different QR Codes for each property!
Example for a 3-bedroom apartment in downtown:
```
Hi! I saw the sign for the 3-bedroom Apartment downtown (Ref: APT-001). I'd like to know more details and schedule a visit.
```
**Advantage**: You already know exactly which property the client wants to see!
---
### **Type 3: URL QR Code (Virtual Tour / Spec Sheet)**
Perfect for: High-end properties, launches, rural properties
#### Step 1: Prepare the Digital Content
Before creating the QR, you need to have:
**Option A - Virtual Tour:**
- YouTube video of the property
- 360° tour (Google Street View, Matterport)
- Photo gallery on Instagram/Facebook
**Option B - Landing Page:**
- Complete property spec sheet
- High-resolution photos
- Location map
- Mortgage calculator
- Interest registration form
#### Step 2: Shorten the URL (Important!)
Use URL shorteners like:
- bit.ly
- tinyurl.com
**Example:**
- ❌ Long URL: `https://www.myrealestate.com/properties/3-bedroom-downtown-ref-apt001?utm_source=sign`
- ✅ Short URL: `bit.ly/apt-downtown-001`
**Advantage of short URL**: Generates simpler QR Code that's easier to scan
#### Step 3: Create the QR Code
Paste the short URL into the **URL/Link** field and generate the code.
---
## How to Customize Your QR Code Professionally
### **Strategic Color Choices**
**For Traditional Real Estate Agencies:**
- Navy blue + White (trust, seriousness)
- Black + Gold (luxury, exclusivity)
- Dark green + White (growth, stability)
**For Modern Real Estate Agencies:**
- Orange + White (energy, innovation)
- Purple + White (creativity, differentiation)
- Red + White (urgency, action)
**Golden rule**: Always maintain high contrast between primary color and background!
### **Recommended Sizes by Application**
**Street signs (2-15 ft distance):**
- QR Code: 6"x6" or larger
- Resolution: 500px minimum
**Letter/A4 flyers:**
- QR Code: 1.5"x1.5" to 2.5"x2.5"
- Resolution: 300px
**Adhesive labels:**
- QR Code: 2"x2" (sticker size)
- Resolution: 300px
**Business cards:**
- QR Code: 1"x1"
- Resolution: 200px
### **Add Calls to Action (CTA)**
Never place a QR Code alone! Add attractive text:
**Effective examples:**
- 📱 "Point your camera and message me on WhatsApp"
- 🏠 "360° Virtual Tour - Scan Here"
- 💬 "Schedule Your Visit Now"
- 📋 "See Full Photos and Details"
- 🎯 "Save My Contact Automatically"
---
## Advanced Strategies for Agents
### **1. Trackable (Dynamic) QR Codes**
Use dynamic QR Code services to:
- Know how many people scanned
- See scan times
- Identify approximate location
- Change the destination without reprinting
**When to use:**
- Campaigns with many printed materials
- A/B testing different approaches
- Permanent signs on properties
### **2. Multiple QR Codes on the Same Sign**
Large sign? Use 2-3 different QR Codes!
**Example of a complete sign:**
- **QR 1** (top): "Message on WhatsApp"
- **QR 2** (center): "360° Virtual Tour"
- **QR 3** (bottom): "Save My Contact"
**Advantage**: Client chooses the action they prefer
### **3. QR Code + Augmented Reality**
For launches and developments:
- QR Code leads to AR app
- Client points phone and sees the finished building
- Views decorated apartment
- Extremely impactful!
### **4. Seasonal Campaigns**
Create specific QR Codes for:
- **January**: "Plan the New Year - Buy Your Property"
- **June**: "Summer Vacation in Your New Home"
- **November**: "Black Friday Real Estate Sale"
- **December**: "Start the Year in Your Own Home"
### **5. Strategic Partnerships**
Distribute labels with QR Code at:
- Building materials stores
- Architecture offices
- Notary offices
- Neighborhood gyms and restaurants
- Commercial buildings (bulletin boards)
---
## Professional Adhesive Label Templates
### **Template 1: Minimalist Label (2"x2")**
```
┌─────────────────┐
│ [QR CODE] │
│ │
│ John Smith │
│ License #12345
│ (555) 987-6543 │
└─────────────────┘
```
### **Template 2: Highlighted Label (3"x3")**
```
┌─────────────────────┐
│ SELL YOUR PROPERTY │
│ HASSLE-FREE │
│ │
│ [QR CODE] │
│ │
│ "Scan and talk │
│ directly to me" │
│ │
│ John Smith │
│ Licensed Agent │
└─────────────────────┘
```
### **Template 3: Virtual Tour Label (4"x4")**
```
┌───────────────────────────┐
│ 360° VIRTUAL TOUR │
│ Visit this property │
│ from your couch! │
│ │
│ [LARGE QR CODE] │
│ │
│ 📱 Point your camera │
│ │
│ Success Real Estate │
│ (555) 987-6543 │
└───────────────────────────┘
```
---
## Best Printing Practices
### **Recommended Materials**
**For outdoor signs:**
- **UV-resistant vinyl**
- **UV printed banner**
- **ACM (Aluminum Composite)**
Durability: 2-3 years in direct sunlight
**For adhesive labels:**
- **BOPP (Polypropylene) paper**
- **Glossy white vinyl**
- **Coated paper with lamination**
Durability: 6-12 months
**For flyers:**
- **Coated 80lb or 100lb stock**
- **Spot UV varnish on QR Code** (for emphasis)
### **Testing Before Mass Printing**
⚠️ **ALWAYS do this:**
1. Print 1 sample at actual size
2. Test with 5 different phones
3. Test at different distances
4. Test in low light
5. Only then print large quantities
**Phones to test:**
- iPhone (updated iOS)
- Samsung (Android)
- Other Android brands (popular models)
### **Where to Print**
**Quick print shops:**
- Adhesive labels: 100 units for $15-50
- A5 flyers: 1000 units for $50-150
**Online (cheaper):**
- Vistaprint
- Overnight Prints
- Sticker Mule
**Tip**: Get quotes from 3 different places!
---
## Common Mistakes Agents Should Avoid
### ❌ **Mistake 1: QR Code Too Small**
**Problem**: On street signs viewed from a distance, a small QR won't work
**Solution**: Minimum 6"x6" for outdoor signs
### ❌ **Mistake 2: Colors with Low Contrast**
**Problem**: Yellow QR on white background won't scan
**Solution**: Always use dark colors on light backgrounds (or vice versa)
### ❌ **Mistake 3: Not Testing Before Printing**
**Problem**: Print 1000 flyers and discover the QR doesn't work
**Solution**: Always test with a pilot print
### ❌ **Mistake 4: Broken or Temporary URL**
**Problem**: Property link expires, QR becomes useless
**Solution**: Use permanent URLs or editable dynamic QR
### ❌ **Mistake 5: No Usage Instructions**
**Problem**: Older person doesn't know what to do with the QR
**Solution**: Add "Point your phone camera here"
### ❌ **Mistake 6: Single QR Code for All Properties**
**Problem**: Don't know which property generated the lead
**Solution**: Create a specific QR for each property
### ❌ **Mistake 7: Low Quality Materials**
**Problem**: Label fades in 1 month in the sun
**Solution**: Invest in UV-resistant materials
---
## Success Stories
### **Case 1: Agent in New York**
**Strategy**: Placed QR Code on all 15 property signs
**Results:**
- 127 scans in the first month
- 34 WhatsApp conversations
- 8 visits scheduled
- 2 sales closed
**ROI**: Invested $150 in labels, earned $28,000 in commissions
### **Case 2: Real Estate Agency**
**Strategy**: Flyers with QR for virtual tour of new development
**Results:**
- 5,000 flyers distributed
- 890 virtual tour accesses
- 156 registered interested buyers
- 23 apartments sold in pre-sale
### **Case 3: Independent Agent**
**Strategy**: Adhesive labels at partner businesses
**Results:**
- 200 labels distributed at 40 locations
- 67 new contacts in 3 months
- 12 property valuations scheduled
- 3 exclusive listings captured
---
## Complementary Tools
### **Digital Content Creation**
- **Canva**: Create label and flyer layouts
- **Matterport**: 360° virtual tours
- **YouTube**: Host property videos
- **Google Drive**: Property spec sheet PDFs
### **Lead Management**
- **Bitly**: Shorten URLs and track clicks
- **Google Analytics**: Monitor traffic
- **WhatsApp Business**: Organize conversations
- **CRM tools**: Real estate CRM solutions
### **Online Printing**
- **Vistaprint**: Labels and flyers
- **Overnight Prints**: Signs and banners
- **Sticker Mule**: Premium stickers
---
## Frequently Asked Questions
### **Do I need to pay to create a QR Code?**
No! At QR Rapido you create unlimited QR Codes for free. You only pay if you want premium features like advanced tracking.
### **Does the QR Code work forever?**
Static QR Codes (free) work forever, but cannot be edited. Dynamic QR Codes (paid) can be edited even after printing.
### **Which QR type to use on property signs?**
I recommend **WhatsApp** with a pre-written message. That way the client already starts the conversation knowing which property they're asking about.
### **Can I put the agency logo on the QR?**
Yes, but carefully! Logos that are too large can make it harder to read. Keep the logo small (maximum 20% of the QR).
### **How many people scan QR Codes on signs?**
According to research, between 5-15% of people who see the sign scan the QR. In busy areas, this can generate dozens of leads per month.
### **Does the QR Code work at night?**
Yes, as long as there is some lighting. For best results, illuminate the sign.
### **Can I use the same QR on multiple materials?**
You can, but it's not recommended. Create different QR Codes to know where each lead came from (sign, flyer, label, etc.).
### **How do I know if the QR is working?**
Test immediately after creating! Use your own phone camera and at least 2 other people's phones to make sure.
---
## Professional Agent Checklist
Before printing, verify:
- [ ] QR Code tested on at least 3 different phones
- [ ] Appropriate size for scanning distance
- [ ] High contrast between QR and background
- [ ] Clear call to action ("Scan here")
- [ ] Visible contact information (name, license, phone)
- [ ] Short URL if using a link (easier to scan)
- [ ] Durable printing material (especially for outdoor use)
- [ ] Safety margin around the QR (minimum 0.4")
---
## Conclusion
QR Codes are the **cheapest and most effective tool** for modern agents to capture qualified leads. With an investment of less than $100 in labels and flyers, you can:
✅ Capture leads 24 hours a day
✅ Facilitate instant contact via WhatsApp
✅ Show impressive virtual tours
✅ Track which materials generate the most results
✅ Stand out from the conservative competition
**The real estate market is increasingly digital. Those who don't adapt get left behind.**
---
## Get Started Now!
**Create your first real estate agent QR Code for free:**
1. [Generate WhatsApp QR Code](/) - For property signs
2. [Generate vCard QR Code](/) - For business cards
3. [Generate URL QR Code](/) - For virtual tours
**Turn your signs and flyers into lead generation machines!** 🏠📱🚀
---
## Bonus Materials
- 📋 Pre-written WhatsApp message template
- 🎨 Editable label templates
- 📊 QR Code tracking spreadsheet by property
- 🎯 Professional printing checklist
**Want to stand out in the real estate market? Use QR Codes strategically and watch your results multiply!**

View File

@ -16,8 +16,8 @@ namespace QRRapidoApp.Controllers
}
[Route("Developer/docs")]
[Route("es-PY/Developer/docs")]
[Route("es/Developer/docs")]
[Route("en/Developer/docs")]
public async Task<IActionResult> Index()
{
var culture = GetCulture();
@ -27,8 +27,8 @@ namespace QRRapidoApp.Controllers
}
[Route("Developer/docs/{slug}")]
[Route("es-PY/Developer/docs/{slug}")]
[Route("es/Developer/docs/{slug}")]
[Route("en/Developer/docs/{slug}")]
public async Task<IActionResult> Article(string slug)
{
var culture = GetCulture();
@ -54,10 +54,9 @@ namespace QRRapidoApp.Controllers
private string GetCulture()
{
var path = Request.Path.Value ?? "";
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/en", StringComparison.OrdinalIgnoreCase)) return "en";
return "pt-BR";
}
}

View File

@ -7,9 +7,6 @@ using System.Security.Claims;
namespace QRRapidoApp.Controllers
{
[Authorize]
[Route("Developer")]
[Route("es/Developer")]
[Route("en/Developer")]
public class DeveloperController : Controller
{
private readonly IUserService _userService;
@ -26,7 +23,7 @@ namespace QRRapidoApp.Controllers
_logger = logger;
}
[HttpGet("")]
[HttpGet]
public async Task<IActionResult> Index()
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
@ -39,7 +36,7 @@ namespace QRRapidoApp.Controllers
return View(user);
}
[HttpPost("GenerateKey")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> GenerateKey(string keyName)
{
@ -49,7 +46,7 @@ namespace QRRapidoApp.Controllers
if (string.IsNullOrWhiteSpace(keyName) || keyName.Length > 50)
{
TempData["Error"] = "Nome da chave inválido (máx. 50 caracteres).";
return Redirect(GetDevUrl());
return RedirectToAction(nameof(Index));
}
var user = await _userService.GetUserAsync(userId);
@ -58,7 +55,7 @@ namespace QRRapidoApp.Controllers
if (user.ApiKeys.Count(k => k.IsActive) >= 5)
{
TempData["Error"] = "Limite de 5 chaves ativas atingido. Revogue uma antes de criar outra.";
return Redirect(GetDevUrl());
return RedirectToAction(nameof(Index));
}
var (rawKey, prefix) = await _userService.GenerateApiKeyAsync(userId, keyName.Trim());
@ -70,7 +67,7 @@ namespace QRRapidoApp.Controllers
return RedirectToAction(nameof(Index));
}
[HttpGet("Pricing")]
[HttpGet]
public async Task<IActionResult> Pricing()
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
@ -83,7 +80,7 @@ namespace QRRapidoApp.Controllers
return View();
}
[HttpPost("SubscribeApi")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SubscribeApi(string planTier)
{
@ -95,7 +92,7 @@ namespace QRRapidoApp.Controllers
tier == ApiPlanTier.Enterprise)
{
TempData["Error"] = "Plano inválido selecionado.";
return Redirect(GetDevUrl("Pricing"));
return RedirectToAction(nameof(Pricing));
}
try
@ -108,11 +105,11 @@ namespace QRRapidoApp.Controllers
{
_logger.LogError(ex, "Error creating API subscription checkout for user {UserId}", userId);
TempData["Error"] = "Erro ao criar sessão de pagamento. Tente novamente.";
return Redirect(GetDevUrl("Pricing"));
return RedirectToAction(nameof(Pricing));
}
}
[HttpPost("RevokeKey")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> RevokeKey(string prefix)
{
@ -122,7 +119,7 @@ namespace QRRapidoApp.Controllers
if (string.IsNullOrWhiteSpace(prefix))
{
TempData["Error"] = "Chave inválida.";
return Redirect(GetDevUrl());
return RedirectToAction(nameof(Index));
}
var revoked = await _userService.RevokeApiKeyAsync(userId, prefix);
@ -142,21 +139,10 @@ namespace QRRapidoApp.Controllers
private string GetCulture()
{
var path = Request.Path.Value ?? "";
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/en", StringComparison.OrdinalIgnoreCase)) return "en";
return "pt-BR";
}
private string GetDevUrl(string action = "")
{
var base_ = GetCulture() switch {
"es" => "/es/Developer",
"en" => "/en/Developer",
_ => "/Developer"
};
return string.IsNullOrEmpty(action) ? base_ : $"{base_}/{action}";
}
}
}

View File

@ -35,11 +35,10 @@ namespace QRRapidoApp.Controllers
// Home page routes
// "/" → Portuguese (canonical)
// "/es" → Spanish
// "/es-PY" → Spanish
[HttpGet]
[Route("/")]
[Route("es")]
[Route("en")]
[Route("es-PY")]
public async Task<IActionResult> Index(string? qrType = null)
{
var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
@ -113,48 +112,40 @@ namespace QRRapidoApp.Controllers
// Dedicated SEO Routes - Landing pages for each QR type
// Portuguese (default): /pix, /wifi, etc. (no culture prefix)
// Spanish: /es/pix, /es/wifi, etc.
// Spanish: /es-PY/pix, /es-PY/wifi, etc.
[Route("pix")]
[Route("es/pix")]
[Route("en/pix")]
[Route("es-PY/pix")]
public async Task<IActionResult> Pix() => await Index("pix");
[Route("wifi")]
[Route("es/wifi")]
[Route("en/wifi")]
[Route("es-PY/wifi")]
public async Task<IActionResult> Wifi() => await Index("wifi");
[Route("vcard")]
[Route("es/vcard")]
[Route("en/vcard")]
[Route("es-PY/vcard")]
public async Task<IActionResult> VCard() => await Index("vcard");
[Route("whatsapp")]
[Route("es/whatsapp")]
[Route("en/whatsapp")]
[Route("es-PY/whatsapp")]
public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
[Route("email")]
[Route("es/email")]
[Route("en/email")]
[Route("es-PY/email")]
public async Task<IActionResult> Email() => await Index("email");
[Route("sms")]
[Route("es/sms")]
[Route("en/sms")]
[Route("es-PY/sms")]
public async Task<IActionResult> Sms() => await Index("sms");
[Route("texto")]
[Route("text")]
[Route("es/texto")]
[Route("es/text")]
[Route("en/text")]
[Route("es-PY/texto")]
[Route("es-PY/text")]
public async Task<IActionResult> Text() => await Index("text");
[Route("url")]
[Route("es/url")]
[Route("en/url")]
[Route("es-PY/url")]
public async Task<IActionResult> UrlType() => await Index("url");
public IActionResult Privacy()
@ -334,7 +325,7 @@ namespace QRRapidoApp.Controllers
// Core entry points
AppendUrl("/", "daily", "1.0");
AppendUrl("/es", "daily", "0.9");
AppendUrl("/es-PY", "daily", "0.9");
// Tools (Landing Pages)
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
@ -342,7 +333,7 @@ namespace QRRapidoApp.Controllers
foreach (var tool in tools)
{
AppendUrl($"/{tool}", "weekly", "0.9");
AppendUrl($"/es/{tool}", "weekly", "0.8");
AppendUrl($"/es-PY/{tool}", "weekly", "0.8");
}
// Informational pages
@ -359,7 +350,7 @@ namespace QRRapidoApp.Controllers
foreach (var page in informationalPages)
{
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
AppendUrl($"/es/{page.Path}", page.ChangeFreq, page.Priority);
AppendUrl($"/es-PY/{page.Path}", page.ChangeFreq, page.Priority);
}
// Dynamic tutorial pages from Markdown
@ -379,7 +370,7 @@ namespace QRRapidoApp.Controllers
var tutorialPath = article.Culture == "pt-BR"
? $"/tutoriais/{encodedSlug}"
: $"/es/tutoriais/{encodedSlug}";
: $"/es-PY/tutoriais/{encodedSlug}";
var lastMod = article.LastMod.ToString("yyyy-MM-dd");
AppendUrl(tutorialPath, "weekly", "0.8", lastMod);

View File

@ -28,19 +28,18 @@ namespace QRRapidoApp.Controllers
}
// Portuguese: /tutoriais/{slug} (canonical, no prefix)
// Spanish: /es/tutoriais/{slug}
// English: /en/tutoriais/{slug}
// Spanish: /es-PY/tutoriais/{slug}
[Route("tutoriais/{slug}")]
[Route("es-PY/tutoriais/{slug}")]
[Route("es/tutoriais/{slug}")]
[Route("en/tutoriais/{slug}")]
public async Task<IActionResult> Article(string slug, string? culture = null)
{
try
{
// Determine culture from URL path if not provided
var reqPath = Request.Path.Value ?? "";
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: "pt-BR";
var article = await _markdownService.GetArticleAsync(slug, culture);
@ -89,19 +88,18 @@ namespace QRRapidoApp.Controllers
}
// Portuguese: /tutoriais (canonical, no prefix)
// Spanish: /es/tutoriais
// English: /en/tutoriais
// Spanish: /es-PY/tutoriais
[Route("tutoriais")]
[Route("es-PY/tutoriais")]
[Route("es/tutoriais")]
[Route("en/tutoriais")]
public async Task<IActionResult> Index(string? culture = null)
{
try
{
// Determine culture from URL path if not provided
var reqPath = Request.Path.Value ?? "";
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
: "pt-BR";
var articles = await _markdownService.GetAllArticlesAsync(culture);
@ -114,13 +112,9 @@ namespace QRRapidoApp.Controllers
ViewBag.UserName = User.Identity?.Name ?? "";
_adDisplayService.SetViewBagAds(ViewBag);
ViewBag.Title = culture == "pt-BR" ? "Tutoriais QR Code"
: culture == "en" ? "QR Code Tutorials"
: "Tutoriales Código QR";
ViewBag.Title = culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR";
ViewBag.Description = culture == "pt-BR"
? "Aprenda a criar e usar QR Codes com nossos tutoriais completos"
: culture == "en"
? "Learn how to create and use QR Codes with our complete step-by-step tutorials"
: "Aprende a crear y usar códigos QR con nuestros tutoriales completos";
ViewBag.Culture = culture;

View File

@ -16,16 +16,6 @@ namespace QRRapidoApp.Filters
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// [AllowAnonymous] on the action bypasses this filter
var hasAllowAnonymous = context.ActionDescriptor.EndpointMetadata
.OfType<Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute>()
.Any();
if (hasAllowAnonymous)
{
await next();
return;
}
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ApiKeyAuthorizeAttribute>>();
try

View File

@ -9,15 +9,14 @@ namespace QRRapidoApp.Middleware
/// Comportamento:
/// - "/" → Retorna 200 OK em Português (canonical)
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
/// - "/es" ou "/es/*" → Retorna 200 OK em Espanhol (mantém URL)
/// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL)
/// - "/es-PY" ou "/es-PY/*" → Retorna 200 OK em Espanhol (mantém URL)
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
/// </summary>
public class LanguageRedirectionMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LanguageRedirectionMiddleware> _logger;
private readonly string[] _supportedCultures = { "pt-BR", "es", "en" };
private readonly string[] _supportedCultures = { "pt-BR", "es-PY", "es" };
private const string DefaultCulture = "pt-BR";
private const string CookieName = ".AspNetCore.Culture";
@ -69,6 +68,14 @@ namespace QRRapidoApp.Middleware
return;
}
// Supported: es-PY
if (string.Equals(firstSegment, "es-PY", StringComparison.OrdinalIgnoreCase))
{
SetCulture(context, "es-PY");
await _next(context);
return;
}
// Supported: es (Spanish neutral)
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
{
@ -77,15 +84,7 @@ namespace QRRapidoApp.Middleware
return;
}
// Supported: en (English)
if (string.Equals(firstSegment, "en", StringComparison.OrdinalIgnoreCase))
{
SetCulture(context, "en");
await _next(context);
return;
}
// Handle aliases or unsupported cultures (e.g. /en-US/, /pt/)
// Handle aliases or unsupported cultures (e.g. /en/, /pt/)
if (TryHandleCultureAliasOrUnknown(context, firstSegment, segments))
{
return;
@ -109,14 +108,13 @@ namespace QRRapidoApp.Middleware
{
// Map known aliases to canonical forms
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
return RedirectToLanguage(context, "es", segments);
{
return RedirectToLanguage(context, "es-PY", segments);
}
if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) ||
string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase))
return RedirectToLanguage(context, "en", segments);
// For anything else that looks like a culture (pt, fr, de, etc.)
// redirect to the canonical Portuguese URL (no prefix).
// For anything else that looks like a culture (en, pt, fr, etc.)
// but isn't explicitly es-PY, we redirect to the canonical (no prefix)
// This prevents 404s for /en/, /pt-BR/ (redirects to /), etc.
return RedirectToCanonical(context, segments);
}

View File

@ -224,8 +224,8 @@ builder.Services.Configure<RequestLocalizationOptions>(options =>
var supportedCultures = new[]
{
new CultureInfo("pt-BR"),
new CultureInfo("es-PY"),
new CultureInfo("es"),
new CultureInfo("en"),
};
options.DefaultRequestCulture = new RequestCulture("pt-BR", "pt-BR");
@ -463,7 +463,7 @@ app.MapHealthChecks("/healthcheck");
// Language routes (must be first for WEB)
app.MapControllerRoute(
name: "localized",
pattern: "{culture:regex(^(pt-BR|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
pattern: "{culture:regex(^(pt-BR|es-PY|es)$)}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "api_v1",

View File

@ -6,10 +6,10 @@ namespace QRRapidoApp.Providers
{
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
{
// First check if the middleware has already determined the culture (e.g. for static routes like /es/pix)
// First check if the middleware has already determined the culture (e.g. for static routes like /es-PY/pix)
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
{
var supportedCultures = new[] { "pt-BR", "es", "en" };
var supportedCultures = new[] { "pt-BR", "es-PY" };
if (supportedCultures.Contains(cultureFromMiddleware))
{
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
@ -24,7 +24,7 @@ namespace QRRapidoApp.Providers
if (!string.IsNullOrEmpty(culture))
{
// Map the supported cultures
var supportedCultures = new[] { "pt-BR", "es", "en" };
var supportedCultures = new[] { "pt-BR", "es-PY" };
if (supportedCultures.Contains(culture))
{
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));

File diff suppressed because it is too large Load Diff

View File

@ -2104,7 +2104,7 @@
</data>
<!-- Tutorial Section -->
<data name="ViewTutorials" xml:space="preserve">
<value>Tutoriales QR</value>
<value>Ver Tutoriales</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Aprende Más</value>
@ -2113,7 +2113,7 @@
<value>Guías completas sobre códigos QR</value>
</data>
<data name="ViewAllTutorials" xml:space="preserve">
<value>Tutoriales QR</value>
<value>Ver Todos los Tutoriales</value>
</data>
<data name="RealEstateAndBrokers" xml:space="preserve">
<value>Inmobiliaria y Corredores</value>

File diff suppressed because it is too large Load Diff

View File

@ -2257,7 +2257,7 @@
</data>
<!-- Tutorial Section -->
<data name="ViewTutorials" xml:space="preserve">
<value>Tutoriais QR</value>
<value>Ver Tutoriais</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Aprenda Mais</value>
@ -2266,7 +2266,7 @@
<value>Guias completos sobre QR Codes</value>
</data>
<data name="ViewAllTutorials" xml:space="preserve">
<value>Tutoriais QR</value>
<value>Ver Todos os Tutoriais</value>
</data>
<data name="RealEstateAndBrokers" xml:space="preserve">
<value>Imóveis e Corretores</value>

View File

@ -3,19 +3,19 @@
ViewData["Title"] = Model.Metadata.Title + " — QRRapido Docs";
Layout = "~/Views/Shared/_Layout.cshtml";
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
var culture = ViewBag.Culture as string ?? "pt-BR";
var isEs = culture == "es-PY";
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
var slug = ViewBag.Slug as string;
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
string T(string pt, string es) => isEs ? es : pt;
}
<div class="container mt-4 mb-5">
<nav aria-label="breadcrumb" class="mb-4">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="@devBase">@T("Portal do Desenvolvedor", "Portal del Desarrollador", "Developer Portal")</a></li>
<li class="breadcrumb-item"><a href="@devBase">@T("Portal do Desenvolvedor", "Portal del Desarrollador")</a></li>
<li class="breadcrumb-item"><a href="@devBase/docs">Docs</a></li>
<li class="breadcrumb-item active" aria-current="page">@Model.Metadata.Title</li>
</ol>
@ -27,7 +27,7 @@
<header class="mb-4">
<h1 class="mb-3">@Model.Metadata.Title</h1>
<p class="text-muted small">
<i class="fas fa-clock me-1"></i> @Model.Metadata.ReadingTimeMinutes @T("min de leitura", "min de lectura", "min read")
<i class="fas fa-clock me-1"></i> @Model.Metadata.ReadingTimeMinutes @T("min de leitura", "min de lectura")
&nbsp;·&nbsp;
<i class="fas fa-calendar me-1"></i> @Model.Metadata.Date.ToString("dd/MM/yyyy")
</p>
@ -40,7 +40,7 @@
</div>
<footer class="mt-5 pt-3 border-top">
<small class="text-muted">@T("Última atualização:", "Última actualización:", "Last updated:") @Model.Metadata.LastMod.ToString("dd/MM/yyyy")</small>
<small class="text-muted">@T("Última atualização:", "Última actualización:") @Model.Metadata.LastMod.ToString("dd/MM/yyyy")</small>
</footer>
</article>
@ -48,20 +48,20 @@
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-primary text-white py-2">
<h6 class="mb-0"><i class="fas fa-rocket me-2"></i>@T("Links Rápidos", "Links Pya'e", "Quick Links")</h6>
<h6 class="mb-0"><i class="fas fa-rocket me-2"></i>@T("Links Rápidos", "Links Pya'e")</h6>
</div>
<div class="list-group list-group-flush">
<a href="@devBase" class="list-group-item list-group-item-action small">
<i class="fas fa-key me-2 text-primary"></i>@T("Minhas Chaves de API", "Mis Claves de API", "My API Keys")
<i class="fas fa-key me-2 text-primary"></i>@T("Minhas Chaves de API", "Mis Claves de API")
</a>
<a href="/api/docs" target="_blank" class="list-group-item list-group-item-action small">
<i class="fas fa-code me-2 text-success"></i>Swagger / OpenAPI
</a>
<a href="@devBase/Pricing" class="list-group-item list-group-item-action small">
<i class="fas fa-arrow-up me-2 text-warning"></i>@T("Planos de API", "Planes de API", "API Plans")
<i class="fas fa-arrow-up me-2 text-warning"></i>@T("Planos de API", "Planes de API")
</a>
<a href="@devBase/docs" class="list-group-item list-group-item-action small">
<i class="fas fa-book me-2 text-info"></i>@T("Todos os Tutoriais", "Todos los Tutoriales", "All Tutorials")
<i class="fas fa-book me-2 text-info"></i>@T("Todos os Tutoriais", "Todos los Tutoriales")
</a>
</div>
</div>
@ -70,7 +70,7 @@
{
<div class="card border-0 shadow-sm">
<div class="card-header bg-white py-2">
<h6 class="mb-0"><i class="fas fa-bookmark me-2 text-secondary"></i>@T("Outros Tutoriais", "Otros Tutoriales", "Other Tutorials")</h6>
<h6 class="mb-0"><i class="fas fa-bookmark me-2 text-secondary"></i>@T("Outros Tutoriais", "Otros Tutoriales")</h6>
</div>
<div class="list-group list-group-flush">
@foreach (var related in Model.RelatedArticles)

View File

@ -3,11 +3,11 @@
ViewData["Title"] = "Docs & Tutoriais para Desenvolvedores";
Layout = "~/Views/Shared/_Layout.cshtml";
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
var culture = ViewBag.Culture as string ?? "pt-BR";
var isEs = culture == "es-PY";
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
string T(string pt, string es) => isEs ? es : pt;
}
<div class="container mt-4 mb-5">
@ -16,13 +16,13 @@
<div class="d-flex align-items-center">
<div class="me-3"><i class="fas fa-book-open fa-2x text-primary"></i></div>
<div>
<h1 class="h3 mb-0">@T("Docs & Tutoriais", "Docs & Tutoriales", "Docs & Tutorials")</h1>
<p class="text-muted mb-0 small">@T("Guias técnicos para integrar e usar a API QRRapido.", "Guías técnicas para integrar ha usar la API QRRapido.", "Technical guides to integrate and use the QRRapido API.")</p>
<h1 class="h3 mb-0">@T("Docs & Tutoriais", "Docs & Tutoriales")</h1>
<p class="text-muted mb-0 small">@T("Guias técnicos para integrar e usar a API QRRapido.", "Guías técnicas para integrar ha usar la API QRRapido.")</p>
</div>
</div>
<div class="d-flex gap-2">
<a href="@devBase" class="btn btn-outline-secondary btn-sm">
<i class="fas fa-key me-1"></i> @T("Minhas Chaves", "Mis Claves", "My Keys")
<i class="fas fa-key me-1"></i> @T("Minhas Chaves", "Mis Claves")
</a>
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
<i class="fas fa-code me-1"></i> Swagger
@ -42,11 +42,11 @@
<p class="card-text text-muted flex-grow-1 small">@article.Description</p>
<div class="mb-3">
<small class="text-muted">
<i class="fas fa-clock me-1"></i> @article.ReadingTimeMinutes @T("min de leitura", "min de lectura", "min read")
<i class="fas fa-clock me-1"></i> @article.ReadingTimeMinutes @T("min de leitura", "min de lectura")
</small>
</div>
<a href="@devBase/docs/@article.Slug" class="btn btn-primary btn-sm">
@T("Ler", "Leer", "Read") <i class="fas fa-arrow-right ms-1"></i>
@T("Ler", "Leer") <i class="fas fa-arrow-right ms-1"></i>
</a>
</div>
</div>
@ -58,7 +58,7 @@
{
<div class="text-center py-5">
<i class="fas fa-book fa-3x text-muted opacity-25 mb-3"></i>
<p class="text-muted">@T("Nenhum artigo encontrado.", "Ningún artículo encontrado.", "No articles found.")</p>
<p class="text-muted">@T("Nenhum artigo encontrado.", "Ningún artículo encontrado.")</p>
</div>
}
</div>

View File

@ -12,11 +12,11 @@
var revokedKeys = Model.ApiKeys.Where(k => !k.IsActive).OrderByDescending(k => k.CreatedAt).ToList();
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
var docsBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
var culture = ViewBag.Culture as string ?? "pt-BR";
var isEs = culture == "es-PY";
var docsBase = isEs ? "/es-PY/Developer" : "/Developer";
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
string T(string pt, string es) => isEs ? es : pt;
}
<div class="container mt-4 mb-5">
@ -28,30 +28,29 @@
<i class="fas fa-code fa-2x text-primary"></i>
</div>
<div>
<h1 class="h3 mb-0">@T("Portal do Desenvolvedor", "Portal del Desarrollador", "Developer Portal")</h1>
<h1 class="h3 mb-0">@T("Portal do Desenvolvedor", "Portal del Desarrollador")</h1>
<p class="text-muted mb-0 small">
@T("Gerencie suas chaves de API e integre o QR Rapido nas suas aplicações.",
"Gestioná tus claves de API ha integrá QR Rapido en tus aplicaciones.",
"Manage your API keys and integrate QR Rapido into your applications.")
"Gestioná tus claves de API ha integrá QR Rapido en tus aplicaciones.")
@{
var tier = Model.ApiSubscription?.EffectiveTier ?? QRRapidoApp.Models.ApiPlanTier.Free;
var tierLabel = tier == QRRapidoApp.Models.ApiPlanTier.Free
? "<span class='badge bg-secondary ms-2'>Free</span>"
: $"<span class='badge bg-primary ms-2'>{tier}</span>";
}
@T("Plano atual:", "Plan actual:", "Current plan:") @Html.Raw(tierLabel)
@T("Plano atual:", "Plan actual:") @Html.Raw(tierLabel)
</p>
</div>
</div>
<div class="d-flex gap-2">
<a href="@docsBase/docs" class="btn btn-outline-info btn-sm">
<i class="fas fa-book me-1"></i> Docs API
<i class="fas fa-book me-1"></i> @T("Tutoriais", "Tutoriales")
</a>
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
<i class="fas fa-code me-1"></i> Swagger
</a>
<a href="@docsBase/Pricing" class="btn btn-outline-primary btn-sm">
<i class="fas fa-arrow-up me-1"></i> @T("Ver Planos de API", "Ver Planes de API", "API Plans")
<i class="fas fa-arrow-up me-1"></i> @T("Ver Planos de API", "Ver Planes de API")
</a>
</div>
</div>

View File

@ -5,25 +5,24 @@
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
var errorMsg = TempData["Error"] as string;
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
var culture = ViewBag.Culture as string ?? "pt-BR";
var isEs = culture == "es-PY";
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
string T(string pt, string es) => isEs ? es : pt;
}
<div class="container mt-4 mb-5">
<div class="text-center mb-5">
<h1 class="h2 fw-bold">@T("Planos de API", "Planes de API", "API Plans")</h1>
<h1 class="h2 fw-bold">@T("Planos de API", "Planes de API")</h1>
<p class="text-muted">
@T("Escolha o plano que melhor se adapta à sua integração.",
"Elegí el plan porã que mejor se adapte a tu integración.",
"Choose the plan that best fits your integration.")
"Elegí el plan porã que mejor se adapte a tu integración.")
<br>
@T("Todos os planos incluem a", "Todos los planes incluyen la", "All plans include the")
@T("Todos os planos incluem a", "Todos los planes incluyen la")
<strong>API REST</strong>
@T("com autenticação por chave.", "con autenticación por clave.", "with key authentication.")
@T("com autenticação por chave.", "con autenticación por clave.")
</p>
@if (!string.IsNullOrEmpty(errorMsg))
{
@ -175,7 +174,7 @@
<div class="text-center mt-3">
<a href="@devBase" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left me-2"></i>@T("Voltar ao Portal", "Volver al Portal", "Back to Portal")
<i class="fas fa-arrow-left me-2"></i>@T("Voltar ao Portal", "Volver al Portal")
</a>
</div>
</div>

View File

@ -4,10 +4,6 @@
@{
ViewData["Title"] = "Comprar Créditos";
Layout = "~/Views/Shared/_Layout.cshtml";
var reqPath = Context.Request.Path.Value ?? "";
var isBrazilian = !reqPath.StartsWith("/en", StringComparison.OrdinalIgnoreCase)
&& !reqPath.StartsWith("/es", StringComparison.OrdinalIgnoreCase);
}
<div class="container py-5">
@ -38,13 +34,10 @@
<!-- Preços Duplos -->
<div class="bg-light rounded p-3 mb-4">
@if (isBrazilian)
{
<div class="d-flex justify-content-between align-items-center mb-2">
<span class="text-muted"><i class="fas fa-bolt text-warning"></i> PIX</span>
<span class="h4 text-success mb-0 fw-bold">R$ @package.PricePix.ToString("F2")</span>
</div>
}
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted"><i class="fas fa-credit-card"></i> Cartão</span>
<span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span>
@ -60,13 +53,10 @@
@if (User.Identity.IsAuthenticated)
{
<div class="d-grid gap-2 mt-auto">
@if (isBrazilian)
{
<button class="btn btn-outline-success btn-pix-checkout"
data-package-id="@package.Id">
<i class="fas fa-qrcode me-2"></i> Pagar com PIX
</button>
}
<button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout"
data-package-id="@package.Id">
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão

View File

@ -18,37 +18,33 @@
var appEnvironment = Configuration["App:Environment"] ?? HostEnvironment?.EnvironmentName ?? "Unknown";
var secretsLoaded = Configuration.GetValue<bool>("App:SecretsLoaded");
// SEO: Determine current culture from URL
// SEO: Determine if current page is Spanish (for URL building)
var requestPath = Context.Request.Path.Value ?? "/";
var isSpanish = requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase)
|| string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase);
var isEnglish = requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase)
|| string.Equals(requestPath, "/en", StringComparison.OrdinalIgnoreCase);
var isSpanish = requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase);
// Get path without culture prefix for building alternate URLs
var pathWithoutCulture = requestPath;
if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
else if (string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase))
if (isSpanish && requestPath.Length > 6)
{
pathWithoutCulture = requestPath.Substring(6); // Remove "/es-PY"
}
else if (isSpanish)
{
pathWithoutCulture = "/";
else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase))
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
}
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
// Canonical URL
var canonicalUrl = isEnglish
? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
: isSpanish
? $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
// Canonical URL - for Portuguese it's without prefix, for Spanish it's with /es-PY
var canonicalUrl = isSpanish
? $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
: $"https://qrrapido.site{pathWithoutCulture}";
// Alternate URLs for hreflang
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
var esUrl = $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
var esUrl = $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
// Culture prefix for internal links
var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es" : "";
var culturePrefix = isSpanish ? "/es-PY" : "";
if (User?.Identity?.IsAuthenticated == true)
{
@ -89,8 +85,7 @@
<!-- Hreflang for multilingual SEO -->
<link rel="alternate" hreflang="pt-BR" href="@ptUrl">
<link rel="alternate" hreflang="es" href="@esUrl">
<link rel="alternate" hreflang="en" href="@enUrl">
<link rel="alternate" hreflang="es-PY" href="@esUrl">
<link rel="alternate" hreflang="x-default" href="@ptUrl">
<!-- Open Graph -->
@ -322,9 +317,9 @@
<i class="fas fa-globe"></i> <span id="current-lang">PT</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🌎 Português (Brasil)</a></li>
<li><a class="dropdown-item" href="#" data-lang="es">🌎 Español</a></li>
<li><a class="dropdown-item" href="#" data-lang="en">🌎 English</a></li>
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português (Brasil)</a></li>
<li><a class="dropdown-item" href="#" data-lang="es-PY">🇵🇾 Español (Paraguay)</a></li>
@* <li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li> *@
</ul>
</div>

View File

@ -2,9 +2,6 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewData["Title"] = Model.Metadata.Title;
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
var baseUrl = "https://qrrapido.site";
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";
}
@ -87,7 +84,7 @@
{
"@@type": "ListItem",
"position": 2,
"name": "@T("Tutoriais", "Tutoriales", "Tutorials")",
"name": "@(ViewBag.Culture == "pt-BR" ? "Tutoriais" : "Tutoriales")",
"item": "@baseUrl/@ViewBag.Culture/tutoriais"
},
{
@ -106,7 +103,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/@ViewBag.Culture">Home</a></li>
<li class="breadcrumb-item"><a href="/@ViewBag.Culture/tutoriais">@T("Tutoriais", "Tutoriales", "Tutorials")</a></li>
<li class="breadcrumb-item"><a href="/@ViewBag.Culture/tutoriais">@(ViewBag.Culture == "pt-BR" ? "Tutoriais" : "Tutoriales")</a></li>
<li class="breadcrumb-item active" aria-current="page">@Model.Metadata.Title</li>
</ol>
</nav>
@ -121,7 +118,7 @@
<div class="text-muted mb-3">
<span><i class="fas fa-user"></i> @Model.Metadata.Author</span> |
<span><i class="fas fa-calendar"></i> @Model.Metadata.Date.ToString("dd MMM yyyy")</span> |
<span><i class="fas fa-clock"></i> @Model.Metadata.ReadingTimeMinutes min @T("de leitura", "de lectura", "read")</span>
<span><i class="fas fa-clock"></i> @Model.Metadata.ReadingTimeMinutes min @(ViewBag.Culture == "pt-BR" ? "de leitura" : "de lectura")</span>
</div>
@if (!string.IsNullOrEmpty(Model.Metadata.Image))
@ -141,7 +138,7 @@
<footer class="mt-5 pt-4 border-top">
<p class="text-muted">
<small>
@T("Última atualização:", "Última actualización:", "Last updated:")
@(ViewBag.Culture == "pt-BR" ? "Última atualização:" : "Última actualización:")
@Model.Metadata.LastMod.ToString("dd MMM yyyy HH:mm")
</small>
</p>
@ -173,7 +170,7 @@
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-book"></i>
@T("Artigos Relacionados", "Artículos Relacionados", "Related Articles")
@(ViewBag.Culture == "pt-BR" ? "Artigos Relacionados" : "Artículos Relacionados")
</h5>
</div>
<div class="list-group list-group-flush">
@ -196,15 +193,15 @@
<div class="card-body">
<h5 class="card-title">
<i class="fas fa-crown"></i>
@T("Seja Premium!", "¡Hazte Premium!", "Go Premium!")
@(ViewBag.Culture == "pt-BR" ? "Seja Premium!" : "¡Hazte Premium!")
</h5>
<p class="card-text">
@T("QR codes ilimitados, sem anúncios e recursos avançados.",
"Códigos QR ilimitados, sin anuncios y características avanzadas.",
"Unlimited QR codes, no ads and advanced features.")
@(ViewBag.Culture == "pt-BR"
? "QR codes ilimitados, sem anúncios e recursos avançados."
: "Códigos QR ilimitados, sin anuncios y características avanzadas.")
</p>
<a href="/@ViewBag.Culture/Pagamento/SelecaoPlano" class="btn btn-light btn-block">
@T("Conhecer Planos", "Conocer Planes", "View Plans")
@(ViewBag.Culture == "pt-BR" ? "Conhecer Planos" : "Conocer Planes")
</a>
</div>
</div>
@ -215,21 +212,21 @@
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-link"></i>
@T("Links Úteis", "Enlaces Útiles", "Useful Links")
@(ViewBag.Culture == "pt-BR" ? "Links Úteis" : "Enlaces Útiles")
</h5>
</div>
<div class="list-group list-group-flush">
<a href="/@ViewBag.Culture" class="list-group-item list-group-item-action">
<i class="fas fa-qrcode"></i>
@T("Gerar QR Code", "Generar Código QR", "Generate QR Code")
@(ViewBag.Culture == "pt-BR" ? "Gerar QR Code" : "Generar Código QR")
</a>
<a href="/@ViewBag.Culture/FAQ" class="list-group-item list-group-item-action">
<i class="fas fa-question-circle"></i>
@T("Perguntas Frequentes", "Preguntas Frecuentes", "FAQ")
@(ViewBag.Culture == "pt-BR" ? "Perguntas Frequentes" : "Preguntas Frecuentes")
</a>
<a href="/@ViewBag.Culture/Contact" class="list-group-item list-group-item-action">
<i class="fas fa-envelope"></i>
@T("Contato", "Contacto", "Contact")
@(ViewBag.Culture == "pt-BR" ? "Contato" : "Contacto")
</a>
</div>
</div>

View File

@ -1,10 +1,6 @@
@model List<QRRapidoApp.Models.ArticleMetadata>
@{
var isEn = (ViewBag.Culture as string) == "en";
var isEs = (ViewBag.Culture as string) == "es";
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
ViewData["Title"] = T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials");
ViewData["Title"] = ViewBag.Culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@ -14,12 +10,12 @@
<div class="col-12">
<h1 class="display-4">
<i class="fas fa-book"></i>
@T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials")
@(ViewBag.Culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR")
</h1>
<p class="lead text-muted">
@T("Aprenda tudo sobre QR Codes com nossos tutoriais completos e passo a passo",
"Aprende todo sobre códigos QR con nuestros tutoriales completos paso a paso",
"Learn everything about QR Codes with our complete step-by-step tutorials")
@(ViewBag.Culture == "pt-BR"
? "Aprenda tudo sobre QR Codes com nossos tutoriais completos e passo a passo"
: "Aprende todo sobre códigos QR con nuestros tutoriales completos paso a paso")
</p>
</div>
</div>
@ -49,7 +45,7 @@
<a href="/@ViewBag.Culture/tutoriais/@article.Slug"
class="btn btn-primary btn-block">
@T("Ler Tutorial", "Leer Tutorial", "Read Tutorial")
@(ViewBag.Culture == "pt-BR" ? "Ler Tutorial" : "Leer Tutorial")
<i class="fas fa-arrow-right ml-1"></i>
</a>
</div>
@ -62,9 +58,9 @@
{
<div class="alert alert-info" role="alert">
<i class="fas fa-info-circle"></i>
@T("Nenhum tutorial disponível no momento. Volte em breve!",
"No hay tutoriales disponibles en este momento. ¡Vuelve pronto!",
"No tutorials available at the moment. Check back soon!")
@(ViewBag.Culture == "pt-BR"
? "Nenhum tutorial disponível no momento. Volte em breve!"
: "No hay tutoriales disponibles en este momento. ¡Vuelve pronto!")
</div>
}
@ -74,18 +70,18 @@
<div class="card bg-primary text-white">
<div class="card-body text-center py-5">
<h3 class="mb-3">
@T("Pronto para criar seu QR Code?",
"¿Listo para crear tu código QR?",
"Ready to create your QR Code?")
@(ViewBag.Culture == "pt-BR"
? "Pronto para criar seu QR Code?"
: "¿Listo para crear tu código QR?")
</h3>
<p class="lead mb-4">
@T("Gere QR codes profissionais em segundos com nossa ferramenta ultrarrápida!",
"¡Genera códigos QR profesionales en segundos con nuestra herramienta ultrarrápida!",
"Generate professional QR codes in seconds with our ultra-fast tool!")
@(ViewBag.Culture == "pt-BR"
? "Gere QR codes profissionais em segundos com nossa ferramenta ultrarrápida!"
: "¡Genera códigos QR profesionales en segundos con nuestra herramienta ultrarrápida!")
</p>
<a href="/@ViewBag.Culture" class="btn btn-light btn-lg">
<i class="fas fa-qrcode"></i>
@T("Criar QR Code Agora", "Crear Código QR Ahora", "Create QR Code Now")
@(ViewBag.Culture == "pt-BR" ? "Criar QR Code Agora" : "Crear Código QR Ahora")
</a>
</div>
</div>

View File

@ -1,34 +1,32 @@
// Language switching functionality for QR Rapido
// SEO Strategy:
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
// - Spanish (es): URLs with /es prefix (/es, /es/pix, etc.)
// - English (en): URLs with /en prefix (/en, /en/pix, etc.)
// - Spanish (es-PY): URLs with /es-PY prefix (/es-PY, /es-PY/pix, etc.)
document.addEventListener('DOMContentLoaded', function () {
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
const currentLangSpan = document.getElementById('current-lang');
// Cultures that use a URL prefix
const prefixedCultures = ['es', 'en'];
// Get current culture from URL
function getCurrentCulture() {
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
if (pathSegments.length > 0) {
const first = pathSegments[0].toLowerCase();
if (first === 'es-py' || first === 'es') return 'es';
if (first === 'en') return 'en';
// Check if first segment is es-PY (Spanish)
if (pathSegments.length > 0 && pathSegments[0].toLowerCase() === 'es-py') {
return 'es-PY';
}
return 'pt-BR'; // Default — no prefix
// Default is Portuguese (no prefix in URL)
return 'pt-BR';
}
// Update current language display in header
function updateCurrentLanguageDisplay(culture) {
const langMap = {
'pt-BR': 'PT',
'es': 'ES',
'en': 'EN'
'es-PY': 'ES'
};
if (currentLangSpan) {
currentLangSpan.textContent = langMap[culture] || 'PT';
}
@ -40,24 +38,25 @@ document.addEventListener('DOMContentLoaded', function () {
const queryString = window.location.search;
const hash = window.location.hash;
// Strip any existing culture prefix
// Get path segments, removing any culture prefix
let pathSegments = currentPath.split('/').filter(segment => segment);
// Remove existing culture prefix if present (es-PY or pt-BR)
if (pathSegments.length > 0) {
const first = pathSegments[0].toLowerCase();
if (first === 'es-py' || first === 'es' || first === 'pt-br' || first === 'en') {
const firstSegment = pathSegments[0].toLowerCase();
if (firstSegment === 'es-py' || firstSegment === 'pt-br') {
pathSegments.shift();
}
}
const rest = pathSegments.length > 0 ? '/' + pathSegments.join('/') : '';
// Build new path based on selected culture
let newPath;
if (newCulture === 'pt-BR') {
// Portuguese: no prefix (canonical URLs)
newPath = rest || '/';
newPath = pathSegments.length > 0 ? '/' + pathSegments.join('/') : '/';
} else {
// Spanish / English: add culture prefix
newPath = '/' + newCulture + rest;
// Spanish: add /es-PY prefix
newPath = '/es-PY' + (pathSegments.length > 0 ? '/' + pathSegments.join('/') : '');
}
return newPath + queryString + hash;