Как отправить данные формы через AJAX в Braintree Transparent redirect? - PullRequest
2 голосов
/ 14 ноября 2011

Использование Python и JQuery здесь ..

Ранее мы отправляли с использованием обычного form.submit(); в submitHandler вызова проверки (плагин JQuery).Это было передано в прозрачный URL-адрес перенаправления Брейнтри, где параметр redirect-to был установлен как обработчик GET на нашем сервере.Мы делаем подтверждение, а затем еще раз перенаправляем в наш обработчик.Если отправленные данные не прошли через braintree (скажем, плохая кредитная карта), мы записываем html в <div id="error">errormessage</div> в ответе нашего обработчика, и это вставляется на страницу пользователя.

Проблема в том, что в нашем обработчике есть ошибка, которая выдает код состояния 500, все падает в ад, и страница пользователя ведет себя нежелательно.

Я хочу иметь возможность обработать ответ 500 от нашегообработчик, если это произойдет.

Я думал, что смогу сделать это, используя атрибут statusCode в AJAX jQuery.

вот что я пробовал (в submitHandler):

var data = $(form).serialize();
$.ajax({
  type: 'POST',
  url: braintree_url,
  data: data,
  statusCode: {
    500: function() {
      alert('broked response yo');
    }
  }
});

И затем я намеренно выдвигаю ошибку в нашем обработчике, чтобы заставить 500.

Но мой ajax, отправленный на URL Braintree, не работает.Однако form.submit(); работал нормально.

Что я делаю не так?Неправильно ли я думать, что форма может быть отправлена ​​через AJAX, как это и привести к тому же результату?

FWIW, мы предоставляем ряд атрибутов для нашей HTML-формы, как показано ниже:

%form#addcard{"action": braintree_url, "method": "post", "autocomplete": "off", "submittype": "secure", "next": braintree_url, "target": "hidden_iframe")}

EDIT:

После некоторого прочтения о ajax я понял, что вероятная причина, по которой мои настройки здесь не работают, заключается в том, что они обращаются к другому домену (Braintree's) в нарушение той же политики происхождения.Таким образом, браузер не выполняет его.

from: http://api.jquery.com/jQuery.ajax/

Из-за ограничений безопасности браузера большинство запросов «Ajax» подчиняются той же политике происхождения;запрос не может успешно получить данные из другого домена, субдомена или протокола.

1 Ответ

4 голосов
/ 26 сентября 2012

Хорошо ... это десятилетняя версия ajax, но она отлично работает для меня:

Используйте обычную отправку формы (без вызовов $ .ajax), но нацеливайтесь на скрытый iframe вВаша страница:

<form action="<%= Braintree::TransparentRedirect.url %>" method="POST" target="braintree-result">
...
</form>

<iframe name="braintree-result" id="braintree-target" style="display:none;"></iframe>

Затем подключите событие iframe load с помощью jQuery:

$('#braintree-target').on('load', function() {
    var data = $.parseJSON( $(this).contents().text() );
    // Handle response data here
});

Затем измените URL обратного вызова braintree, чтобы он возвращал данные JSON, которые будут отображаться в вашем iframe.так что вы можете справиться с этим на стороне клиента.Это оно!Обратите внимание, что этот метод предполагает, что у вас есть перенаправление braintree обратно на URL с тем же источником, что и на текущей странице.В противном случае я не думаю, что вы сможете прочитать содержимое iframe.

...