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')