2016-02-05 7 views
0

Я использую проверку полосы в приложении Rails 4x. Моя цель - ежемесячные подписки. Я получаю следующее.Рельсы: нельзя использовать маркер Stripe более одного раза - [Stripe :: InvalidRequestError]

Stripe :: InvalidRequestError Нельзя использовать stripeToken более одного раза. Это происходит, когда create_stripe_subscription вызывается в subscriptions_controller#create.

Несмотря на это сообщение об ошибке, у меня есть клиенты, которые взимают сборы, которые появляются на моей приборной панели.

Я хотел бы узнать, где я дублирую этот одноразовый токен и понять, какая полоса требуется для этой подписки.

Здесь приведены файлы &, чтобы продемонстрировать, какие мои усилия по реализации выглядят так.

Инициализаторов/stripe.rb:

Rails.configuration.stripe = { 
    publishable_key: ENV["STRIPE_PUBLISHABLE_KEY"], 
    secret_key: ENV["STRIPE_SECRET_KEY"] 
} 

Stripe.api_key = Rails.configuration.stripe[:secret_key] 

подписки (кнопка "маленькая" план полосы фотографии)/новой

<script src="https://checkout.stripe.com/checkout.js" 
class="stripe-button", 
    data-key="<%= ENV["STRIPE_PUBLISHABLE_KEY"] %>", 
    data-email="<%= current_employee.email %>", 
    data-image="app/assets/images/mascot_favicon.ico", 
    data-name="Small Group Home", 
    data-description="Monthly subcription plan", 
    data-amount="<%= @small_plan.amount %>", 
    data-id="<%= @small_plan.id %>", 
    data-label="Subscribe!"> 
</script> 

subscriptions_controller.rb

def create 
    create_stripe_subscription 

    if create_stripe_subscription.valid? 
    AdminMailer.welcome_email(@admin).deliver_now 
    flash[:success] = "#{ @admin.full_name.pluralize } created!" 
    redirect_to root_path 
    else 
    flash.now[:notice] = "There was a problem with the form" 
    render :new 
    end 
end 
.  
. 
. 
def create_stripe_subscription 
    plan_id = params[:plan_id] 
    plan = Stripe::Plan.retrieve(plan_id) 
    token = params[:stripeToken] 
    email = params[:stripeEmail] 

    customer = Stripe::Customer.create(
    source: token, 
    email: email, 
    plan: plan 
) 

    subscription = Subscription.new 
    subscription.stripe_card_token = customer.id 

    same_customer = Stripe::Customer.retrieve(subscription.stripe_card_token) 
    same_customer.subscriptions.create(plan: params[:plan_id]) 
end 

ножка тир

customer record on stripe subscription success

+0

Hiya, нам очень сложно отладить вербальное описание вашего кода ... Пожалуйста, отредактируйте свой вопрос и добавьте * соответствующие разделы вашего кода, которые касаются полос. –

+0

Эй, спасибо за такой быстрый ответ! Я сделал изменения, чтобы более четко указать, где моя проблема. Ждем вашего ответа. – sirramongabriel

+0

Похоже, вы включаете свой секретный ключ API в свой код на стороне клиента как метатег. Это необязательно и огромный недостаток безопасности - с вашим секретным ключом API, каждый может сделать что угодно с вашей учетной записью (создавать сборы, возмещать, удалять данные и т. Д.) – Ywain

ответ

1

Я понял это по обработке Stripe::InvalidRequestError в create_stripe_subscription method как так:

subscriptions_controller.rb

def create_stripe_subscription 
. 
. 
. 
rescue Stripe::InvalidRequestError => e 
    logger.error "Stripe error: #{e.message}" 
end 

Что привело меня к noMethodError из моего приложения. Тогда ошибка возникла из этой строки в моем методе create subscriptions.

if create_stripe_subscription.valid? 

Удаление valid? позволило создать метод, чтобы закончить, отправки электронной почты и перенаправления, как это должно быть.

+0

Только что заметил, что я все еще вижу эту ошибку Stripe в своих журналах сервера. – sirramongabriel

+0

Я дважды вызывал метод create_stripe_subscription. Однажды в начале моего метода subscriptions_controller # create и прямо под ним в условном выражении. Удаление первого вызова полностью удалило ошибку из моих журналов. – sirramongabriel

Смежные вопросы