2014-03-26 37 views
2

我有這種設置爲條紋,但我似乎無法弄清楚貝寶重複使用的寶石。我正在尋求允許用戶切換他們的付款計劃。如果用戶訂閱了1個月的訂閱(plan_id 1),他們應該能夠升級到年訂閱(plan_id 12)。使用PayPal重複使用的寶石升級訂閱計劃

任何幫助,將不勝感激!

訂閱控制器

def new 
    plan = Plan.find(params[:plan_id]) 
    @subscription = plan.subscriptions.build 
    if params[:PayerID] 
     @subscription.paypal_customer_token = params[:PayerID] 
     @subscription.paypal_payment_token = params[:token] 
     @subscription.email = @subscription.paypal.checkout_details.email 
    end 
    end 

    def create 
    @subscription = Subscription.new(params[:subscription]) 
    if @subscription.save_with_payment 
     redirect_to @subscription, :notice => "Thank you for subscribing!" 
    else 
     render :new 
    end 
    end 

    def show 
    @subscription = Subscription.find(params[:id]) 
    end 

    def paypal_checkout 
    plan = Plan.find(params[:plan_id]) 
    subscription = plan.subscriptions.build 
    redirect_to subscription.paypal.checkout_url(
     return_url: new_subscription_url(:plan_id => plan.id), 
     cancel_url: root_url 
    ) 
    end 

    def updatesubscription 
     @user = current_user 
     @customer = Stripe::Customer.retrieve(@user.subscription.stripe_customer_token) 
     if @user.subscription.plan_id == 12 
     @customer.update_subscription(:plan => "1", :prorate => true) 
     current_user.subscription.update_attributes(:plan_id => 1) 
     flash.alert = 'Your subscription has been changed to monthly!' 
     redirect_to root_url 
    elsif @user.subscription.plan_id == 1 
     @customer.update_subscription(:plan => "12", :prorate => true) 
     current_user.subscription.update_attributes(:plan_id => 12) 
    current_user.save! 
     flash.alert = 'Your subscription has been changed to annually!' 
     redirect_to root_url 
    end 
    end 

    def cancelsubscription 
     @user = current_user 
     @customer = Stripe::Customer.retrieve(@user.subscription.stripe_customer_token) 
     @customer.cancel_subscription() 
     current_user.subscription.update_attributes(:cancelled => 1) 
     current_user.save! 
     flash.alert = 'Your subscription has been cancelled successfully!' 
     redirect_to root_url 
     end 

     def showcard 
     @user = current_user 
     Stripe::Customer.retrieve(@user.subscription.stripe_customer_token).cards.all() 
     end 

     def changecard 
      @user = current_user  
      @customer = Stripe::Customer.retrieve(@user.subscription.stripe_customer_token) 

      card = @customer.cards.create({ 
       :card => @user.subscription.stripe_customer_token 
      }) 

      @customer.default_card = card 
      @customer.save 
      end 

      def suspend 
      @user = current_user 
      @user.subscription.suspend_paypal 
      current_user.subscription.update_attributes(:cancelled => 1) 
       flash.alert = 'Billing has been suspended!' 
       redirect_to root_url 
      end 

      def reactivate 
      @user = current_user 
      @user.subscription.reactivate_paypal 
      current_user.subscription.update_attributes(:cancelled => nil) 
       flash.alert = 'Billing has been activated!' 
       redirect_to root_url 
      end 

     def updatebilling 
      @user = current_user 
      customer = Stripe::Customer.retrieve(@user.subscription.stripe_customer_token) 
      customer.cards.retrieve("#{@user.subscription.stripe_card_id}").delete() 
      customer.cards.create({ 
        card: { 
        number: params[:user][:scardnumber], 
        exp_month: params[:user][:sexp_month], 
        exp_year: params[:user][:sexp_year], 
        cvc: params[:user][:scvc], 
        name: params[:user][:sname], 
        address_line1: params[:user][:sbilling_address1], 
        address_line2: params[:user][:sbilling_address2], 
        address_city: params[:user][:saddress_city], 
        address_zip: params[:user][:saddress_zip], 
        address_state: params[:user][:saddress_state], 
        address_country: params[:user][:saddress_country] 
        } 
       }) 
       if customer.save! 
        @user.stripe_card_id = customer.active_card.id 
        @user.save! 
        flash.alert = 'Billing information updated successfully!' 
        redirect_to root_url 
       else 
        flash.alert = 'Stripe error' 
        redirect_to root_url 
       end 
       end 
end 

貝寶付款模式:

def initialize(subscription) 
     @subscription = subscription 
    end 

    def checkout_details 
     process :checkout_details 
    end 

    def checkout_url(options) 
     process(:checkout, options).checkout_url 
    end 

    def make_recurring 
     process :request_payment 
     process :create_recurring_profile, period: :monthly, frequency: 1, start_at: Time.zone.now 
    end 

    def suspend 
     process :suspend, :profile_id => @subscription.paypal_recurring_profile_token 
    end 

    def reactivate 
     process :reactivate, :profile_id => @subscription.paypal_recurring_profile_token 
    end 

    private 

    def process(action, options = {}) 
     options = options.reverse_merge(
     token: @subscription.paypal_payment_token, 
     payer_id: @subscription.paypal_customer_token, 
     description: @subscription.plan.name, 
     amount: @subscription.plan.price, 
     currency: "USD" 
    ) 
     response = PayPal::Recurring.new(options).send(action) 
     raise response.errors.inspect if response.errors.present? 
     response 
    end 
    end 

訂閱模式:

belongs_to :plan 
    belongs_to :subscription 
    belongs_to :user 

    validates_presence_of :plan_id 
    validates_presence_of :email 

    attr_accessor :stripe_card_token, :paypal_payment_token 

    def save_with_payment 
    if valid? 
     if paypal_payment_token.present? 
     save_with_paypal_payment 
     else 
     save_with_stripe_payment 
     end 
    end 
    end 

    def paypal 
    PaypalPayment.new(self) 
    end 

    def save_with_paypal_payment 
    response = paypal.make_recurring 
    self.paypal_recurring_profile_token = response.profile_id 
    save! 
    end 

    def save_with_stripe_payment 
    customer = Stripe::Customer.create(description: email, plan: plan_id, card: stripe_card_token) 
    self.stripe_customer_token = customer.id 
    save! 
    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 

    def payment_provided? 
    stripe_card_token.present? || paypal_payment_token.present? 
    end 

    def suspend_paypal 
    paypal.suspend 
    save 
    end 


    def reactivate_paypal 
    paypal.reactivate 
    save 
    end 
end 

回答

1

遺憾的是無法更新變化訂閱期限爲PayPal。此訂閱將不得不取消,並建立一個新的訂閱。

API ReferenceUpdateRecurringPaymentsProfile

您將需要計算按比例分配的差異,並建立新的配置文件時,向他們收取的INITAMT,然後設置新AMT的開始日期是後,他們的任期最多可收集。

編輯:這是假設您正在使用this gem。因爲我無法找到它自動嘗試爲您自動執行此操作的任何地方。

+0

謝謝。這是不幸的。我會嘗試設置分攤比例。謝謝! – xps15z

+0

@ xps15z你有沒有找到任何答案? –