PayPal redirects to the same popup window
Asked Answered
P

4

7

I integrated PayPal's Identity API in my webpage. As usual when user clicks login with paypal(JavaScript button) it opens a new window for login purpose. But after a valid login it redirect me to the same popup window.

Note: I replaced my domain name as domain

App return URL (test): http://domain.esy.es/index.php/users/paypalidentity

View

//url http://domain.esy.es/index.php
<span id="paypalButton"></span>
<script src="https://www.paypalobjects.com/js/external/api.js"></script>
<script>
    paypal.use( ["login"], function(login) {
        login.render ({
            "appid": MYAPPID,
            "authend": "sandbox",
            "scopes": "openid email profile address phone https://uri.paypal.com/services/paypalattributes",
            "containerid": "paypalButton",
            "locale": "en-us",
            "returnurl": "http://domain.esy.es/index.php/users/paypalidentity"
        });
    });
</script>

Controller

//url http://domain.esy.es/index.php/users/paypalidentity
require_once __DIR__ . '/../../vendor/autoload.php';
$apicontext = new PPApiContext(array('mode' => 'sandbox'));
$code = $_REQUEST['code'];
$apicontext = new PPApiContext(array('mode' => 'sandbox'));
$params = array(
    'client_id' => MYCLIENTID,
    'client_secret' => MYSECRET,
    'code' => $code
);
$token = PPOpenIdTokeninfo::createFromAuthorizationCode($params,$apicontext);
$apicontext = new PPApiContext(array('mode' => 'sandbox'));
$params = array('access_token' => $token->getAccessToken());
$user = PPOpenIdUserinfo::getUserinfo($params,$apicontext);
$this->session->set_userdata(
    array(
        'name'=>$user->getName()
    )
);
redirect(base_url());

Successful Login enter image description here

Redirecting to the configured redirect URL enter image description here

Paunch answered 3/4, 2014 at 18:40 Comment(3)
Pretty sure you need to add a close() trigger from the PayPal javascript on your return URL. In fact, the procedure would be to create a separate return URL that has nothing but this close() action on it. PayPal would redirect to it, but then it would immediately close, leaving you with the screen behind like you want. It's detailed in the docs. Let me see if I can find it and post an official answer.Aestivation
Last answer does what you asked for - mark it.Dwarf
Great question. It is June 2016 now and PayPal still has not explained how to do it.Nefarious
T
3

I had the exact problem, but the solution is in the documentation here:

https://developer.paypal.com/docs/classic/express-checkout/digital-goods/ClosingWindow/

Refer to "Reloading Parent Page to a Specific URL" and add this script to the return and cancel pages.

<script>
    top.window.opener.location ='http://your-url-here.html';
    // if you want to close the window
    // window.close();
</script>
Thorr answered 11/6, 2014 at 11:41 Comment(1)
You sir are my hero! Great answer + I've edited it to close the window.Dwarf
A
1

You need to add the close action in your return URL (and most likely use a separate URL as the return URL with nothing but the close action in it).

Take a look at the Adaptive Payments documentation. Do a find on that page for the word close and it'll take you straight to the section that covers how to handle this.

Note: You are responsible for closing the minibrowser after PayPal redirects to the page specified in either the return or cancel URL. PayPal provides a JavaScript function that you call to close a PayPal minibrowser or lightbox.

Aestivation answered 4/4, 2014 at 0:47 Comment(0)
I
1

Setting top.window.opener.location will update your original "opener" window. You will also need to close the dialog by calling top.close(). This is just an attempt at combining the other two answers and sharing the solution I arrived at with their help. Note that this code is in a url other than the "opener" window.

<script src="https://www.paypalobjects.com/js/external/api.js"></script>
<script>
top.window.opener.location ='http://yourdomain.com';
top.close();
</script>
Isomagnetic answered 8/9, 2014 at 15:34 Comment(0)
T
0

Few more points to add. fullPage option currently has no effects, and:

  1. If user login inside the pop-up, then redirect happens in it, not the parent page
  2. If user already login before and press "Continue", then the redirect happens in the parent page, and the pop-up would be closed.

To distinguish them, check top.window.opener is null or not

if (top.window.opener) {
    top.window.opener.location = window.location.href;
    top.close();
}
Treatment answered 30/12, 2023 at 4:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.