- Backend NestJS con módulos de autenticación, inventario, créditos - Frontend React con dashboard y componentes UI - Base de datos PostgreSQL con migraciones - Tests E2E configurados - Configuración de Docker y deployment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
228 lines
5.7 KiB
Markdown
228 lines
5.7 KiB
Markdown
# INT-003: Integracion 7-Eleven
|
|
|
|
---
|
|
id: INT-003
|
|
type: Integration
|
|
status: Pendiente
|
|
version: "1.0.0"
|
|
created_date: 2026-01-10
|
|
updated_date: 2026-01-10
|
|
simco_version: "4.0.0"
|
|
---
|
|
|
|
## Metadata
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| **ID** | INT-003 |
|
|
| **Servicio** | Agregador de pagos (Conekta/OpenPay) |
|
|
| **Proposito** | Pagos en efectivo en tiendas 7-Eleven |
|
|
| **Criticidad** | P1 |
|
|
| **Estado** | Pendiente |
|
|
|
|
---
|
|
|
|
## 1. Descripcion
|
|
|
|
Integracion con un agregador de pagos mexicano para permitir pagos en efectivo en tiendas 7-Eleven.
|
|
|
|
---
|
|
|
|
## 2. Opciones de Agregador
|
|
|
|
| Agregador | Soporte 7-Eleven | Costo | Documentacion |
|
|
|-----------|------------------|-------|---------------|
|
|
| **Conekta** | Si | ~3.9% | https://developers.conekta.com |
|
|
| **OpenPay** | Si | ~3.5% | https://www.openpay.mx/docs |
|
|
| **PayU** | Parcial | ~4% | https://developers.payulatam.com |
|
|
|
|
**Recomendacion:** Conekta por mejor soporte en Mexico.
|
|
|
|
---
|
|
|
|
## 3. Configuracion (Conekta)
|
|
|
|
### Variables de Entorno
|
|
|
|
```env
|
|
CONEKTA_API_KEY=key_...
|
|
CONEKTA_WEBHOOK_SECRET=whsec_...
|
|
SEVEN_ELEVEN_EXPIRATION_HOURS=48
|
|
```
|
|
|
|
### Instalacion
|
|
|
|
```bash
|
|
npm install conekta
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Flujo de Integracion
|
|
|
|
```
|
|
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
│ Mobile │───▶│ Backend │───▶│ Conekta │───▶│7-Eleven │
|
|
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
│ │ │ │
|
|
│ 1. Request │ │ │
|
|
│ 7-11 pay │ │ │
|
|
│──────────────▶│ │ │
|
|
│ │ 2. Create │ │
|
|
│ │ cash order │ │
|
|
│ │──────────────▶│ │
|
|
│ │◀──────────────│ │
|
|
│◀──────────────│ Reference │ │
|
|
│ │ │ │
|
|
│ 3. User pays │ │ │
|
|
│ at 7-11 │───────────────────────────────▶
|
|
│ │ │◀──────────────│
|
|
│ │ 4. Webhook │ │
|
|
│ │◀──────────────│ │
|
|
│◀──────────────│ 5. Notify │ │
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Implementacion Backend
|
|
|
|
### Crear Referencia 7-Eleven
|
|
|
|
```typescript
|
|
import Conekta from 'conekta';
|
|
|
|
@Injectable()
|
|
export class ConektaService {
|
|
constructor() {
|
|
Conekta.api_key = process.env.CONEKTA_API_KEY;
|
|
Conekta.api_version = '2.0.0';
|
|
}
|
|
|
|
async create7ElevenPayment(
|
|
amount: number,
|
|
email: string,
|
|
name: string,
|
|
orderId: string
|
|
) {
|
|
const expiresAt = Math.floor(
|
|
Date.now() / 1000 + parseInt(process.env.SEVEN_ELEVEN_EXPIRATION_HOURS) * 3600
|
|
);
|
|
|
|
const order = await Conekta.Order.create({
|
|
currency: 'MXN',
|
|
customer_info: {
|
|
name,
|
|
email,
|
|
},
|
|
line_items: [{
|
|
name: 'Creditos MiInventario',
|
|
unit_price: Math.round(amount * 100),
|
|
quantity: 1,
|
|
}],
|
|
charges: [{
|
|
payment_method: {
|
|
type: 'cash',
|
|
expires_at: expiresAt,
|
|
},
|
|
}],
|
|
metadata: {
|
|
orderId,
|
|
},
|
|
});
|
|
|
|
const cashCharge = order.charges.data[0];
|
|
const paymentMethod = cashCharge.payment_method;
|
|
|
|
return {
|
|
conektaOrderId: order.id,
|
|
reference: paymentMethod.reference,
|
|
barcodeUrl: paymentMethod.barcode_url,
|
|
expiresAt: new Date(expiresAt * 1000),
|
|
};
|
|
}
|
|
}
|
|
```
|
|
|
|
### Webhook Handler
|
|
|
|
```typescript
|
|
@Post('webhook/conekta')
|
|
async handleConektaWebhook(
|
|
@Body() body: any,
|
|
@Headers('digest') digest: string
|
|
) {
|
|
// Verificar firma
|
|
const isValid = this.verifyConektaSignature(body, digest);
|
|
if (!isValid) {
|
|
throw new UnauthorizedException('Invalid signature');
|
|
}
|
|
|
|
if (body.type === 'order.paid') {
|
|
const orderId = body.data.object.metadata.orderId;
|
|
await this.handlePaymentComplete(orderId);
|
|
}
|
|
|
|
return { received: true };
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Estructura de Referencia
|
|
|
|
| Campo | Descripcion |
|
|
|-------|-------------|
|
|
| reference | Numero de referencia para pagar |
|
|
| barcode_url | URL de imagen del codigo de barras |
|
|
| expires_at | Timestamp de expiracion |
|
|
|
|
---
|
|
|
|
## 7. Consideraciones
|
|
|
|
| Aspecto | Valor |
|
|
|---------|-------|
|
|
| Monto minimo | $10 MXN |
|
|
| Monto maximo | $10,000 MXN |
|
|
| Expiracion | 48 horas recomendado |
|
|
| Tiempo confirmacion | 5-15 minutos |
|
|
| Comision | ~3.9% + IVA |
|
|
|
|
---
|
|
|
|
## 8. Diferencias vs OXXO
|
|
|
|
| Aspecto | OXXO (Stripe) | 7-Eleven (Conekta) |
|
|
|---------|---------------|-------------------|
|
|
| Proveedor | Stripe | Conekta |
|
|
| Cobertura | 20,000+ tiendas | 2,000+ tiendas |
|
|
| Comision | ~3.6% | ~3.9% |
|
|
| Integracion | Mas simple | Requiere agregador |
|
|
|
|
---
|
|
|
|
## 9. Testing
|
|
|
|
### Modo Sandbox
|
|
|
|
```typescript
|
|
// Usar API key de sandbox
|
|
CONEKTA_API_KEY=key_test_...
|
|
```
|
|
|
|
### Simular Pago
|
|
|
|
En el dashboard de Conekta sandbox, se puede simular el pago de una referencia.
|
|
|
|
---
|
|
|
|
## 10. Referencias
|
|
|
|
- [Conekta Docs](https://developers.conekta.com)
|
|
- [MII-013](../01-epicas/MII-013-pagos-7eleven.md)
|
|
- [ADR-0004](../97-adr/ADR-0004-pagos-efectivo-mexico.md)
|
|
|
|
---
|
|
|
|
**Ultima Actualizacion:** 2026-01-10
|