Signals

Django signals notify your application of payment events. Use them to trigger business logic like confirmation emails, order status updates, or logging.

All signals are webhook-triggered and aligned with ATH Móvil's event names.

Available Signals

Signal When Fired Arguments
payment_completed Payment successfully completed payment
payment_cancelled Customer cancelled in ATH Móvil app payment
payment_expired Payment session timed out payment
refund_sent Refund processed refund, payment

Import from django_athm.signals:

from django_athm.signals import (
    payment_completed,
    payment_cancelled,
    payment_expired,
    refund_sent,
)

Connecting Handlers

Use the @receiver decorator:

from django.dispatch import receiver
from django_athm.signals import payment_completed

@receiver(payment_completed)
def handle_payment(sender, payment, **kwargs):
    order = Order.objects.get(reference=payment.metadata_1)
    order.status = "paid"
    order.save()
    send_confirmation_email(order)

Complete Example

# myapp/signals.py
import logging
from django.dispatch import receiver
from django_athm.signals import (
    payment_completed,
    payment_cancelled,
    payment_expired,
    refund_sent,
)

logger = logging.getLogger(__name__)

@receiver(payment_completed)
def on_payment_completed(sender, payment, **kwargs):
    logger.info(f"Payment completed: {payment.reference_number}")
    # Update order status, send confirmation email, trigger fulfillment

@receiver(payment_cancelled)
def on_payment_cancelled(sender, payment, **kwargs):
    logger.warning(f"Payment cancelled: {payment.ecommerce_id}")
    # Release inventory, notify customer

@receiver(payment_expired)
def on_payment_expired(sender, payment, **kwargs):
    logger.warning(f"Payment expired: {payment.ecommerce_id}")
    # Notify customer, offer retry

@receiver(refund_sent)
def on_refund_sent(sender, refund, payment, **kwargs):
    logger.info(f"Refund sent: ${refund.amount} for {payment.reference_number}")
    # Update order status, send refund confirmation

Registering Handlers

Import your signals module in your app's ready() method:

# myapp/apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = "myapp"

    def ready(self):
        import myapp.signals  # noqa: F401

Signal Arguments

payment_completed, payment_cancelled, payment_expired

Argument Type Description
sender class Payment
payment Payment The payment instance

refund_sent

Argument Type Description
sender class Refund
refund Refund The refund instance
payment Payment The related payment