Compare commits
3 Commits
311efcae62
...
89065c9db6
| Author | SHA1 | Date | |
|---|---|---|---|
| 89065c9db6 | |||
| 9c393f01e5 | |||
| 6301e33686 |
129
Content/DevTutoriais/formatos-de-imagem.en.md
Normal file
129
Content/DevTutoriais/formatos-de-imagem.en.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
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 **25–35% 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 | ~8–12 KB |
|
||||||
|
| WebP | ~5–8 KB |
|
||||||
|
| SVG | ~3–6 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** |
|
||||||
129
Content/DevTutoriais/formatos-de-imagem.es.md
Normal file
129
Content/DevTutoriais/formatos-de-imagem.es.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
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 **25–35% 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 | ~8–12 KB |
|
||||||
|
| WebP | ~5–8 KB |
|
||||||
|
| SVG | ~3–6 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** |
|
||||||
186
Content/DevTutoriais/gerando-qrcodes-pela-api.en.md
Normal file
186
Content/DevTutoriais/gerando-qrcodes-pela-api.en.md
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
---
|
||||||
|
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 (100–2000) |
|
||||||
|
| `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.
|
||||||
186
Content/DevTutoriais/gerando-qrcodes-pela-api.es.md
Normal file
186
Content/DevTutoriais/gerando-qrcodes-pela-api.es.md
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
---
|
||||||
|
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 (100–2000) |
|
||||||
|
| `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.
|
||||||
142
Content/DevTutoriais/qr-code-pix-estatico.en.md
Normal file
142
Content/DevTutoriais/qr-code-pix-estatico.en.md
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
---
|
||||||
|
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.**
|
||||||
142
Content/DevTutoriais/qr-code-pix-estatico.es.md
Normal file
142
Content/DevTutoriais/qr-code-pix-estatico.es.md
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
---
|
||||||
|
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.
|
||||||
108
Content/Tutoriais/como-crear-codigo-qr-whatsapp.es.md
Normal file
108
Content/Tutoriais/como-crear-codigo-qr-whatsapp.es.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
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)!*
|
||||||
271
Content/Tutoriais/como-crear-codigo-qr-wifi.es.md
Normal file
271
Content/Tutoriais/como-crear-codigo-qr-wifi.es.md
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
---
|
||||||
|
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!
|
||||||
89
Content/Tutoriais/como-criar-qr-code-pix.en.md
Normal file
89
Content/Tutoriais/como-criar-qr-code-pix.en.md
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
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.*
|
||||||
108
Content/Tutoriais/como-criar-qr-code-whatsapp.en.md
Normal file
108
Content/Tutoriais/como-criar-qr-code-whatsapp.en.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
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)!*
|
||||||
179
Content/Tutoriais/como-criar-qr-code-wifi.en.md
Normal file
179
Content/Tutoriais/como-criar-qr-code-wifi.en.md
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
---
|
||||||
|
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!** 🚀📱
|
||||||
598
Content/Tutoriais/qr-code-para-corredores-inmuebles.es.md
Normal file
598
Content/Tutoriais/qr-code-para-corredores-inmuebles.es.md
Normal file
@ -0,0 +1,598 @@
|
|||||||
|
---
|
||||||
|
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!** 🏠📱🚀
|
||||||
630
Content/Tutoriais/qr-code-para-corretores-imoveis.en.md
Normal file
630
Content/Tutoriais/qr-code-para-corretores-imoveis.en.md
Normal file
@ -0,0 +1,630 @@
|
|||||||
|
---
|
||||||
|
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!**
|
||||||
@ -16,8 +16,8 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Route("Developer/docs")]
|
[Route("Developer/docs")]
|
||||||
[Route("es-PY/Developer/docs")]
|
|
||||||
[Route("es/Developer/docs")]
|
[Route("es/Developer/docs")]
|
||||||
|
[Route("en/Developer/docs")]
|
||||||
public async Task<IActionResult> Index()
|
public async Task<IActionResult> Index()
|
||||||
{
|
{
|
||||||
var culture = GetCulture();
|
var culture = GetCulture();
|
||||||
@ -27,8 +27,8 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Route("Developer/docs/{slug}")]
|
[Route("Developer/docs/{slug}")]
|
||||||
[Route("es-PY/Developer/docs/{slug}")]
|
|
||||||
[Route("es/Developer/docs/{slug}")]
|
[Route("es/Developer/docs/{slug}")]
|
||||||
|
[Route("en/Developer/docs/{slug}")]
|
||||||
public async Task<IActionResult> Article(string slug)
|
public async Task<IActionResult> Article(string slug)
|
||||||
{
|
{
|
||||||
var culture = GetCulture();
|
var culture = GetCulture();
|
||||||
@ -54,9 +54,10 @@ namespace QRRapidoApp.Controllers
|
|||||||
private string GetCulture()
|
private string GetCulture()
|
||||||
{
|
{
|
||||||
var path = Request.Path.Value ?? "";
|
var path = Request.Path.Value ?? "";
|
||||||
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
|
|
||||||
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
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";
|
return "pt-BR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,9 @@ using System.Security.Claims;
|
|||||||
namespace QRRapidoApp.Controllers
|
namespace QRRapidoApp.Controllers
|
||||||
{
|
{
|
||||||
[Authorize]
|
[Authorize]
|
||||||
|
[Route("Developer")]
|
||||||
|
[Route("es/Developer")]
|
||||||
|
[Route("en/Developer")]
|
||||||
public class DeveloperController : Controller
|
public class DeveloperController : Controller
|
||||||
{
|
{
|
||||||
private readonly IUserService _userService;
|
private readonly IUserService _userService;
|
||||||
@ -23,7 +26,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet("")]
|
||||||
public async Task<IActionResult> Index()
|
public async Task<IActionResult> Index()
|
||||||
{
|
{
|
||||||
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
||||||
@ -36,7 +39,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
return View(user);
|
return View(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost("GenerateKey")]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public async Task<IActionResult> GenerateKey(string keyName)
|
public async Task<IActionResult> GenerateKey(string keyName)
|
||||||
{
|
{
|
||||||
@ -46,7 +49,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
if (string.IsNullOrWhiteSpace(keyName) || keyName.Length > 50)
|
if (string.IsNullOrWhiteSpace(keyName) || keyName.Length > 50)
|
||||||
{
|
{
|
||||||
TempData["Error"] = "Nome da chave inválido (máx. 50 caracteres).";
|
TempData["Error"] = "Nome da chave inválido (máx. 50 caracteres).";
|
||||||
return RedirectToAction(nameof(Index));
|
return Redirect(GetDevUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
var user = await _userService.GetUserAsync(userId);
|
var user = await _userService.GetUserAsync(userId);
|
||||||
@ -55,7 +58,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
if (user.ApiKeys.Count(k => k.IsActive) >= 5)
|
if (user.ApiKeys.Count(k => k.IsActive) >= 5)
|
||||||
{
|
{
|
||||||
TempData["Error"] = "Limite de 5 chaves ativas atingido. Revogue uma antes de criar outra.";
|
TempData["Error"] = "Limite de 5 chaves ativas atingido. Revogue uma antes de criar outra.";
|
||||||
return RedirectToAction(nameof(Index));
|
return Redirect(GetDevUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
var (rawKey, prefix) = await _userService.GenerateApiKeyAsync(userId, keyName.Trim());
|
var (rawKey, prefix) = await _userService.GenerateApiKeyAsync(userId, keyName.Trim());
|
||||||
@ -67,7 +70,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
return RedirectToAction(nameof(Index));
|
return RedirectToAction(nameof(Index));
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet("Pricing")]
|
||||||
public async Task<IActionResult> Pricing()
|
public async Task<IActionResult> Pricing()
|
||||||
{
|
{
|
||||||
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
||||||
@ -80,7 +83,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost("SubscribeApi")]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public async Task<IActionResult> SubscribeApi(string planTier)
|
public async Task<IActionResult> SubscribeApi(string planTier)
|
||||||
{
|
{
|
||||||
@ -92,7 +95,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
tier == ApiPlanTier.Enterprise)
|
tier == ApiPlanTier.Enterprise)
|
||||||
{
|
{
|
||||||
TempData["Error"] = "Plano inválido selecionado.";
|
TempData["Error"] = "Plano inválido selecionado.";
|
||||||
return RedirectToAction(nameof(Pricing));
|
return Redirect(GetDevUrl("Pricing"));
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -105,11 +108,11 @@ namespace QRRapidoApp.Controllers
|
|||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error creating API subscription checkout for user {UserId}", userId);
|
_logger.LogError(ex, "Error creating API subscription checkout for user {UserId}", userId);
|
||||||
TempData["Error"] = "Erro ao criar sessão de pagamento. Tente novamente.";
|
TempData["Error"] = "Erro ao criar sessão de pagamento. Tente novamente.";
|
||||||
return RedirectToAction(nameof(Pricing));
|
return Redirect(GetDevUrl("Pricing"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost("RevokeKey")]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public async Task<IActionResult> RevokeKey(string prefix)
|
public async Task<IActionResult> RevokeKey(string prefix)
|
||||||
{
|
{
|
||||||
@ -119,7 +122,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
if (string.IsNullOrWhiteSpace(prefix))
|
if (string.IsNullOrWhiteSpace(prefix))
|
||||||
{
|
{
|
||||||
TempData["Error"] = "Chave inválida.";
|
TempData["Error"] = "Chave inválida.";
|
||||||
return RedirectToAction(nameof(Index));
|
return Redirect(GetDevUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
var revoked = await _userService.RevokeApiKeyAsync(userId, prefix);
|
var revoked = await _userService.RevokeApiKeyAsync(userId, prefix);
|
||||||
@ -139,10 +142,21 @@ namespace QRRapidoApp.Controllers
|
|||||||
private string GetCulture()
|
private string GetCulture()
|
||||||
{
|
{
|
||||||
var path = Request.Path.Value ?? "";
|
var path = Request.Path.Value ?? "";
|
||||||
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
|
|
||||||
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
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";
|
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}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,10 +35,11 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Home page routes
|
// Home page routes
|
||||||
// "/" → Portuguese (canonical)
|
// "/" → Portuguese (canonical)
|
||||||
// "/es-PY" → Spanish
|
// "/es" → Spanish
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("/")]
|
[Route("/")]
|
||||||
[Route("es-PY")]
|
[Route("es")]
|
||||||
|
[Route("en")]
|
||||||
public async Task<IActionResult> Index(string? qrType = null)
|
public async Task<IActionResult> Index(string? qrType = null)
|
||||||
{
|
{
|
||||||
var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
||||||
@ -112,40 +113,48 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Dedicated SEO Routes - Landing pages for each QR type
|
// Dedicated SEO Routes - Landing pages for each QR type
|
||||||
// Portuguese (default): /pix, /wifi, etc. (no culture prefix)
|
// Portuguese (default): /pix, /wifi, etc. (no culture prefix)
|
||||||
// Spanish: /es-PY/pix, /es-PY/wifi, etc.
|
// Spanish: /es/pix, /es/wifi, etc.
|
||||||
|
|
||||||
[Route("pix")]
|
[Route("pix")]
|
||||||
[Route("es-PY/pix")]
|
[Route("es/pix")]
|
||||||
|
[Route("en/pix")]
|
||||||
public async Task<IActionResult> Pix() => await Index("pix");
|
public async Task<IActionResult> Pix() => await Index("pix");
|
||||||
|
|
||||||
[Route("wifi")]
|
[Route("wifi")]
|
||||||
[Route("es-PY/wifi")]
|
[Route("es/wifi")]
|
||||||
|
[Route("en/wifi")]
|
||||||
public async Task<IActionResult> Wifi() => await Index("wifi");
|
public async Task<IActionResult> Wifi() => await Index("wifi");
|
||||||
|
|
||||||
[Route("vcard")]
|
[Route("vcard")]
|
||||||
[Route("es-PY/vcard")]
|
[Route("es/vcard")]
|
||||||
|
[Route("en/vcard")]
|
||||||
public async Task<IActionResult> VCard() => await Index("vcard");
|
public async Task<IActionResult> VCard() => await Index("vcard");
|
||||||
|
|
||||||
[Route("whatsapp")]
|
[Route("whatsapp")]
|
||||||
[Route("es-PY/whatsapp")]
|
[Route("es/whatsapp")]
|
||||||
|
[Route("en/whatsapp")]
|
||||||
public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
|
public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
|
||||||
|
|
||||||
[Route("email")]
|
[Route("email")]
|
||||||
[Route("es-PY/email")]
|
[Route("es/email")]
|
||||||
|
[Route("en/email")]
|
||||||
public async Task<IActionResult> Email() => await Index("email");
|
public async Task<IActionResult> Email() => await Index("email");
|
||||||
|
|
||||||
[Route("sms")]
|
[Route("sms")]
|
||||||
[Route("es-PY/sms")]
|
[Route("es/sms")]
|
||||||
|
[Route("en/sms")]
|
||||||
public async Task<IActionResult> Sms() => await Index("sms");
|
public async Task<IActionResult> Sms() => await Index("sms");
|
||||||
|
|
||||||
[Route("texto")]
|
[Route("texto")]
|
||||||
[Route("text")]
|
[Route("text")]
|
||||||
[Route("es-PY/texto")]
|
[Route("es/texto")]
|
||||||
[Route("es-PY/text")]
|
[Route("es/text")]
|
||||||
|
[Route("en/text")]
|
||||||
public async Task<IActionResult> Text() => await Index("text");
|
public async Task<IActionResult> Text() => await Index("text");
|
||||||
|
|
||||||
[Route("url")]
|
[Route("url")]
|
||||||
[Route("es-PY/url")]
|
[Route("es/url")]
|
||||||
|
[Route("en/url")]
|
||||||
public async Task<IActionResult> UrlType() => await Index("url");
|
public async Task<IActionResult> UrlType() => await Index("url");
|
||||||
|
|
||||||
public IActionResult Privacy()
|
public IActionResult Privacy()
|
||||||
@ -325,7 +334,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Core entry points
|
// Core entry points
|
||||||
AppendUrl("/", "daily", "1.0");
|
AppendUrl("/", "daily", "1.0");
|
||||||
AppendUrl("/es-PY", "daily", "0.9");
|
AppendUrl("/es", "daily", "0.9");
|
||||||
|
|
||||||
// Tools (Landing Pages)
|
// Tools (Landing Pages)
|
||||||
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
|
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
|
||||||
@ -333,7 +342,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
foreach (var tool in tools)
|
foreach (var tool in tools)
|
||||||
{
|
{
|
||||||
AppendUrl($"/{tool}", "weekly", "0.9");
|
AppendUrl($"/{tool}", "weekly", "0.9");
|
||||||
AppendUrl($"/es-PY/{tool}", "weekly", "0.8");
|
AppendUrl($"/es/{tool}", "weekly", "0.8");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Informational pages
|
// Informational pages
|
||||||
@ -350,7 +359,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
foreach (var page in informationalPages)
|
foreach (var page in informationalPages)
|
||||||
{
|
{
|
||||||
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
|
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
|
||||||
AppendUrl($"/es-PY/{page.Path}", page.ChangeFreq, page.Priority);
|
AppendUrl($"/es/{page.Path}", page.ChangeFreq, page.Priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dynamic tutorial pages from Markdown
|
// Dynamic tutorial pages from Markdown
|
||||||
@ -370,7 +379,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
var tutorialPath = article.Culture == "pt-BR"
|
var tutorialPath = article.Culture == "pt-BR"
|
||||||
? $"/tutoriais/{encodedSlug}"
|
? $"/tutoriais/{encodedSlug}"
|
||||||
: $"/es-PY/tutoriais/{encodedSlug}";
|
: $"/es/tutoriais/{encodedSlug}";
|
||||||
|
|
||||||
var lastMod = article.LastMod.ToString("yyyy-MM-dd");
|
var lastMod = article.LastMod.ToString("yyyy-MM-dd");
|
||||||
AppendUrl(tutorialPath, "weekly", "0.8", lastMod);
|
AppendUrl(tutorialPath, "weekly", "0.8", lastMod);
|
||||||
|
|||||||
@ -28,18 +28,19 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Portuguese: /tutoriais/{slug} (canonical, no prefix)
|
// Portuguese: /tutoriais/{slug} (canonical, no prefix)
|
||||||
// Spanish: /es-PY/tutoriais/{slug}
|
// Spanish: /es/tutoriais/{slug}
|
||||||
|
// English: /en/tutoriais/{slug}
|
||||||
[Route("tutoriais/{slug}")]
|
[Route("tutoriais/{slug}")]
|
||||||
[Route("es-PY/tutoriais/{slug}")]
|
|
||||||
[Route("es/tutoriais/{slug}")]
|
[Route("es/tutoriais/{slug}")]
|
||||||
|
[Route("en/tutoriais/{slug}")]
|
||||||
public async Task<IActionResult> Article(string slug, string? culture = null)
|
public async Task<IActionResult> Article(string slug, string? culture = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Determine culture from URL path if not provided
|
// Determine culture from URL path if not provided
|
||||||
var reqPath = Request.Path.Value ?? "";
|
var reqPath = Request.Path.Value ?? "";
|
||||||
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
|
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
||||||
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
||||||
: "pt-BR";
|
: "pt-BR";
|
||||||
|
|
||||||
var article = await _markdownService.GetArticleAsync(slug, culture);
|
var article = await _markdownService.GetArticleAsync(slug, culture);
|
||||||
@ -88,18 +89,19 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Portuguese: /tutoriais (canonical, no prefix)
|
// Portuguese: /tutoriais (canonical, no prefix)
|
||||||
// Spanish: /es-PY/tutoriais
|
// Spanish: /es/tutoriais
|
||||||
|
// English: /en/tutoriais
|
||||||
[Route("tutoriais")]
|
[Route("tutoriais")]
|
||||||
[Route("es-PY/tutoriais")]
|
|
||||||
[Route("es/tutoriais")]
|
[Route("es/tutoriais")]
|
||||||
|
[Route("en/tutoriais")]
|
||||||
public async Task<IActionResult> Index(string? culture = null)
|
public async Task<IActionResult> Index(string? culture = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Determine culture from URL path if not provided
|
// Determine culture from URL path if not provided
|
||||||
var reqPath = Request.Path.Value ?? "";
|
var reqPath = Request.Path.Value ?? "";
|
||||||
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
|
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
||||||
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
||||||
: "pt-BR";
|
: "pt-BR";
|
||||||
|
|
||||||
var articles = await _markdownService.GetAllArticlesAsync(culture);
|
var articles = await _markdownService.GetAllArticlesAsync(culture);
|
||||||
@ -112,9 +114,13 @@ namespace QRRapidoApp.Controllers
|
|||||||
ViewBag.UserName = User.Identity?.Name ?? "";
|
ViewBag.UserName = User.Identity?.Name ?? "";
|
||||||
_adDisplayService.SetViewBagAds(ViewBag);
|
_adDisplayService.SetViewBagAds(ViewBag);
|
||||||
|
|
||||||
ViewBag.Title = culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR";
|
ViewBag.Title = culture == "pt-BR" ? "Tutoriais QR Code"
|
||||||
|
: culture == "en" ? "QR Code Tutorials"
|
||||||
|
: "Tutoriales Código QR";
|
||||||
ViewBag.Description = culture == "pt-BR"
|
ViewBag.Description = culture == "pt-BR"
|
||||||
? "Aprenda a criar e usar QR Codes com nossos tutoriais completos"
|
? "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";
|
: "Aprende a crear y usar códigos QR con nuestros tutoriales completos";
|
||||||
ViewBag.Culture = culture;
|
ViewBag.Culture = culture;
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,16 @@ namespace QRRapidoApp.Filters
|
|||||||
|
|
||||||
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
|
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>>();
|
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ApiKeyAuthorizeAttribute>>();
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|||||||
@ -9,14 +9,15 @@ namespace QRRapidoApp.Middleware
|
|||||||
/// Comportamento:
|
/// Comportamento:
|
||||||
/// - "/" → Retorna 200 OK em Português (canonical)
|
/// - "/" → Retorna 200 OK em Português (canonical)
|
||||||
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
|
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
|
||||||
/// - "/es-PY" ou "/es-PY/*" → Retorna 200 OK em Espanhol (mantém URL)
|
/// - "/es" ou "/es/*" → Retorna 200 OK em Espanhol (mantém URL)
|
||||||
|
/// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL)
|
||||||
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
|
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LanguageRedirectionMiddleware
|
public class LanguageRedirectionMiddleware
|
||||||
{
|
{
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
private readonly ILogger<LanguageRedirectionMiddleware> _logger;
|
private readonly ILogger<LanguageRedirectionMiddleware> _logger;
|
||||||
private readonly string[] _supportedCultures = { "pt-BR", "es-PY", "es" };
|
private readonly string[] _supportedCultures = { "pt-BR", "es", "en" };
|
||||||
private const string DefaultCulture = "pt-BR";
|
private const string DefaultCulture = "pt-BR";
|
||||||
private const string CookieName = ".AspNetCore.Culture";
|
private const string CookieName = ".AspNetCore.Culture";
|
||||||
|
|
||||||
@ -68,14 +69,6 @@ namespace QRRapidoApp.Middleware
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Supported: es-PY
|
|
||||||
if (string.Equals(firstSegment, "es-PY", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
SetCulture(context, "es-PY");
|
|
||||||
await _next(context);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Supported: es (Spanish neutral)
|
// Supported: es (Spanish neutral)
|
||||||
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
@ -84,7 +77,15 @@ namespace QRRapidoApp.Middleware
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle aliases or unsupported cultures (e.g. /en/, /pt/)
|
// 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/)
|
||||||
if (TryHandleCultureAliasOrUnknown(context, firstSegment, segments))
|
if (TryHandleCultureAliasOrUnknown(context, firstSegment, segments))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@ -108,13 +109,14 @@ namespace QRRapidoApp.Middleware
|
|||||||
{
|
{
|
||||||
// Map known aliases to canonical forms
|
// Map known aliases to canonical forms
|
||||||
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
return RedirectToLanguage(context, "es", segments);
|
||||||
return RedirectToLanguage(context, "es-PY", segments);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For anything else that looks like a culture (en, pt, fr, etc.)
|
if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) ||
|
||||||
// but isn't explicitly es-PY, we redirect to the canonical (no prefix)
|
string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase))
|
||||||
// This prevents 404s for /en/, /pt-BR/ (redirects to /), etc.
|
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).
|
||||||
return RedirectToCanonical(context, segments);
|
return RedirectToCanonical(context, segments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -224,8 +224,8 @@ builder.Services.Configure<RequestLocalizationOptions>(options =>
|
|||||||
var supportedCultures = new[]
|
var supportedCultures = new[]
|
||||||
{
|
{
|
||||||
new CultureInfo("pt-BR"),
|
new CultureInfo("pt-BR"),
|
||||||
new CultureInfo("es-PY"),
|
|
||||||
new CultureInfo("es"),
|
new CultureInfo("es"),
|
||||||
|
new CultureInfo("en"),
|
||||||
};
|
};
|
||||||
|
|
||||||
options.DefaultRequestCulture = new RequestCulture("pt-BR", "pt-BR");
|
options.DefaultRequestCulture = new RequestCulture("pt-BR", "pt-BR");
|
||||||
@ -463,7 +463,7 @@ app.MapHealthChecks("/healthcheck");
|
|||||||
// Language routes (must be first for WEB)
|
// Language routes (must be first for WEB)
|
||||||
app.MapControllerRoute(
|
app.MapControllerRoute(
|
||||||
name: "localized",
|
name: "localized",
|
||||||
pattern: "{culture:regex(^(pt-BR|es-PY|es)$)}/{controller=Home}/{action=Index}/{id?}");
|
pattern: "{culture:regex(^(pt-BR|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
|
||||||
|
|
||||||
app.MapControllerRoute(
|
app.MapControllerRoute(
|
||||||
name: "api_v1",
|
name: "api_v1",
|
||||||
|
|||||||
@ -6,10 +6,10 @@ namespace QRRapidoApp.Providers
|
|||||||
{
|
{
|
||||||
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
|
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
|
||||||
{
|
{
|
||||||
// First check if the middleware has already determined the culture (e.g. for static routes like /es-PY/pix)
|
// First check if the middleware has already determined the culture (e.g. for static routes like /es/pix)
|
||||||
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
|
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
|
||||||
{
|
{
|
||||||
var supportedCultures = new[] { "pt-BR", "es-PY" };
|
var supportedCultures = new[] { "pt-BR", "es", "en" };
|
||||||
if (supportedCultures.Contains(cultureFromMiddleware))
|
if (supportedCultures.Contains(cultureFromMiddleware))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
|
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
|
||||||
@ -24,7 +24,7 @@ namespace QRRapidoApp.Providers
|
|||||||
if (!string.IsNullOrEmpty(culture))
|
if (!string.IsNullOrEmpty(culture))
|
||||||
{
|
{
|
||||||
// Map the supported cultures
|
// Map the supported cultures
|
||||||
var supportedCultures = new[] { "pt-BR", "es-PY" };
|
var supportedCultures = new[] { "pt-BR", "es", "en" };
|
||||||
if (supportedCultures.Contains(culture))
|
if (supportedCultures.Contains(culture))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));
|
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -2104,7 +2104,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<!-- Tutorial Section -->
|
<!-- Tutorial Section -->
|
||||||
<data name="ViewTutorials" xml:space="preserve">
|
<data name="ViewTutorials" xml:space="preserve">
|
||||||
<value>Ver Tutoriales</value>
|
<value>Tutoriales QR</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnMore" xml:space="preserve">
|
<data name="LearnMore" xml:space="preserve">
|
||||||
<value>Aprende Más</value>
|
<value>Aprende Más</value>
|
||||||
@ -2113,7 +2113,7 @@
|
|||||||
<value>Guías completas sobre códigos QR</value>
|
<value>Guías completas sobre códigos QR</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewAllTutorials" xml:space="preserve">
|
<data name="ViewAllTutorials" xml:space="preserve">
|
||||||
<value>Ver Todos los Tutoriales</value>
|
<value>Tutoriales QR</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RealEstateAndBrokers" xml:space="preserve">
|
<data name="RealEstateAndBrokers" xml:space="preserve">
|
||||||
<value>Inmobiliaria y Corredores</value>
|
<value>Inmobiliaria y Corredores</value>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -2257,7 +2257,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<!-- Tutorial Section -->
|
<!-- Tutorial Section -->
|
||||||
<data name="ViewTutorials" xml:space="preserve">
|
<data name="ViewTutorials" xml:space="preserve">
|
||||||
<value>Ver Tutoriais</value>
|
<value>Tutoriais QR</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnMore" xml:space="preserve">
|
<data name="LearnMore" xml:space="preserve">
|
||||||
<value>Aprenda Mais</value>
|
<value>Aprenda Mais</value>
|
||||||
@ -2266,7 +2266,7 @@
|
|||||||
<value>Guias completos sobre QR Codes</value>
|
<value>Guias completos sobre QR Codes</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewAllTutorials" xml:space="preserve">
|
<data name="ViewAllTutorials" xml:space="preserve">
|
||||||
<value>Ver Todos os Tutoriais</value>
|
<value>Tutoriais QR</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RealEstateAndBrokers" xml:space="preserve">
|
<data name="RealEstateAndBrokers" xml:space="preserve">
|
||||||
<value>Imóveis e Corretores</value>
|
<value>Imóveis e Corretores</value>
|
||||||
|
|||||||
@ -3,19 +3,19 @@
|
|||||||
ViewData["Title"] = Model.Metadata.Title + " — QRRapido Docs";
|
ViewData["Title"] = Model.Metadata.Title + " — QRRapido Docs";
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
|
|
||||||
var culture = ViewBag.Culture as string ?? "pt-BR";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = culture == "es-PY";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
var slug = ViewBag.Slug as string;
|
var slug = ViewBag.Slug as string;
|
||||||
|
|
||||||
string T(string pt, string es) => isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container mt-4 mb-5">
|
<div class="container mt-4 mb-5">
|
||||||
|
|
||||||
<nav aria-label="breadcrumb" class="mb-4">
|
<nav aria-label="breadcrumb" class="mb-4">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="@devBase">@T("Portal do Desenvolvedor", "Portal del Desarrollador")</a></li>
|
<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/docs">Docs</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>
|
<li class="breadcrumb-item active" aria-current="page">@Model.Metadata.Title</li>
|
||||||
</ol>
|
</ol>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
<header class="mb-4">
|
<header class="mb-4">
|
||||||
<h1 class="mb-3">@Model.Metadata.Title</h1>
|
<h1 class="mb-3">@Model.Metadata.Title</h1>
|
||||||
<p class="text-muted small">
|
<p class="text-muted small">
|
||||||
<i class="fas fa-clock me-1"></i> @Model.Metadata.ReadingTimeMinutes @T("min de leitura", "min de lectura")
|
<i class="fas fa-clock me-1"></i> @Model.Metadata.ReadingTimeMinutes @T("min de leitura", "min de lectura", "min read")
|
||||||
·
|
·
|
||||||
<i class="fas fa-calendar me-1"></i> @Model.Metadata.Date.ToString("dd/MM/yyyy")
|
<i class="fas fa-calendar me-1"></i> @Model.Metadata.Date.ToString("dd/MM/yyyy")
|
||||||
</p>
|
</p>
|
||||||
@ -40,7 +40,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer class="mt-5 pt-3 border-top">
|
<footer class="mt-5 pt-3 border-top">
|
||||||
<small class="text-muted">@T("Última atualização:", "Última actualización:") @Model.Metadata.LastMod.ToString("dd/MM/yyyy")</small>
|
<small class="text-muted">@T("Última atualização:", "Última actualización:", "Last updated:") @Model.Metadata.LastMod.ToString("dd/MM/yyyy")</small>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
@ -48,20 +48,20 @@
|
|||||||
|
|
||||||
<div class="card border-0 shadow-sm mb-4">
|
<div class="card border-0 shadow-sm mb-4">
|
||||||
<div class="card-header bg-primary text-white py-2">
|
<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")</h6>
|
<h6 class="mb-0"><i class="fas fa-rocket me-2"></i>@T("Links Rápidos", "Links Pya'e", "Quick Links")</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-group list-group-flush">
|
<div class="list-group list-group-flush">
|
||||||
<a href="@devBase" class="list-group-item list-group-item-action small">
|
<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")
|
<i class="fas fa-key me-2 text-primary"></i>@T("Minhas Chaves de API", "Mis Claves de API", "My API Keys")
|
||||||
</a>
|
</a>
|
||||||
<a href="/api/docs" target="_blank" class="list-group-item list-group-item-action small">
|
<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
|
<i class="fas fa-code me-2 text-success"></i>Swagger / OpenAPI
|
||||||
</a>
|
</a>
|
||||||
<a href="@devBase/Pricing" class="list-group-item list-group-item-action small">
|
<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")
|
<i class="fas fa-arrow-up me-2 text-warning"></i>@T("Planos de API", "Planes de API", "API Plans")
|
||||||
</a>
|
</a>
|
||||||
<a href="@devBase/docs" class="list-group-item list-group-item-action small">
|
<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")
|
<i class="fas fa-book me-2 text-info"></i>@T("Todos os Tutoriais", "Todos los Tutoriales", "All Tutorials")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -70,7 +70,7 @@
|
|||||||
{
|
{
|
||||||
<div class="card border-0 shadow-sm">
|
<div class="card border-0 shadow-sm">
|
||||||
<div class="card-header bg-white py-2">
|
<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")</h6>
|
<h6 class="mb-0"><i class="fas fa-bookmark me-2 text-secondary"></i>@T("Outros Tutoriais", "Otros Tutoriales", "Other Tutorials")</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-group list-group-flush">
|
<div class="list-group list-group-flush">
|
||||||
@foreach (var related in Model.RelatedArticles)
|
@foreach (var related in Model.RelatedArticles)
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
ViewData["Title"] = "Docs & Tutoriais para Desenvolvedores";
|
ViewData["Title"] = "Docs & Tutoriais para Desenvolvedores";
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
|
|
||||||
var culture = ViewBag.Culture as string ?? "pt-BR";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = culture == "es-PY";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es) => isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container mt-4 mb-5">
|
<div class="container mt-4 mb-5">
|
||||||
@ -16,13 +16,13 @@
|
|||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="me-3"><i class="fas fa-book-open fa-2x text-primary"></i></div>
|
<div class="me-3"><i class="fas fa-book-open fa-2x text-primary"></i></div>
|
||||||
<div>
|
<div>
|
||||||
<h1 class="h3 mb-0">@T("Docs & Tutoriais", "Docs & Tutoriales")</h1>
|
<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.")</p>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex gap-2">
|
<div class="d-flex gap-2">
|
||||||
<a href="@devBase" class="btn btn-outline-secondary btn-sm">
|
<a href="@devBase" class="btn btn-outline-secondary btn-sm">
|
||||||
<i class="fas fa-key me-1"></i> @T("Minhas Chaves", "Mis Claves")
|
<i class="fas fa-key me-1"></i> @T("Minhas Chaves", "Mis Claves", "My Keys")
|
||||||
</a>
|
</a>
|
||||||
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
|
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
|
||||||
<i class="fas fa-code me-1"></i> Swagger
|
<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>
|
<p class="card-text text-muted flex-grow-1 small">@article.Description</p>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<small class="text-muted">
|
<small class="text-muted">
|
||||||
<i class="fas fa-clock me-1"></i> @article.ReadingTimeMinutes @T("min de leitura", "min de lectura")
|
<i class="fas fa-clock me-1"></i> @article.ReadingTimeMinutes @T("min de leitura", "min de lectura", "min read")
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<a href="@devBase/docs/@article.Slug" class="btn btn-primary btn-sm">
|
<a href="@devBase/docs/@article.Slug" class="btn btn-primary btn-sm">
|
||||||
@T("Ler", "Leer") <i class="fas fa-arrow-right ms-1"></i>
|
@T("Ler", "Leer", "Read") <i class="fas fa-arrow-right ms-1"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -58,7 +58,7 @@
|
|||||||
{
|
{
|
||||||
<div class="text-center py-5">
|
<div class="text-center py-5">
|
||||||
<i class="fas fa-book fa-3x text-muted opacity-25 mb-3"></i>
|
<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.")</p>
|
<p class="text-muted">@T("Nenhum artigo encontrado.", "Ningún artículo encontrado.", "No articles found.")</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -12,11 +12,11 @@
|
|||||||
var revokedKeys = Model.ApiKeys.Where(k => !k.IsActive).OrderByDescending(k => k.CreatedAt).ToList();
|
var revokedKeys = Model.ApiKeys.Where(k => !k.IsActive).OrderByDescending(k => k.CreatedAt).ToList();
|
||||||
|
|
||||||
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
|
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
|
||||||
var culture = ViewBag.Culture as string ?? "pt-BR";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = culture == "es-PY";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var docsBase = isEs ? "/es-PY/Developer" : "/Developer";
|
var docsBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es) => isEs ? es : pt;
|
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container mt-4 mb-5">
|
<div class="container mt-4 mb-5">
|
||||||
@ -28,29 +28,30 @@
|
|||||||
<i class="fas fa-code fa-2x text-primary"></i>
|
<i class="fas fa-code fa-2x text-primary"></i>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 class="h3 mb-0">@T("Portal do Desenvolvedor", "Portal del Desarrollador")</h1>
|
<h1 class="h3 mb-0">@T("Portal do Desenvolvedor", "Portal del Desarrollador", "Developer Portal")</h1>
|
||||||
<p class="text-muted mb-0 small">
|
<p class="text-muted mb-0 small">
|
||||||
@T("Gerencie suas chaves de API e integre o QR Rapido nas suas aplicações.",
|
@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.")
|
"Gestioná tus claves de API ha integrá QR Rapido en tus aplicaciones.",
|
||||||
|
"Manage your API keys and integrate QR Rapido into your applications.")
|
||||||
@{
|
@{
|
||||||
var tier = Model.ApiSubscription?.EffectiveTier ?? QRRapidoApp.Models.ApiPlanTier.Free;
|
var tier = Model.ApiSubscription?.EffectiveTier ?? QRRapidoApp.Models.ApiPlanTier.Free;
|
||||||
var tierLabel = tier == QRRapidoApp.Models.ApiPlanTier.Free
|
var tierLabel = tier == QRRapidoApp.Models.ApiPlanTier.Free
|
||||||
? "<span class='badge bg-secondary ms-2'>Free</span>"
|
? "<span class='badge bg-secondary ms-2'>Free</span>"
|
||||||
: $"<span class='badge bg-primary ms-2'>{tier}</span>";
|
: $"<span class='badge bg-primary ms-2'>{tier}</span>";
|
||||||
}
|
}
|
||||||
@T("Plano atual:", "Plan actual:") @Html.Raw(tierLabel)
|
@T("Plano atual:", "Plan actual:", "Current plan:") @Html.Raw(tierLabel)
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex gap-2">
|
<div class="d-flex gap-2">
|
||||||
<a href="@docsBase/docs" class="btn btn-outline-info btn-sm">
|
<a href="@docsBase/docs" class="btn btn-outline-info btn-sm">
|
||||||
<i class="fas fa-book me-1"></i> @T("Tutoriais", "Tutoriales")
|
<i class="fas fa-book me-1"></i> Docs API
|
||||||
</a>
|
</a>
|
||||||
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
|
<a href="/api/docs" target="_blank" class="btn btn-outline-success btn-sm">
|
||||||
<i class="fas fa-code me-1"></i> Swagger
|
<i class="fas fa-code me-1"></i> Swagger
|
||||||
</a>
|
</a>
|
||||||
<a href="@docsBase/Pricing" class="btn btn-outline-primary btn-sm">
|
<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")
|
<i class="fas fa-arrow-up me-1"></i> @T("Ver Planos de API", "Ver Planes de API", "API Plans")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -5,24 +5,25 @@
|
|||||||
|
|
||||||
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
|
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
|
||||||
var errorMsg = TempData["Error"] as string;
|
var errorMsg = TempData["Error"] as string;
|
||||||
var culture = ViewBag.Culture as string ?? "pt-BR";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = culture == "es-PY";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es) => isEs ? es : pt;
|
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container mt-4 mb-5">
|
<div class="container mt-4 mb-5">
|
||||||
|
|
||||||
<div class="text-center mb-5">
|
<div class="text-center mb-5">
|
||||||
<h1 class="h2 fw-bold">@T("Planos de API", "Planes de API")</h1>
|
<h1 class="h2 fw-bold">@T("Planos de API", "Planes de API", "API Plans")</h1>
|
||||||
<p class="text-muted">
|
<p class="text-muted">
|
||||||
@T("Escolha o plano que melhor se adapta à sua integração.",
|
@T("Escolha o plano que melhor se adapta à sua integração.",
|
||||||
"Elegí el plan porã que mejor se adapte a tu integración.")
|
"Elegí el plan porã que mejor se adapte a tu integración.",
|
||||||
|
"Choose the plan that best fits your integration.")
|
||||||
<br>
|
<br>
|
||||||
@T("Todos os planos incluem a", "Todos los planes incluyen la")
|
@T("Todos os planos incluem a", "Todos los planes incluyen la", "All plans include the")
|
||||||
<strong>API REST</strong>
|
<strong>API REST</strong>
|
||||||
@T("com autenticação por chave.", "con autenticación por clave.")
|
@T("com autenticação por chave.", "con autenticación por clave.", "with key authentication.")
|
||||||
</p>
|
</p>
|
||||||
@if (!string.IsNullOrEmpty(errorMsg))
|
@if (!string.IsNullOrEmpty(errorMsg))
|
||||||
{
|
{
|
||||||
@ -174,7 +175,7 @@
|
|||||||
|
|
||||||
<div class="text-center mt-3">
|
<div class="text-center mt-3">
|
||||||
<a href="@devBase" class="btn btn-outline-secondary">
|
<a href="@devBase" class="btn btn-outline-secondary">
|
||||||
<i class="fas fa-arrow-left me-2"></i>@T("Voltar ao Portal", "Volver al Portal")
|
<i class="fas fa-arrow-left me-2"></i>@T("Voltar ao Portal", "Volver al Portal", "Back to Portal")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -4,6 +4,10 @@
|
|||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Comprar Créditos";
|
ViewData["Title"] = "Comprar Créditos";
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
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">
|
<div class="container py-5">
|
||||||
@ -34,10 +38,13 @@
|
|||||||
|
|
||||||
<!-- Preços Duplos -->
|
<!-- Preços Duplos -->
|
||||||
<div class="bg-light rounded p-3 mb-4">
|
<div class="bg-light rounded p-3 mb-4">
|
||||||
<div class="d-flex justify-content-between align-items-center mb-2">
|
@if (isBrazilian)
|
||||||
<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 class="d-flex justify-content-between align-items-center mb-2">
|
||||||
</div>
|
<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">
|
<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="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>
|
<span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span>
|
||||||
@ -53,11 +60,14 @@
|
|||||||
@if (User.Identity.IsAuthenticated)
|
@if (User.Identity.IsAuthenticated)
|
||||||
{
|
{
|
||||||
<div class="d-grid gap-2 mt-auto">
|
<div class="d-grid gap-2 mt-auto">
|
||||||
<button class="btn btn-outline-success btn-pix-checkout"
|
@if (isBrazilian)
|
||||||
data-package-id="@package.Id">
|
{
|
||||||
<i class="fas fa-qrcode me-2"></i> Pagar com PIX
|
<button class="btn btn-outline-success btn-pix-checkout"
|
||||||
</button>
|
data-package-id="@package.Id">
|
||||||
<button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout"
|
<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">
|
data-package-id="@package.Id">
|
||||||
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão
|
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -18,33 +18,37 @@
|
|||||||
var appEnvironment = Configuration["App:Environment"] ?? HostEnvironment?.EnvironmentName ?? "Unknown";
|
var appEnvironment = Configuration["App:Environment"] ?? HostEnvironment?.EnvironmentName ?? "Unknown";
|
||||||
var secretsLoaded = Configuration.GetValue<bool>("App:SecretsLoaded");
|
var secretsLoaded = Configuration.GetValue<bool>("App:SecretsLoaded");
|
||||||
|
|
||||||
// SEO: Determine if current page is Spanish (for URL building)
|
// SEO: Determine current culture from URL
|
||||||
var requestPath = Context.Request.Path.Value ?? "/";
|
var requestPath = Context.Request.Path.Value ?? "/";
|
||||||
var isSpanish = requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase);
|
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);
|
||||||
|
|
||||||
// Get path without culture prefix for building alternate URLs
|
// Get path without culture prefix for building alternate URLs
|
||||||
var pathWithoutCulture = requestPath;
|
var pathWithoutCulture = requestPath;
|
||||||
if (isSpanish && requestPath.Length > 6)
|
if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
||||||
pathWithoutCulture = requestPath.Substring(6); // Remove "/es-PY"
|
else if (string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase))
|
||||||
}
|
|
||||||
else if (isSpanish)
|
|
||||||
{
|
|
||||||
pathWithoutCulture = "/";
|
pathWithoutCulture = "/";
|
||||||
}
|
else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase))
|
||||||
|
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
||||||
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
|
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
|
||||||
|
|
||||||
// Canonical URL - for Portuguese it's without prefix, for Spanish it's with /es-PY
|
// Canonical URL
|
||||||
var canonicalUrl = isSpanish
|
var canonicalUrl = isEnglish
|
||||||
? $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
||||||
|
: isSpanish
|
||||||
|
? $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
||||||
: $"https://qrrapido.site{pathWithoutCulture}";
|
: $"https://qrrapido.site{pathWithoutCulture}";
|
||||||
|
|
||||||
// Alternate URLs for hreflang
|
// Alternate URLs for hreflang
|
||||||
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
|
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
|
||||||
var esUrl = $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
var esUrl = $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
||||||
|
var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
||||||
|
|
||||||
// Culture prefix for internal links
|
// Culture prefix for internal links
|
||||||
var culturePrefix = isSpanish ? "/es-PY" : "";
|
var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es" : "";
|
||||||
|
|
||||||
if (User?.Identity?.IsAuthenticated == true)
|
if (User?.Identity?.IsAuthenticated == true)
|
||||||
{
|
{
|
||||||
@ -85,7 +89,8 @@
|
|||||||
|
|
||||||
<!-- Hreflang for multilingual SEO -->
|
<!-- Hreflang for multilingual SEO -->
|
||||||
<link rel="alternate" hreflang="pt-BR" href="@ptUrl">
|
<link rel="alternate" hreflang="pt-BR" href="@ptUrl">
|
||||||
<link rel="alternate" hreflang="es-PY" href="@esUrl">
|
<link rel="alternate" hreflang="es" href="@esUrl">
|
||||||
|
<link rel="alternate" hreflang="en" href="@enUrl">
|
||||||
<link rel="alternate" hreflang="x-default" href="@ptUrl">
|
<link rel="alternate" hreflang="x-default" href="@ptUrl">
|
||||||
|
|
||||||
<!-- Open Graph -->
|
<!-- Open Graph -->
|
||||||
@ -317,9 +322,9 @@
|
|||||||
<i class="fas fa-globe"></i> <span id="current-lang">PT</span>
|
<i class="fas fa-globe"></i> <span id="current-lang">PT</span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<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="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="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="en">🌎 English</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
@{
|
@{
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
ViewData["Title"] = Model.Metadata.Title;
|
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 baseUrl = "https://qrrapido.site";
|
||||||
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";
|
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";
|
||||||
}
|
}
|
||||||
@ -84,7 +87,7 @@
|
|||||||
{
|
{
|
||||||
"@@type": "ListItem",
|
"@@type": "ListItem",
|
||||||
"position": 2,
|
"position": 2,
|
||||||
"name": "@(ViewBag.Culture == "pt-BR" ? "Tutoriais" : "Tutoriales")",
|
"name": "@T("Tutoriais", "Tutoriales", "Tutorials")",
|
||||||
"item": "@baseUrl/@ViewBag.Culture/tutoriais"
|
"item": "@baseUrl/@ViewBag.Culture/tutoriais"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -103,7 +106,7 @@
|
|||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="/@ViewBag.Culture">Home</a></li>
|
<li class="breadcrumb-item"><a href="/@ViewBag.Culture">Home</a></li>
|
||||||
<li class="breadcrumb-item"><a href="/@ViewBag.Culture/tutoriais">@(ViewBag.Culture == "pt-BR" ? "Tutoriais" : "Tutoriales")</a></li>
|
<li class="breadcrumb-item"><a href="/@ViewBag.Culture/tutoriais">@T("Tutoriais", "Tutoriales", "Tutorials")</a></li>
|
||||||
<li class="breadcrumb-item active" aria-current="page">@Model.Metadata.Title</li>
|
<li class="breadcrumb-item active" aria-current="page">@Model.Metadata.Title</li>
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
@ -118,7 +121,7 @@
|
|||||||
<div class="text-muted mb-3">
|
<div class="text-muted mb-3">
|
||||||
<span><i class="fas fa-user"></i> @Model.Metadata.Author</span> |
|
<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-calendar"></i> @Model.Metadata.Date.ToString("dd MMM yyyy")</span> |
|
||||||
<span><i class="fas fa-clock"></i> @Model.Metadata.ReadingTimeMinutes min @(ViewBag.Culture == "pt-BR" ? "de leitura" : "de lectura")</span>
|
<span><i class="fas fa-clock"></i> @Model.Metadata.ReadingTimeMinutes min @T("de leitura", "de lectura", "read")</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (!string.IsNullOrEmpty(Model.Metadata.Image))
|
@if (!string.IsNullOrEmpty(Model.Metadata.Image))
|
||||||
@ -138,7 +141,7 @@
|
|||||||
<footer class="mt-5 pt-4 border-top">
|
<footer class="mt-5 pt-4 border-top">
|
||||||
<p class="text-muted">
|
<p class="text-muted">
|
||||||
<small>
|
<small>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Última atualização:" : "Última actualización:")
|
@T("Última atualização:", "Última actualización:", "Last updated:")
|
||||||
@Model.Metadata.LastMod.ToString("dd MMM yyyy HH:mm")
|
@Model.Metadata.LastMod.ToString("dd MMM yyyy HH:mm")
|
||||||
</small>
|
</small>
|
||||||
</p>
|
</p>
|
||||||
@ -170,7 +173,7 @@
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h5 class="mb-0">
|
<h5 class="mb-0">
|
||||||
<i class="fas fa-book"></i>
|
<i class="fas fa-book"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Artigos Relacionados" : "Artículos Relacionados")
|
@T("Artigos Relacionados", "Artículos Relacionados", "Related Articles")
|
||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-group list-group-flush">
|
<div class="list-group list-group-flush">
|
||||||
@ -193,15 +196,15 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title">
|
<h5 class="card-title">
|
||||||
<i class="fas fa-crown"></i>
|
<i class="fas fa-crown"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Seja Premium!" : "¡Hazte Premium!")
|
@T("Seja Premium!", "¡Hazte Premium!", "Go Premium!")
|
||||||
</h5>
|
</h5>
|
||||||
<p class="card-text">
|
<p class="card-text">
|
||||||
@(ViewBag.Culture == "pt-BR"
|
@T("QR codes ilimitados, sem anúncios e recursos avançados.",
|
||||||
? "QR codes ilimitados, sem anúncios e recursos avançados."
|
"Códigos QR ilimitados, sin anuncios y características avanzadas.",
|
||||||
: "Códigos QR ilimitados, sin anuncios y características avanzadas.")
|
"Unlimited QR codes, no ads and advanced features.")
|
||||||
</p>
|
</p>
|
||||||
<a href="/@ViewBag.Culture/Pagamento/SelecaoPlano" class="btn btn-light btn-block">
|
<a href="/@ViewBag.Culture/Pagamento/SelecaoPlano" class="btn btn-light btn-block">
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Conhecer Planos" : "Conocer Planes")
|
@T("Conhecer Planos", "Conocer Planes", "View Plans")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -212,21 +215,21 @@
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h5 class="mb-0">
|
<h5 class="mb-0">
|
||||||
<i class="fas fa-link"></i>
|
<i class="fas fa-link"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Links Úteis" : "Enlaces Útiles")
|
@T("Links Úteis", "Enlaces Útiles", "Useful Links")
|
||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-group list-group-flush">
|
<div class="list-group list-group-flush">
|
||||||
<a href="/@ViewBag.Culture" class="list-group-item list-group-item-action">
|
<a href="/@ViewBag.Culture" class="list-group-item list-group-item-action">
|
||||||
<i class="fas fa-qrcode"></i>
|
<i class="fas fa-qrcode"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Gerar QR Code" : "Generar Código QR")
|
@T("Gerar QR Code", "Generar Código QR", "Generate QR Code")
|
||||||
</a>
|
</a>
|
||||||
<a href="/@ViewBag.Culture/FAQ" class="list-group-item list-group-item-action">
|
<a href="/@ViewBag.Culture/FAQ" class="list-group-item list-group-item-action">
|
||||||
<i class="fas fa-question-circle"></i>
|
<i class="fas fa-question-circle"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Perguntas Frequentes" : "Preguntas Frecuentes")
|
@T("Perguntas Frequentes", "Preguntas Frecuentes", "FAQ")
|
||||||
</a>
|
</a>
|
||||||
<a href="/@ViewBag.Culture/Contact" class="list-group-item list-group-item-action">
|
<a href="/@ViewBag.Culture/Contact" class="list-group-item list-group-item-action">
|
||||||
<i class="fas fa-envelope"></i>
|
<i class="fas fa-envelope"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Contato" : "Contacto")
|
@T("Contato", "Contacto", "Contact")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
@model List<QRRapidoApp.Models.ArticleMetadata>
|
@model List<QRRapidoApp.Models.ArticleMetadata>
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = ViewBag.Culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR";
|
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");
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10,12 +14,12 @@
|
|||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
<i class="fas fa-book"></i>
|
<i class="fas fa-book"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Tutoriais QR Code" : "Tutoriales Código QR")
|
@T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials")
|
||||||
</h1>
|
</h1>
|
||||||
<p class="lead text-muted">
|
<p class="lead text-muted">
|
||||||
@(ViewBag.Culture == "pt-BR"
|
@T("Aprenda tudo sobre QR Codes com nossos tutoriais completos e passo a passo",
|
||||||
? "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",
|
||||||
: "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")
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -45,7 +49,7 @@
|
|||||||
|
|
||||||
<a href="/@ViewBag.Culture/tutoriais/@article.Slug"
|
<a href="/@ViewBag.Culture/tutoriais/@article.Slug"
|
||||||
class="btn btn-primary btn-block">
|
class="btn btn-primary btn-block">
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Ler Tutorial" : "Leer Tutorial")
|
@T("Ler Tutorial", "Leer Tutorial", "Read Tutorial")
|
||||||
<i class="fas fa-arrow-right ml-1"></i>
|
<i class="fas fa-arrow-right ml-1"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -58,9 +62,9 @@
|
|||||||
{
|
{
|
||||||
<div class="alert alert-info" role="alert">
|
<div class="alert alert-info" role="alert">
|
||||||
<i class="fas fa-info-circle"></i>
|
<i class="fas fa-info-circle"></i>
|
||||||
@(ViewBag.Culture == "pt-BR"
|
@T("Nenhum tutorial disponível no momento. Volte em breve!",
|
||||||
? "Nenhum tutorial disponível no momento. Volte em breve!"
|
"No hay tutoriales disponibles en este momento. ¡Vuelve pronto!",
|
||||||
: "No hay tutoriales disponibles en este momento. ¡Vuelve pronto!")
|
"No tutorials available at the moment. Check back soon!")
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,18 +74,18 @@
|
|||||||
<div class="card bg-primary text-white">
|
<div class="card bg-primary text-white">
|
||||||
<div class="card-body text-center py-5">
|
<div class="card-body text-center py-5">
|
||||||
<h3 class="mb-3">
|
<h3 class="mb-3">
|
||||||
@(ViewBag.Culture == "pt-BR"
|
@T("Pronto para criar seu QR Code?",
|
||||||
? "Pronto para criar seu QR Code?"
|
"¿Listo para crear tu código QR?",
|
||||||
: "¿Listo para crear tu código QR?")
|
"Ready to create your QR Code?")
|
||||||
</h3>
|
</h3>
|
||||||
<p class="lead mb-4">
|
<p class="lead mb-4">
|
||||||
@(ViewBag.Culture == "pt-BR"
|
@T("Gere QR codes profissionais em segundos com nossa ferramenta ultrarrápida!",
|
||||||
? "Gere QR codes profissionais em segundos com nossa ferramenta ultrarrápida!"
|
"¡Genera códigos QR profesionales en segundos con nuestra herramienta 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!")
|
||||||
</p>
|
</p>
|
||||||
<a href="/@ViewBag.Culture" class="btn btn-light btn-lg">
|
<a href="/@ViewBag.Culture" class="btn btn-light btn-lg">
|
||||||
<i class="fas fa-qrcode"></i>
|
<i class="fas fa-qrcode"></i>
|
||||||
@(ViewBag.Culture == "pt-BR" ? "Criar QR Code Agora" : "Crear Código QR Ahora")
|
@T("Criar QR Code Agora", "Crear Código QR Ahora", "Create QR Code Now")
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,32 +1,34 @@
|
|||||||
// Language switching functionality for QR Rapido
|
// Language switching functionality for QR Rapido
|
||||||
// SEO Strategy:
|
// SEO Strategy:
|
||||||
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
|
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
|
||||||
// - Spanish (es-PY): URLs with /es-PY prefix (/es-PY, /es-PY/pix, etc.)
|
// - Spanish (es): URLs with /es prefix (/es, /es/pix, etc.)
|
||||||
|
// - English (en): URLs with /en prefix (/en, /en/pix, etc.)
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
|
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
|
||||||
const currentLangSpan = document.getElementById('current-lang');
|
const currentLangSpan = document.getElementById('current-lang');
|
||||||
|
|
||||||
|
// Cultures that use a URL prefix
|
||||||
|
const prefixedCultures = ['es', 'en'];
|
||||||
|
|
||||||
// Get current culture from URL
|
// Get current culture from URL
|
||||||
function getCurrentCulture() {
|
function getCurrentCulture() {
|
||||||
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
|
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
|
||||||
|
if (pathSegments.length > 0) {
|
||||||
// Check if first segment is es-PY (Spanish)
|
const first = pathSegments[0].toLowerCase();
|
||||||
if (pathSegments.length > 0 && pathSegments[0].toLowerCase() === 'es-py') {
|
if (first === 'es-py' || first === 'es') return 'es';
|
||||||
return 'es-PY';
|
if (first === 'en') return 'en';
|
||||||
}
|
}
|
||||||
|
return 'pt-BR'; // Default — no prefix
|
||||||
// Default is Portuguese (no prefix in URL)
|
|
||||||
return 'pt-BR';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update current language display in header
|
// Update current language display in header
|
||||||
function updateCurrentLanguageDisplay(culture) {
|
function updateCurrentLanguageDisplay(culture) {
|
||||||
const langMap = {
|
const langMap = {
|
||||||
'pt-BR': 'PT',
|
'pt-BR': 'PT',
|
||||||
'es-PY': 'ES'
|
'es': 'ES',
|
||||||
|
'en': 'EN'
|
||||||
};
|
};
|
||||||
|
|
||||||
if (currentLangSpan) {
|
if (currentLangSpan) {
|
||||||
currentLangSpan.textContent = langMap[culture] || 'PT';
|
currentLangSpan.textContent = langMap[culture] || 'PT';
|
||||||
}
|
}
|
||||||
@ -35,28 +37,27 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
// Build new URL with selected culture
|
// Build new URL with selected culture
|
||||||
function buildLocalizedUrl(newCulture) {
|
function buildLocalizedUrl(newCulture) {
|
||||||
const currentPath = window.location.pathname;
|
const currentPath = window.location.pathname;
|
||||||
const queryString = window.location.search;
|
const queryString = window.location.search;
|
||||||
const hash = window.location.hash;
|
const hash = window.location.hash;
|
||||||
|
|
||||||
// Get path segments, removing any culture prefix
|
// Strip any existing culture prefix
|
||||||
let pathSegments = currentPath.split('/').filter(segment => segment);
|
let pathSegments = currentPath.split('/').filter(segment => segment);
|
||||||
|
|
||||||
// Remove existing culture prefix if present (es-PY or pt-BR)
|
|
||||||
if (pathSegments.length > 0) {
|
if (pathSegments.length > 0) {
|
||||||
const firstSegment = pathSegments[0].toLowerCase();
|
const first = pathSegments[0].toLowerCase();
|
||||||
if (firstSegment === 'es-py' || firstSegment === 'pt-br') {
|
if (first === 'es-py' || first === 'es' || first === 'pt-br' || first === 'en') {
|
||||||
pathSegments.shift();
|
pathSegments.shift();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build new path based on selected culture
|
const rest = pathSegments.length > 0 ? '/' + pathSegments.join('/') : '';
|
||||||
|
|
||||||
let newPath;
|
let newPath;
|
||||||
if (newCulture === 'pt-BR') {
|
if (newCulture === 'pt-BR') {
|
||||||
// Portuguese: no prefix (canonical URLs)
|
// Portuguese: no prefix (canonical URLs)
|
||||||
newPath = pathSegments.length > 0 ? '/' + pathSegments.join('/') : '/';
|
newPath = rest || '/';
|
||||||
} else {
|
} else {
|
||||||
// Spanish: add /es-PY prefix
|
// Spanish / English: add culture prefix
|
||||||
newPath = '/es-PY' + (pathSegments.length > 0 ? '/' + pathSegments.join('/') : '');
|
newPath = '/' + newCulture + rest;
|
||||||
}
|
}
|
||||||
|
|
||||||
return newPath + queryString + hash;
|
return newPath + queryString + hash;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user