with - paypal one click upsell




PayPal: Client proceed to payment, clicked pay and got back to success page, but was not charged (5)

I can fully confirm the same behavior, when user pays from mobile view (I tested it my self from iPhone) the transaction disappears, no IPN and no Information in both Paypal (Sender and receiver) accounts.

From Desktop Browser it works normally.

I am using paypal pay button on my website, and in some cases user clicks it, redirected to the PayPal, signs in, clicks on pay button and redirected to the success page, but client account does not get charged and paypal does no call notify URL. Basically there were no transaction.

Here is the URL that user is redirected to:

https://www.paypal.com/cgi-bin/webscr?processPayment=1
&cmd=_xclick
&currency_code=USD
&no_shipping=1
&cancel_return=https://www.domain.com/cancel.php
&return=https://www.domain.com/return.php
&notify_url=https://www.domain.com/notify_url.php
&[email protected]
&[email protected]
&item_number=1
&item_name=Application+Payment
&amount=16.00
&quantity=1
&src=1
&sra=1

In most cases it is Mobile device with following headers: Mozilla/5.0 (Linux; Android 6.0; VS990 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Mobile Safari/537.36

or

Mozilla/5.0 (Linux; Android 6.0.1; SM-G935V Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/50.0.2661.86 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/78.0.0.16.67;]

Everything worked fine for a year, and that started to happen 2 days ago, and effects about 10% of the users.


This kind of problems does exist in FF if you wait for 10 s. My solution is change the return url to "xxx.com?orderId=xxx". Then you judge if it's a POST or GET. and select your order information by orderId You don't need to worry about the status of payment. because it's should be always successful if it's returning to your store not "cancel_return"


You actually need to double-check the transaction before offering the actual product on the success page.

You can use PDT for this: https://developer.paypal.com/docs/classic/products/payment-data-transfer/ . It allows the website to instantly verify that digital goods and downloads are actually fully paid for, before offering them to the customer.

So when user reaches your success page, you simply make a PDT call within the same page and verify the transaction:

  • If payment went through, then you can safely give them their goodies
  • If payment failed, you show them an error, letting them know that the payment didn't actually go through.

Paypal actually suggests that both IPN and PDT should be used for best results, as they have different purposes and complete the same goal. Read here: https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNPDTAnAlternativetoIPN/ . At the bottom, it says "If your site must be notified of payments immediately, you can implement both IPN and PDT."

Your situation is not new. I've heard of similar cases in the past. Reasons might vary, and only Paypal could give the answer for the actual reason.

Also: If you don't want to change your success page, use an intermediate redirector page that verifies it "please wait, verifying your transaction..." while making the PDT call. If PDT returns success, then redirect them to the final success page. If not, show them the error.



Paypal - Return url page and variables

Its possible to add on return variable, the order id, then you get your order id when the user return and from the order id you show him the informations.

Eg

<input type="hidden" name="return" value="myReturnUrl.php?OrderID=88273882717A72734">