Как правильно обновлять кредитные карты / планы с помощью платежей Payola?Рельсы 5 - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь обновить информацию о кредитной карте пользователя и планы с помощью платежного камня Payola.Чего я не знаю, так это если мой подход правильный.Я передаю параметры [: stripeToken] в метод вызова UpdateCard, а затем перенаправляю пользователя обратно на страницу редактирования.Я пока не вижу подходящего примера для этого, и мне просто нужно убедиться, что он сохранит изменения в Stripe и вернется к модели пользовательской подписки.Как правильно изменить кредитную карту и план пользователя ??

Я написал метод user_change_credit_card, который находит owner_id, а затем пытается сохранить stripeToken в метод UpdateCard.call (), когда форма POST включена.метод блок.Я также создал метод user_change_plan, который ищет план current_user и обновляет запись перед передачей данных в метод Payola :: ChangeSubscriptionPlan.call ()

rout.rb

devise_scope :user do
    post 'user_change_plan', to: 'users/registrations#user_change_plan'
    post 'user_change_credit_card', to: 'users/registrations#user_change_credit_card'
    authenticated do
      root to: 'dashboard#index', as: 'authenticated_user_root'
    end
    unauthenticated do
      root to: 'home#index', as: 'unauthenticated_user_root'
  end
end

users \ registrations_controller.rb

 def user_change_plan
    plan = Plan.find_by!(id: params[:user][:plan_id].to_i)
    unless plan == current_user.plan
      role = User.roles[plan.stripe_id]
      if current_user.update_attributes!(plan: plan, role: role)
        subscription = Payola::Subscription.find_by!(owner_id: current_user.id)
        Payola::ChangeSubscriptionPlan.call(subscription, plan)
        redirect_to edit_user_registration_path, notice: 'Plan changed.'
      else
        flash[:alert] = 'Unable to change plan.'
        build_resource
        render :edit
      end
    end
  end

users \ registrations_controller.rb

def user_change_credit_card
    @subscription = Payola::Subscription.find_by!(owner_id: current_user.id)
    if @subscription.save
      Payola::UpdateCard.call(@subscription, params[:stripeToken])
      redirect_to edit_user_registration_path, notice: 'Your Credit Card Was Successfully Updated.'
    else
      build_resource
      redirect_to edit_user_registration_path, notice: "There was an error, please check for mistakes with your card information"
    end
  end

users \registrations \ edit.html.erb

 <%= form_for(resource, :as => resource_name, :url => user_change_plan_path, :html => {:method => :post,
                                                                                        :class => 'payola-onestep-subscription-form',
                                                                                        'data-payola-base-path' => payola_path,
                                                                                        'data-payola-plan-type' => resource.plan.plan_class,
                                                                                        'data-payola-plan-id' => resource.plan.id}) do |f| %>

    <div class="form-group">
      <div class="col-md-8">
        <span id="error_explanation" class="payola-payment-error"></span>
      </div>
    </div>

    <div class="form-group">
      <div class="col-md-6">
        <strong><%= f.label 'Subscription plan' %></strong>
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-9">
        <%= f.collection_select(:plan_id, Plan.user_plan, :id, :name, {}, {:class => 'form-control'}) %>
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-6">
        <%= f.submit 'Change Plan', :class => 'bttn-simple bttn-md bttn-warning', data: {disable_with: false} %>
      </div>
    </div>
  <% end %>

  <%= form_for resource, as: resource_name, subscription: @subscription, :url => user_change_credit_card_path, :html => {:method => :post,
                                                                                               :class => 'payola-onestep-subscription-form',
                                                                                               'data-payola-base-path' => payola_path,
                                                                                               'data-payola-plan-type' => resource.plan.plan_class,
                                                                                               'data-payola-plan-id' => resource.plan.id} do |f| %>

    <div class="form-group">
      <div class="col-md-8">
        <span id="error_explanation" class="payola-payment-error"></span>
      </div>
    </div>

    <div class="form-group">
      <div class="col-md-7">
        <strong><%= f.label 'Credit Card' %></strong>
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-6">
        <label><i class="far fa-credit-card"></i> Credit Card Number</label>
      </div>
      <div class="col-md-7">
        <div class="field card" style="border-radius: 0.25rem 0.25rem 0 0;">
          <%= text_field :card_number, nil, name: nil, class: 'form-control', data: {stripe: 'number'}, maxlength: 20 %>
          <span class="card_icon"></span>
          <p class="status" style="display: block;">
            <span class="status_icon"></span>
            <span class="status_message"></span>
          </p>
        </div>
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-4">
        <label>CVC</label>
        <%= text_field :card_code, nil, name: nil, class: 'form-control', data: {stripe: 'cvc'}, placeholder: '000', maxlength: 3 %>
      </div>
      <br/>
      <div class="form-group col-md-4">
        <label>Card Expiration</label>
        <%= select_month nil, {use_two_digit_numbers: true}, {name: nil, data: {stripe: 'exp_month'}, class: 'form-control'} %>
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year + 15}, {name: nil, data: {stripe: 'exp_year'}, class: 'form-control'} %>
      </div>
    </div>

    <div class="form-group">
      <div class="col-md-7">
        <%= f.submit 'Update Credit Card', :class => 'bttn-simple bttn-md bttn-success', data: {disable_with: false} %>
      </div>
    </div>
  <% end %>

Ожидаемые результаты : Форма user_change_plan / user_change_credit_card будет сохранена, и запись будет обновляться как для модели пользователя, так и для полосы удаленно.

Фактические результаты : невозможно определить, сохранились ли изменения в Stripe

...