Paypal IPN fails date standards
Paypal Instant Payment Notification lets you know when you have received a paypal payment. Presumably, you then mark an order as paid or something. Do not use the current time as the paid_at
date – despite the ‘instant’ in the title it can be many days later. You should use the payment_date
provided by paypal. Your accountant will thank you.
But here’s the rub. From the IPN spec, payment_date
is:
bq. Time/Date stamp generated by PayPal system [format: “18:30:30 Jan 1, 2000 PST”]
Seen that date format before? No? Didn’t think so. That’s no RFC I’ve seen before. The popular Paypal gem uses Time.parse
, but this is incorrect (as of 2.0.0). Observe:
1 2 3 4 |
>> Time.parse("18:30:30 Mar 28, 2008 PST") => Fri Mar 28 18:30:30 1100 2008 # Good >> Time.parse("18:30:30 Feb 28, 2008 PST") => Fri Mar 28 18:30:30 1100 2008 # FAIL |
Also, Time
only has a range of about a week, so that could screw you over come any major system failures (either you or paypal). Also note the payment_date
is in PST, which unless you’re on the right side of the US is fairly useless. I recommend the following:
1 2 |
>> DateTime.strptime("18:30:30 Jan 1, 2000 PST", "%H:%M:%S %b %e, %Y %Z").new_offset(0) => Sun, 02 Jan 2000 02:30:30 0000 |
The un-intuitive new_offset
converts to UTC. Patch submitted. I hate you, Paypal.