django-paypal icon indicating copy to clipboard operation
django-paypal copied to clipboard

PDT payments intermittently broken?

Open djw opened this issue 3 years ago • 4 comments

In some recent requests on my site the query parameters passed to the return_url have changed, in a way that's incompatible with the current implementation of PayPalPDTForm.

Specifically, I'm now receiving:

  1. notify_version=UNVERSIONED which is incompatible with the decimal type of the underlying model field
  2. payment_date=2021-05-11T12:00:00Z which is incompatible with PayPalDateTimeField

Tweaking the form like this works fine locally with Django 3.1 — when I get a moment I'll create a proper patch with a test case.

class PayPalPDTForm(PayPalStandardBaseForm):
    payment_date = DateTimeField(required=False)

    class Meta:
        model = PayPalPDT
        exclude = [
            "ipaddress",
            "flag",
            "flag_code",
            "flag_info",
            "query",
            "response",
            "created_at",
            "updated",
            "form_view",
            "notify_version",
        ]

Edit: I originally thought this was related to v1.1 due to the timing of the issue, but even after I reverted I'm still seeing some requests arrive with the new parameters. Looking at the code I can't see how changing the postback endpoint would cause this issue anyway!

djw avatar May 15 '21 09:05 djw

Based on what you've said, it looks like we're going to have to be compatible with all the different things they might be sending. If you can post examples of different things you are seeing that would really help. A patch that fixes the issues would also be a huge help. Thanks so much!

spookylukey avatar May 15 '21 13:05 spookylukey

I've been running this branch for the last week or so without any issues, but it's a bit hacky to push upstream:

https://github.com/spookylukey/django-paypal/compare/master...djw:return-query-changes

Given that payment_date is now arriving in ISO format in the query parameters, but still in PayPalDateTimeField format in the postback response, I think the options are:

  1. Extend PayPalDateTimeField to support ISO format (perhaps requiring a dependency on python-dateutil)
  2. Use separate form classes to handle query parameters and the postback response, and probably ignore all the new parameters, including the ISO format date.

I lean towards the second option, but would like your opinion before working on a patch. :)

djw avatar May 28 '21 08:05 djw

Your second option sounds fine if you feel like working on a patch. Thanks!

spookylukey avatar Jun 15 '21 05:06 spookylukey

Apologies for the delay, I've created a new branch which implements the fix following Option 2 above:

https://github.com/spookylukey/django-paypal/compare/master...djw:issue-329

I'll test this out for a few days and then submit a PR.

djw avatar Nov 06 '21 15:11 djw