Как обрабатывать ответ от PayPal In-Context в AngularJS вместо NodeJS

У меня возникли проблемы с получением ответа от кода NodeJS на стороне сервера после проверки с использованием PayPal In-Context через paypal-rest-sdk.

У меня есть форма PayPal, определенная в html, и я намеренно не определяю действие. Я только определил идентификатор и метод (получить). В моем коде Angular я определяю действие при нажатии кнопки PayPal:

var payPalForm = document.getElementById('payPalForm');

payPalForm.addEventListener("click", function(e) {

  payPalForm.setAttribute('action', "https://10.0.0.25:8001/checkout/" +
    $scope.user._id + "/" + $scope.viewEvent._id.valueOf() + "/" + 
    $scope.viewEvent.eventName + "/" + $scope.viewEvent.price);

});

Делая это, я могу успешно оформить заказ через PayPal In-Context.

В моем коде NodeJS после успешной проверки вместо return res.end(); в случае успеха или res.sendStatus(400, 'bad paypal payment'); в случае сбоя я хотел бы передать статус обратно в Angular и обработать его там.

Повторюсь: я не хочу определять внутриконтекстный маршрут PayPal в NodeJS, я хотел бы сделать это в Angular.

Мне нужно сделать это, поскольку я использую пользовательский интерфейс Onsen и использую splitter для навигации между страницами.

Кто-нибудь успешно сделал это?

ОБНОВЛЕНИЕ ПОСЛЕ ПОПЫТКИ ПЕРВОГО ОТВЕТА

Я пробовал это раньше, но после попытки реализовать ответ Ильи Скай в результате проверка PayPal In-Context выполняется неправильно. Сценарий работает правильно (что определяется выводом в терминале), но окно In-Context загружается с "?" в качестве параметра, а затем сразу закрывается. Вот скриншоты того, как я обновлял свой код. Закомментированный код — это то, что у меня было, когда я смог успешно оформить заказ, но не смог правильно перенаправить: Контроллер Service

Я думаю, что это проблема с PayPal, и я не знаю, как ее решить.

Вот почему мне интересно, могу ли я прослушивать перенаправление в Angular, а затем загружать другую страницу при обнаружении определенного перенаправления.

Я пробовал это в своих контроллерах Angular, но он выполнялся только при загрузке начальной страницы: введите здесь описание изображения


person rgins16    schedule 09.08.2016    source источник


Ответы (2)


Я могу ошибаться, но из того, что я понимаю, вы хотите сделать следующее:

  1. Отправить данные на сервер (в https://10.0.0.25:8001/checkout/...)
  2. Сделайте что-нибудь на сервере и дайте ответ (res.send и т. д.)
  3. Обработка ответа на клиенте

Верно?

Для этого самым простым решением было бы просто отправить запрос ajax на сервер, а затем обработать ответ.

Это означает, что вместо изменения атрибута действия вы можете сделать запрос напрямую через js. В случае с angular это можно сделать с помощью службы $http.

$http.post('https://10.0...').then(successCallback, errorCallback);

А в success|errorCallback можно делать все что угодно, например, загрузить страницу в разделитель или что угодно :)

Чтобы изменить то, что происходит, когда вы пытаетесь отправить форму, вы можете проверить ng-submit.

И чтобы получить $http, вы можете просто добавить его в список аргументов вашего контроллера.

Пример

app.controller('ExampleController', function($scope, $http) {
  $scope.submit = function() {
    $http.post('your/long/url').then(function(response) {
      mySplitter.content.load('success-page.html');
    }, function(response) {
      mySplitter.content.load('error-page.html');  
    });
  };
}]);

<form ng-submit="submit()" ng-controller="ExampleController">
  ...
</form>
person Ilia Yatchev    schedule 10.08.2016
comment
Ну... вот в чем дело. Мне нужно инициализировать все мои формы PayPal (кнопки) при загрузке начальной страницы в Javascript. Именно там я также внедряю в них скрипт PayPal. В исходном контроллере я установил переменную области видимости, равную одной из форм PayPal. Затем, когда я перехожу на другую страницу (которая использует другой контроллер), которая будет содержать одну из созданных мной форм (кнопок) PayPal, я устанавливаю переменную области действия в этом контроллере, равную переменной области действия в другом контроллере. Затем я добавляю это как дочерний элемент div на новой странице, на которой я нахожусь. Поэтому я не могу использовать ng-submit. - person rgins16; 10.08.2016
comment
Мне интересно, могу ли я прослушивать конкретное перенаправление в Angular, а затем использовать свой сплиттер для загрузки другой страницы в зависимости от того, что такое перенаправление. Перенаправление будет отличаться в зависимости от того, был ли процесс PayPal успешным или неудачным. - person rgins16; 10.08.2016
comment
Если я не инициализирую все формы (кнопки) PayPal сразу и не введу сценарий во все из них одновременно, я получаю сообщение об ошибке при попытке внедрить сценарий более одного раза. - person rgins16; 10.08.2016
comment
Привет - извините, я не совсем понял вас после первых 3 комментариев. Глядя на ваше обновление, кажется, что форма все еще может отправляться, поскольку вы говорите, что видите ? в своем URL-адресе. Чтобы исправить это, вы можете изменить click на submit, а затем добавить e.preventDefault(). - person Ilia Yatchev; 13.08.2016

Я призываю всех перейти по этой ссылке.

Один из разработчиков PayPal опубликовал образец Kraken с Angular примером контекстной проверки PayPal.

person rgins16    schedule 11.08.2016