PayPal is ignoring my return
variable on PayPal Subscribe Button, even though "Auto return" option is enabled.
At first, I did not have the "Auto return" option enabled, and PayPal just showed a receipt page after the user subscribed, with no link back to our site, despite passing the return
variable with our receipt page.
Then we enabled the "Auto return" option and was forced to enter some URL, so we created a generic page for PayPal to hit to verify the page exists, which I understand is required to enable the feature.
However, now users are able to subscribe and they see that awesome "If you are not redirected... in 10 seconds... click here" message, which takes the user to the static return page we setup in the "Auto return" settings, not the dynamic URL we passed to PayPal using the return
variable.
Here's what our button code looks like:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="MYHOSTEDBUTTONID">
<input type="hidden" name="custom" value="MyCustomData">
<input type="hidden" name="return" value="https://www.example.com/secure/page/receipt?specialId=1234">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
Did PayPal break this feature or am I doing something wrong?
For hosted buttons, the return doesn't belong there, it should be in the Advanced Variables section of step 3 of creating the button.
These HTML buttons are deprecated, they are from ~18 years ago and some new PayPal accounts can no longer create them (my understanding is all will not be able to create them soon enough.) The recommended integration method is a "Smart Subscribe" button, which uses JS and a client ID to identify the receiver account. To be notified of completed payments with a smart subscribe button, create a listener URL on your server for the webhook event PAYMENT.SALE.COMPLETED
(that is the only subscription webhook event that is truly useful, all others are of limited utility). As for redirecting a Smart payer, if you need to do that you can add a window.location.href redirect from the onApprove function. Modern websites don't redirect unless they absolutely need to, consider using this function to display whatever message in the DOM w/o a redirect. But don't depend on sending data to a server from the client onApprove, as for whatever reason the client may never notify the server. The PAYMENT.SALE.COMPLETED webhook is the only reliable way to get notifications. For reconciliation, there is a similar custom_id
variable available alongside the plan_id when creating the subscription in the createSubscription function.