调试条带支付coffeescript

调试条带支付coffeescript,coffeescript,stripe-payments,Coffeescript,Stripe Payments,我有以下代码: order = setupForm: -> $('.new_order').submit -> $form = $(this) $form.find('input[type=submit]').attr('disabled', true) order.processCard($form) false processCard: ($form)-> card = number: $

我有以下代码:

order =
  setupForm: ->
    $('.new_order').submit ->
      $form = $(this)
      $form.find('input[type=submit]').attr('disabled', true)
      order.processCard($form)
      false

  processCard: ($form)->
    card =
      number: $form.find('.card_number').val()
      cvc: $form.find('.card_code').val()
      expMonth: $form.find('.card_month').val()
      expYear: $form.find('.card_year').val()
    Stripe.createToken card, (status, response) ->
      order.handleStripeResponse(status, response, $form)

  handleStripeResponse: (status, response, $form) ->
    if status == 200
      $form.find('.order_stripe_card_token').val(response.id)
      $form.submit()
    else
      $form.find('.stripe_error').text(response.error.message)
      $form.find('input[type=submit]').attr('disabled', false)
它完全可以呈现错误(如果卡号错误/丢失等),但当我输入Stripe提供的正确的卡详细信息时,它不会提交任何内容


我确信我遗漏了一些非常明显的东西,但需要一些新的眼光来指出错误所在。

您的问题是您的提交处理程序调用了您的提交处理程序,后者调用了您的提交处理程序,后者

事件的顺序如下所示:

  • 已提交
  • 提交处理程序调用
    processCard
  • processCard
    通过
    stripe.createToken
    对stripe进行AJAX调用
  • createToken
    回调调用
    handleStripeResponse
  • handleStripeResponse
    调用
    $form.submit()
  • 已提交
  • 如果我们看一个简化和工具化的示例,问题可能会更清楚。给出一个简单的
    ,带有一个提交按钮和以下代码:

    hand_break = 0
    
    ajax_simulator = ($f) ->
        fn = ->
            console.log("AJAX callback called: #{hand_break}")
            $f.submit()
        setTimeout(fn, 500)
    
    $('#f').submit ->
        return false if(++hand_break > 3)
        console.log("submit handler called: #{hand_break}")
        ajax_simulator($(@))
        false
    
    当你点击submit按钮时,你会看到它循环了三次,
    hand\u break
    这个东西就是用来手动停止无限循环的

    演示:

    那么,如何打破这种循环呢?您的
    $('.new_order').submit
    处理程序需要知道何时返回
    false
    以及何时返回
    true
    ,如果您返回
    true
    ,则表单将提交到服务器,一切都会正常。您已经在存储条带令牌:

    $form.find('.order_stripe_card_token').val(response.id)
    
    所以你可以检查一下是否有:

    $('.new_order').submit ->
      return true if($form.find('.order_stripe_card_token').val())
      #...
    

    您需要确保
    .order\u stripe\u card\u token
    已正确初始化、错误清除等。

    回答得非常好,感谢您带领我了解错误的整个过程。