2016-11-29 3 views
1

У меня такая же проблема as this question, но его реализация отличается.Paypal In-Context Родительская страница не перенаправляется

Paypal Кнопка Реализация

Причина я реализовал это так, потому что мы должны иметь paypal button как link. Поэтому я создал что-то вроде <a ng-click="vm.generatePaypalButtonAndClick()"></a>, чтобы взломать это. Просто игнорируйте параметры, поскольку это всего лишь пример.

function generatePaypalButtonAndClick(data, vm) { 
    var originUrl = window.location.origin; // to get 'https://localhost:3000' or 'https://pp.website.com' 

    // create hidden form element 
    // production - https://www.paypal.com/cgi-bin/webscr 
    var paypalForm = angular.element('<form action="https://www.sandbox.paypal.com/cgi-bin/webscr"' + 
     'method="post" target="_top" id="paypal-payment-form"></form>'); 
    angular.element(document.body).append(paypalForm); 

    // append elements inside the form 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="upload" value="1">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="USER" value="xxxxxxxxxxx.gmail.com">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="PWD" value="xxxxxxxxxx">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="SIGNATURE" value="xxxxxxxxxxxxxxxxxxxxxxxxxx">'); 

    angular.element('#paypal-payment-form').append('<input type="hidden" name="cmd" value="_cart">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="business" value="[email protected]">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="lc" value="US">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="return" value="' + originUrl + vm.returnUrl + '">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="cancel_return" value="' + originUrl + vm.cancelUrl + '">'); 

    // loop through all data returned 
    _(data).forEach(function(value, key) { 
     var idx = key + 1; 
     angular.element('#paypal-payment-form').append('<input type="hidden" name="item_name_' + idx + '" value="' + value.itemName + '">'); 
     angular.element('#paypal-payment-form').append('<input type="hidden" name="item_number_' + idx + '" value="' + value.quantity + '">'); 
     angular.element('#paypal-payment-form').append('<input type="hidden" name="amount_' + idx + '" value="' + value.amount +'">'); 
    }); 

    angular.element('#paypal-payment-form').append('<input type="hidden" name="custom" value="xxxxxxxxxxxxx">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="currency_code" value="USD">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="no_note" value="1">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="no_shipping" value="1">'); 
    angular.element('#paypal-payment-form').append('<input type="hidden" name="rm" value="2">'); 

    // let paypal create the button 
    window.paypalCheckoutReady = function() { 
     paypal.checkout.setup('xxxxxxxxxxxxxxxxxx', { 
      environment: 'sandbox', // sandbox/production 
      container: 'paypal-payment-form' 
     }); 
    }; 

    // trigger click 
    $timeout(function() { 
     var paypalFormToClick = document.getElementsByClassName('paypal-button-content'); 
     angular.element('.paypal-button-content').click(); 

    }, 1000); 

    // remove form 
    $timeout(function() { 
     angular.element('#paypal-payment-form').remove(); 
    }, 1000); 
} 

После того, как оплата будет сделано, я ожидаю, что родительская страница будет перенаправлен на URL, установленного в vm.returnUrl (скажем http://localhost:3000/payments/paid).

Что происходит после оплаты, страница pop-up paypal перенаправляется, а затем закрывается. Родительская страница хранится как есть.

Я пытался добавить скрипт на страницу, где пользователь должен быть перенаправлен, как указано в this answer

<script> 
    top.window.opener.location = 'http://localhost:3000/payments/paid'; 
    // if you want to close the window 
    window.close(); 
</script> 

Но это не работает. Я также получаю кучу ошибок, когда всплывающее окно закрывается:

checkout.js:9315 ppxo_xc_ppcheckout_unexpected_listener_init 
checkout.js:9315 ppxo_xc_ppcheckout_error 
checkout.js:9315 ppxo_paypal_legacy_error 
     "Error: Unexpected init message from domain http://localhost:3000 --  expected message from https://www.sandbox.paypal.com 
checkout.js:9315 ppxo_paypal_legacy_error_handler 
     "Error: Unexpected init message from domain http://localhost:3000 -- expected message from https://www.sandbox.paypal.com 
checkout.js:3919 
     Uncaught Error: Unexpected init message from domain http://localhost:3000 -- expected message from https://www.sandbox.paypal.com 

Я уже установлен Auto Redirect к On в PAYPAL настройках.

Не стесняйтесь сообщить какие дополнительные данные необходимы.

ответ

0

Я просто сделал взлом, чтобы обойти это, но он грязный. Я добавил скрипт в файл маршрута.

resolve: { 
    // script for redirecting parent page after success payment 
    test: [function() { 
      var originUrl = window.location.origin; 
      if (window.opener) { // check if opened in popup 
       window.close(); 
       window.opener.location = originUrl + '/payments/paid'; 
      } 
     }, 
    ], 
}, 

всплывающее окно будет еще открыть /payments/paid страницы перенаправить родительскую страницу, когда он закрывается.

Смежные вопросы