2

ここでPythonとJQueryを使用します。

以前は、検証(JQueryプラグイン)呼び出しで通常を使用して送信していform.submit();ました。submitHandlerこれはBraintreeの透過的なリダイレクトURLに送信され、redirect-toはサーバー上のGETハンドラーに設定されています。確認を行ってから、ハンドラーで別のリダイレクトを行います。送信されたデータがbraintreeを通過しなかった場合(たとえば、クレジットカードが不良)、<div id="error">errormessage</div>ハンドラーからの応答でaにhtmlを書き込み、これがユーザーのページに挿入されます。

問題は、ハンドラーにエラーがあり、500ステータスコードが生成され、すべてが地獄に落ち、ユーザーのページが望ましくない動作をする場合です。

ハンドラーからの500応答が発生した場合に、それを処理できるようにしたいと思います。

statusCodejQueryのAJAXの属性を使ってできると思っていました。

これが私が(で)試したことですsubmitHandler

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

次に、ハンドラーで意図的にエラーを発生させて500を強制します。

しかし、BraintreeURLへの私のajax送信が機能していません。しかしform.submit();、うまくいきました。

私は何が間違っているのですか?このようにAJAX経由でフォームを送信して同じ結果が得られると考えるのは間違っていますか?

FWIW、次のように、htmlフォームにいくつかの属性を提供しています。

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

編集:

ajaxについてもう少し読んだ後、ここでのセットアップが機能しない可能性のある理由は、同一生成元ポリシーに違反して別のドメイン(Braintree)を呼び出しているためであることに気付きました。したがって、ブラウザはそれを実行していません。

差出人:http ://api.jquery.com/jQuery.ajax/

ブラウザのセキュリティ制限により、ほとんどの「Ajax」リクエストには同一生成元ポリシーが適用されます。リクエストは、別のドメイン、サブドメイン、またはプロトコルからデータを正常に取得できません。

4

1 に答える 1

4

わかりました...これはajaxの10年前のバージョンですが、私にとっては素晴らしい働きをしています。

通常のフォーム送信($ .ajaxへの呼び出しなし)を使用しますが、ページ内の非表示のiframeをターゲットにします。

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

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

load次に、jQueryを使用してiframeのイベントにフックします。

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

次に、ブレインツリーのコールバックURLを変更してJSONデータを返します。これにより、iframeでレンダリングされ、クライアント側で処理できるようになります。それでおしまい!このメソッドは、ブレインツリーが現在のページと同じオリジンを持つURLにリダイレクトすることを前提としていることに注意してください。そうしないと、iframeのコンテンツを読むことができないと思います。

于 2012-09-25T21:51:50.557 に答える