Balakrishnan
Balakrishnan

Reputation: 2441

PayPal redirects to the same popup window

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

Upvotes: 7

Views: 5771

Answers (4)

David
David

Reputation: 1

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();
}

Upvotes: 0

derekadk
derekadk

Reputation: 224

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>

Upvotes: 3

Gavin Palmer
Gavin Palmer

Reputation: 1220

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>

Upvotes: 1

Drew Angell
Drew Angell

Reputation: 26036

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.

Upvotes: 1

Related Questions