为什么我的表单不与Stripe通信?

时间:2014-03-28 02:24:29

标签: javascript ruby-on-rails stripe-payments

在包含我的订单表单的页面上,在<head>中,我有:

= jquery_include_tag Rails.application.config.jquery_version
= javascript_include_tag "https://js.stripe.com/v2/"
:javascript
  $(function(){
    Stripe.setPublishableKey('pk_test_NEgBLhQ1dJGvlE8SDFEXqRQ4');
  });
  (function() {
    var stripeResponseHandler;

    $("#new_order").submit(function(event) {
      var form;
      form = $(this);
      form.find("#submit_order").prop("disabled", true);
      Stripe.createToken(form, stripeResponseHandler);
      return false;
    });

    stripeResponseHandler = function(status, response) {
      var form, token;
      form = $("#new_order");
      if (response.error) {
        form.find(".payment-errors").text(response.error.message);
        form.find("#submit_order").prop("disabled", false);
      } else {
        token = response.id;
        form.append($("<input type=\"hidden\" name=\"stripeToken\">").val(token));
        form.get(0).submit();
      }
    };

  }).call(this);

您在上面列出的密钥在https://manage.stripe.com/account/apikeys标有“Test Publishable Key”。

该页面上的表格包括:

= simple_form_for @order, :html => {:id => "new_order"} do |f|
  = f.error_notification
  = text_field_tag :number, nil, :name => nil, "data-stripe" => "number"
  = text_field_tag :cvc, nil, :name => nil, "data-stripe" => "cvc"
  = text_field_tag :expiry_month, nil, "data-stripe" => "exp-month"
  = text_field_tag :expiry_year, "data-stripe" => "exp-year"
  = f.button :submit, :as => :button, :id => 'submit_order'  

(删除所有标签/占位符/等和非条带字段。)

目前我在localhost上以开发模式运行它,没有任何SSL。

当我使用有效或无效的信用卡数据完成订单并单击创建订单时,我的Rails应用程序会记录订单,但Javascript似乎与Stripe服务器无法通信。在Chrome的Javascript控制台中,我认为没有任何错误 - 或者根据我所知的任何Javascript活动。我在https://manage.stripe.com/test/events看到没有任何指控 - 无论是成功的还是其他指控。

我知道Rails的方式,但我是一个Javascript新手。我如何诊断这里发生了什么?可能是什么原因?

1 个答案:

答案 0 :(得分:1)

  (function() {

这应该是

  $(function() {

(你可以放弃.call(this)东西)

它正在<head>中立即执行,这可能意味着$("#new_order")找不到表单 - 浏览器甚至没有呈现它,或者甚至可能从网络上接收到它的HTML,但是 - 所以选择器匹配零项,事件绑定是无操作。

或者,如果你把代码放在</body>之前,那也可以做到。

(另外,将Stripe.setPublishableKey()放在$(function() { … })块中也没用。)