I'm working on integrating Stripe with my Rails project, and have it working to the point where when a new user signs up they are added as a customer in Stripe. I'm having some problems sending the plan_id to them, however.
The URL of the sign up form includes the plan_id as a parameter depending on which plan is selected from the pricing table, for example:
http://localhost:3000/users/sign_up?plan_id=1
The sign up form includes the following hidden field, which should pass the plan_id to Stripe:
<%= f.hidden_field :plan_id, value: params[:plan_id] %>
The following code is in the user.rb model, to create the new Stripe customer:
after_create :save_with_payment
def save_with_payment
if valid?
customer = Stripe::Customer.create(description: email, plan: plan_id, card: stripe_card_token)
self.stripe_customer_token = customer.id
save!
end
end
The following code is in the User controller:
def create
@user = User.new(params[:user])
if @user.save_with_payment
redirect_to @user, :notice => "Thank you for subscribing!"
else
render :new
end
end
When I submit the sign up form, the new user is created and seen in Stripe. The issue is that the plan_id value is not being passed to Stripe, so the customer is not being associated with a plan. In addition, the value of plan_id is not being saved under that user in the database.
When asking this question earlier, I was told the solution would be to dynamically add an attr value into the hidden_field. I'm not certain how I could go about doing that, but I'd expect to need to modify the coffeescript that validates the form's cc info:
$(document).on 'ready page:load', ->
user.setupForm()
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
return
user =
setupForm: ->
$('form#new_user').on "submit", (event) ->
$('input[type=submit]').attr('disabled', true)
user.processCard()
event.preventDefault()
processCard: ->
card =
number: $('#card_number').val()
cvc: $('#card_code').val()
expMonth: $('#date_month').val()
expYear: $('#date_year').val()
Stripe.createToken(card, user.handleStripeResponse)
handleStripeResponse: (status, response) ->
if status == 200
$('#user_stripe_card_token').val(response.id)
$('#new_user')[0].submit()
else
$('#stripe_error').text(response.error.message)
$('input[type=submit]').attr('disabled', false)