Django-PayPal: У меня есть 3 модели и 3 функции приемника сигналов, но я не могу определить, какая из них должна вызываться при получении платежа

Я использую Django-Paypal для получения платежей за 3 различных сервиса. Каждая услуга имеет отдельную модель (скажем, Service1, Service2 и Service3), но все они находятся в одном приложении 'payments'. Мне нужно обновить статус платежа нужной модели на 'paid=True' после получения оплаты за соответствующую услугу.

У меня есть 3 представления обработки платежей (каждое для каждого сервиса), которые работают хорошо, поскольку все платежи завершаются успешно. Аналогично, я создал 3 функции сигналов/приемников (каждая на модель) и поместил их в signals.py. Когда я тестирую один сигнал за раз, он работает хорошо. Статус платежа успешно обновляется до 'paid=True'. Однако, когда я включаю все три сигнала в файл signals.py, все перестает работать. Я заметил, что каждый раз при получении платежа срабатывают первые 2 функции приемника, что приводит к ошибке. Смотрите код в самом низу

Как указать, какая функция приемника должна вызываться при получении платежа от конкретной модели? Или какой лучший способ успешной реализации вышеуказанного? Когда я использую встроенные сигналы, такие как pre-save, можно указать модель, которая будет обновлена, добавив отправителя в декораторе, например

@receiver(pre-save, sender = MyModel)

Что касается сигнала PayPal IPN, я полностью застрял, и любая помощь, включая идеи, приветствуется. Заранее спасибо.

@receiver(valid_ipn_received)
def Servicea_order_item_paid(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == ST_PP_COMPLETED:
        servicea = ServiceA.objects.get(order_id =ipn_obj.invoice)
        if (
            ipn_obj.mc_gross == servicea.total_cost() 
            and ipn_obj.mc_currency == 'USD' 
            and ipn_obj.receiver_email == "sb-qcfgi12551119@business.example.com"
            ):
            servicea.paid = True
            servicea.save()

@receiver(valid_ipn_received)
def serviceb_order_item_paid(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == ST_PP_COMPLETED:
        serviceb = ServiceB.objects.get(order_id =ipn_obj.invoice)
        if (
            ipn_obj.mc_gross == serviceb.total_cost() 
            and ipn_obj.mc_currency == 'USD' 
            and ipn_obj.receiver_email == "sb-qcfgi12551119@business.example.com"
            ):
            serviceb.paid = True
            serviceb.save()

@receiver(valid_ipn_received)
def servicec_order_item_paid(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == ST_PP_COMPLETED:
        servicec = ServiceC.objects.get(order_id =ipn_obj.invoice)
        if (
            ipn_obj.mc_gross == servicec.total_cost() 
            and ipn_obj.mc_currency == 'USD' 
            and ipn_obj.receiver_email == "sb-qcfgi12551119@business.example.com"
            ):
            servicec.paid = True
            servicec.save()

Хотя я не смог получить ответ здесь, я, наконец, решил проблему. Я сделал это, объединив три сигнала в один "составной" сигнал, используя:

  • Фильтры
  • if-условия и
  • Метод exists()

Конечный код получился длинным, но он работает хорошо и без ошибок. Даже ошибка 'Duplicate txn_id' наконец-то исчезла. В целях обмена кодом я заменил фактические службы на ServiceA, B и C соответственно. Смотрите код ниже:

@receiver(valid_ipn_received)
def order_item_paid(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == ST_PP_COMPLETED:
        print('Payment was sucessful!!!!, pending other verifications')

        if ServiceA.objects.filter(order_id =ipn_obj.invoice).exists():
            print('!!!! ServiceA Oder object exists')
            servicea = get_object_or_404(ServiceA, order_id =ipn_obj.invoice)
            
            if (
                ipn_obj.mc_gross == servicea.total_cost() 
                and ipn_obj.mc_currency == 'USD' 
                and ipn_obj.receiver_email == "xxxxxxx@business.example.com"
                ):

                print('!!!. Amount, Currency and Email Verified')

                servicea.paid = True
                servicea.save()
        else:
            print('!!!! ServiceA order item does not exist')

        if ServiceB.objects.filter(order_id =ipn_obj.invoice).exists():
            print('!!!! ServiceB order item exists')
            serviceb = get_object_or_404(ServiceB, order_id =ipn_obj.invoice)
        
            if (
                ipn_obj.mc_gross == serviceb.total_cost() 
                and ipn_obj.mc_currency == 'USD' 
                and ipn_obj.receiver_email == "xxxxxx@business.example.com"
                ):

                print('!!!!!!. Amount, Currency and Email Verified')

                serviceb.paid = True
                serviceb.save()
        else:
             print('!!!!!!!!Service B Order object does not exist')


        if ServiceC.objects.filter(order_id =ipn_obj.invoice).exists():
            print('!!!!!!!!Service C order item exists')
            servicec = get_object_or_404(ServiceC, order_id =ipn_obj.invoice)
       
            if (
                ipn_obj.mc_gross == servicec.total_cost() 
                and ipn_obj.mc_currency == 'USD' 
                and ipn_obj.receiver_email == "xxxxxxx@business.example.com"
                ):

                print('!!!!!!. Amount, Currency and Email Verified')

                servicec.paid = True
                servicec.save()
            
        else:
            print('!!! Service C order object does not exist')

Вернуться на верх