2012-07-03 8 views
5

He estado trabajando en la integración de Stripe en mi aplicación web, y parece que no funciona. Para ayudarme, he estado usando Rails Cast de Ryan Bates para integrar Stripe. Cada vez que intento ejecutar el formulario de pago, aparece un mensaje de error que dice "Hubo un problema con mi tarjeta de crédito". Creo que el problema radica en mi archivo coffeescript, pero quizás estoy equivocado. Incluí el token de usuario de stripe como parte de mi modelo de usuario en lugar de colocarlo en su propio modelo de suscripción. Aquí está el código que tengo CoffeeScript:¿Qué hay de malo con mi coffeescript en Stripe?

jQuery -> 
    Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content')) 
    subscription.setupForm() 

user = 
    setupForm: -> 
    $('#new_user').submit -> 
     $('input[type=submit]').attr('disabled', true) 
     if $('#card_number').length 
     user.processCard() 
     false 
     else 
     true 

    processCard: -> 
    card = 
     number: $('#card_number').val() 
     cvc: $('#card_code').val() 
     expMonth: $('#card_month').val() 
     expYear: $('#card_year').val() 
    Stripe.createToken(card, user.handleStripeResponse) 

    handleStripeResponse: (status, response) -> 
    if status == 500 
     $('#user_stripe_card_token').val(response.id) 
     $('#new_user')[0].submit() 
    else 
     $('#stripe_error').text(response.error.message) 
     $('input[type=submit]').attr('disabled', false) 

Soy un principiante cuando se trata de la programación, por lo que cualquier ayuda que puede dar mí sería grande.

Aquí está el error que consigo en mi terminal cuando intento para inscribirse:

Parámetros: { "UTF-8" => "✓", "authenticity_token" => "Xas + iA + a3op7jUi57qTr7XWQSClPscA7fR19rkclkEE =" " usuario "=> {" stripe_card_token "=>" "," name "=>" Jack "," email "=>" [email protected] "," phone_number "=>" 203-xxx-xxxx "," contraseña "=>" [FILTERED] "," password_confirmation "=>" [FILTERED] "}," commit "=>" Crear mi cuenta "}

El usuario existe (0.2ms) SELECT 1 AS one FROM" users " WHERE LOWER ("usuarios". "Email") = LOWER ('[email protected] ') LÍMITE 1 Error de banda mientras se crea el cliente: ID del token no válido:

Mi visión para el registro es el siguiente:

<% provide(:title, 'Sign up') %> 
<h1>Sign up</h1> 

<div class="row"> 
    <div class="span6 offset3"> 
     <%= form_for(@user) do |f| %> 
      <%= render 'shared/error_messages' %> 

      <%= f.hidden_field :stripe_card_token %> 

      <%= f.label :name %> 
      <%= f.text_field :name %> 

      <%= f.label :email %> 
      <%= f.text_field :email %> 

      <%= f.label :phone_number, "Your cell phone number" %> 
      <%= f.text_field :phone_number %> 

      <%= f.label :password %> 
      <%= f.password_field :password %> 

      <%= f.label :password_confirmation, "Password confirmation" %> 
      <%= f.password_field :password_confirmation %> 

      <%= label_tag :card_number, "Credit Card Number" %> 
      <%= text_field_tag :card_number, nil, name: nil %> 

      <%= label_tag :card_code, "Security Code on Card (CVV)" %> 
      <%= text_field_tag :card_code, nil, name: nil %> 

      <%= label_tag :card_month, "Card Expiration" %> 
      <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"}%> 
     <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %> 

    <%= f.submit "Create my account", class: "btn btn-large btn-primary" %> 
    <% end %> 
</div> 
</div> 

<div id="stripe_error"> 
    <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript> 
</div> 

Mi código para mi controlador está presente para el método de crear:

def create 
    @user = User.new(params[:user]) 
    if @user.save_with_payment 
    sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
    redirect_to edit_user_path(current_user) 
    UserMailer.welcome_email(@user).deliver 
    else 
     render 'new' 
    end 
    end 

Mi código para la migración de base de datos para el token de usuario es la siguiente:

class AddStripeToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :stripe_customer_token, :string 
    end 
end 

Y el código para el método save_with_payment en mi modelo es la siguiente:

def save_with_payment 
    if valid? 
     customer = Stripe::Customer.create(description: email, plan: 1, card: stripe_card_token) 
     self.stripe_customer_token = customer.id 
     save! 
    end 

    rescue Stripe::InvalidRequestError => e 
    logger.error "Stripe error while creating customer: #{e.message}" 
    errors.add :base, "There was a problem with your credit card." 
    false 
    end 
+0

¿Qué 'estado' y' respuesta' están recibiendo y qué le hace pensar que su CoffeeScript en lugar de la información de su tarjeta es el problema? –

+0

En línea, mi cuenta se encuentra actualmente en modo de prueba, y estoy usando el código de la tarjeta: 4242424242424242, el código de cvc: 123 y una fecha de vencimiento pasada el mes de hoy. No obtengo un error de aplicación, sino solo un error de que la información de la tarjeta es incorrecta. Agregaré el error que recibí en mi terminal a la pregunta original. ¡Gracias por tu interés! – user1483441

+0

¿Por qué está comprobando 'status == 500' como una condición de éxito? Eso significa que hubo un error del servidor en los servidores de Stripe. Debería verificar 'if (! Response.error)'. Notaste que 'stripe_card_token' está vacío en tu servidor, ¿verdad? –

Respuesta

0

2 cosas que vienen a la mente:

  1. usted debe hacer una comprobación del estado de 200, no 500
  2. Es posible que deba requerir el archivo CoffeeScript en sus application.js
    • p.ej // = requieren que los usuarios
0

Podría estar equivocado, pero en este momento:

handleStripeResponse: (status, response) -> 
    if status == 500 
    $('#user_stripe_card_token').val(response.id) 

Además de cambiar if status == 500 a if status == 200, esta línea $('#user_stripe_card_token').val(response.id) puede ser necesario hacer $('#new_user_stripe_card_token').val(response.id). Asegúrese de verificar la ID de entrada.

Cuestiones relacionadas