79 lines
3.1 KiB
JavaScript
79 lines
3.1 KiB
JavaScript
'use strict'
|
|
|
|
const Order = require('../models/Order')
|
|
const Ticket = require('../models/Ticket')
|
|
const WhatsappCore = require('../services/whatsappService')
|
|
|
|
const ASAAS_WEBHOOK_TOKEN = process.env.ASAAS_WEBHOOK_TOKEN
|
|
|
|
const webhookController = {
|
|
async asaasWebhook(req, res) {
|
|
try {
|
|
if (!ASAAS_WEBHOOK_TOKEN) {
|
|
console.error('[Webhook Asaas] ASAAS_WEBHOOK_TOKEN não configurado')
|
|
return res.status(500).json({ error: 'Configuração incompleta' })
|
|
}
|
|
const incomingToken = req.headers['asaas-access-token']
|
|
if (!incomingToken || incomingToken !== ASAAS_WEBHOOK_TOKEN) {
|
|
console.warn('[Webhook Asaas] Token inválido rejeitado')
|
|
return res.status(401).json({ error: 'Não autorizado' })
|
|
}
|
|
|
|
const { event, payment } = req.body
|
|
|
|
if (!event || !payment) {
|
|
return res.status(400).json({ error: 'Payload inválido' })
|
|
}
|
|
|
|
console.log(`[Webhook Asaas] Recebido evento: ${event} para o pagamento ${payment.id}`)
|
|
|
|
if (event === 'PAYMENT_CONFIRMED' || event === 'PAYMENT_RECEIVED') {
|
|
const order = await Order.findByAsaasId(payment.id)
|
|
if (!order) {
|
|
console.error(`[Webhook Asaas] Pedido não encontrado para payment.id: ${payment.id}`)
|
|
return res.status(404).json({ error: 'Pedido não encontrado' })
|
|
}
|
|
|
|
if (order.status !== 'paid') {
|
|
await Order.updateStatus(order.id, 'paid')
|
|
await Ticket.confirmOrder(order.id)
|
|
|
|
// Fase 7: Dispara Confirmação de Compra pelo WhatsApp via BullMQ Fila
|
|
const getTickets = await Ticket.getByOrderId(order.id)
|
|
if (getTickets && getTickets.length > 0) {
|
|
const userPhone = getTickets[0].usuario_telefone
|
|
const numerosComprados = getTickets.map(t => t.numero).join(', ')
|
|
|
|
WhatsappCore.sendNotification({
|
|
userId: null,
|
|
phone: userPhone,
|
|
type: 'purchase_confirmed',
|
|
variables: {
|
|
numeros: numerosComprados,
|
|
valor: parseFloat(order.total_amount).toFixed(2),
|
|
link: `${process.env.APP_URL || 'http://alemaoconveniencias.local'}/meus-premios`
|
|
}
|
|
}).catch(console.error)
|
|
}
|
|
|
|
console.log(`[Webhook Asaas] Pagamento confirmado! Pedido ${order.id} status atualizado para 'paid' e tickets garantidos.`)
|
|
} else {
|
|
console.log(`[Webhook Asaas] Pedido ${order.id} já estava marcado como 'paid'.`)
|
|
}
|
|
} else if (event === 'PAYMENT_DELETED' || event === 'PAYMENT_OVERDUE') {
|
|
const order = await Order.findByAsaasId(payment.id)
|
|
if (order && order.status !== 'paid') {
|
|
await Order.updateStatus(order.id, event === 'PAYMENT_DELETED' ? 'canceled' : 'expired')
|
|
}
|
|
}
|
|
|
|
return res.json({ success: true })
|
|
} catch (error) {
|
|
console.error('[Webhook Asaas] Erro no processamento:', error)
|
|
return res.status(500).json({ error: 'Erro interno no processamento do webhook' })
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = webhookController
|