2012-10-10 64 views
2

我實現了貝寶通過以下Rails的強制類型轉換EP289復發。 http://railscasts.com/episodes/289-paypal-recurring-billing?view=asciicast貝寶經常性的寶石和試用期

它工作正常的正常過程,但是當我試圖執行試用期,我得到了一些問題。它會在第一次結算時收取試用金額和重複計費金額的總和。 (我只想收取試用金額)

我通過互聯網進行了檢查,但我無法弄清楚如何做到目前爲止。 我缺少關於正確地實現這一點?

以下是代碼。

paypal_payment.rb

class PaypalPayment 
    def initialize(subscription) 
    @subscription = subscription 
    @price = Price.find_by_currency_code_and_plan_id("JPY", @subscription.plan.id) 
    end 

    def checkout_details 
    PayPal::Recurring.new(token: @subscription.paypal_payment_token).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.now + 1.month 
    end 

private 

    def process(action, options = {}) 
    options = options.reverse_merge(
     token: @subscription.paypal_payment_token, 
     payer_id: @subscription.paypal_customer_token, 
     item_name: @subscription.plan.name, 
     item_amount: @price.amount.to_i, 
     description: "Something" 
     amount: @price.amount.to_i, 
     outstanding: :next_billing, 
     trial_amount: @price.initial_amount.to_i, 
     trial_period: :monthly, 
     trial_frequency: 1, 
     trial_length: 1, 
     currency: @price.currency_code, 
     locale: "ja_JP" 
    ) 
    response = PayPal::Recurring.new(options).send(action) 
    raise response.errors.inspect if response.errors.present? 
    response 
    end 
end 

subscription.rb

class Subscription < ActiveRecord::Base 
    belongs_to :plan 
    belongs_to :student 
    has_many :transactions, :class_name => "SubscriptionTransaction" 
    validates_presence_of :plan_id 
    validates_presence_of :student_id 
    attr_accessor :paypal_payment_token 
    attr_accessible :paypal_customer_token, :paypal_recurring_profile_token, :plan_id, :student_id, :paypal_payment_token 

    def save_with_payment 
    if valid? 
     if payment_provided? 
     save_with_paypal_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 payment_provided? 
    paypal_payment_token.present? 
    end 
end 

subscriptions_controller.rb

require 'time' 
class SubscriptionsController < ApplicationController 
    before_filter :authenticate_user!, :is_student? 

    def index 
    @title = I18n.t "subscriptions.index.title" 
    @student = Student.find_by_id(current_user.profile_id) 
    if @student.is_trial == true 
     redirect_to 'new' 
    end 
    @subscription = @student.subscription 
    @plan = @subscription.plan 
    Time.zone = "Tokyo" 
    @date = Time.now.in_time_zone.to_date 
    @total_lesson_times = Lesson.find_all_by_student_id(@student.id).size 
    @lastm_lesson_times = Lesson.where("student_id = :student_id AND lesson_day >= :start_date AND lesson_day <= :end_date", 
     {:student_id => @student.id, :start_date => @date.beginning_of_month()-1.month, :end_date => @date.end_of_month()-1.month}).size 

    @thism_lesson_times = Lesson.where("student_id = :student_id AND lesson_day >= :start_date AND lesson_day <= :end_date", 
     {:student_id => @student.id, :start_date => @date.beginning_of_month(), :end_date => @date.end_of_month()}).size 
    end 

    def new 
    @title = I18n.t "subscriptions.new.title" 
    @plans = Plan.all 
    @student = Student.find_by_id(current_user.profile_id) 
    if @student.is_trial == false && @student.is_active == false 
     redirect_to 'index' 
    end 
    @subscription = Subscription.new 
    @date = Time.now.in_time_zone.to_date 
    @total_lesson_times = Lesson.find_all_by_student_id(@student.id).size 
    @lastm_lesson_times = Lesson.where("student_id = :student_id AND lesson_day >= :start_date AND lesson_day <= :end_date", 
     {:student_id => @student.id, :start_date => @date.beginning_of_month()-1.month, :end_date => @date.end_of_month()-1.month}).size 

    @thism_lesson_times = Lesson.where("student_id = :student_id AND lesson_day >= :start_date AND lesson_day <= :end_date", 
     {:student_id => @student.id, :start_date => @date.beginning_of_month(), :end_date => @date.end_of_month()}).size 
    end 

    def modify 

    end 

    def cancel 
    student = Student.find(current_user.profile_id) 
    @subscription = student.subscription 
    ppr = PayPal::Recurring.new(:profile_id => @subscription.paypal_recurring_profile_token) 
    response = ppr.suspend 
    if response.success? 
     student.update_attributes(:is_active => false) 
     flash[:notice] = I18n.t "subscriptions.cancel.notice_flash" 
     redirect_to root_path 
    end 
    end 

    def reactivate 
    student = Student.find_by_id(current_user.profile_id) 
    @subscription = student.subscription 
    ppr = PayPal::Recurring.new(:profile_id => @subscription.paypal_recurring_profile_token) 
    response = ppr.reactivate 
    if response.success? 
     student.update_attributes(:is_active => true) 
     flash[:success] = I18n.t "subscriptions.reactivate.success_flash" 
     redirect_to root_path 
    end 
    end 

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

    def confirm 
    @plan = Plan.find(params[:plan_id]) 
    @student = Student.find(current_user.profile_id) 
    @subscription = @plan.subscriptions.build 
    if params[:PayerID] 
     @subscription.student_id = @student.id 
     @subscription.paypal_customer_token = params[:PayerID] 
     @subscription.paypal_payment_token = params[:token] 
    end 
    end 

    def complete 
    student = Student.find(current_user.profile_id) 
    Time.zone = student.user.time_zone 
    current_time = Time.now.in_time_zone 
    current_date = current_time.to_date 
    @subscription = Subscription.new(
     :plan_id => params[:subscription][:plan_id], 
     :student_id => params[:subscription][:student_id], 
     :paypal_customer_token => params[:subscription][:paypal_customer_token], 
     :paypal_payment_token => params[:subscription][:paypal_payment_token] 
    ) 
    if @subscription.save_with_payment 
     student.update_attributes(:is_active => true, :is_trial => false, :expiration_date => current_date + 1.month - 1.day) 
     redirect_to root_path, :notice => (I18n.t "subscriptions.complete.success_flash") 
    else 
     flash[:notice] = I18n.t "error_flash" 
     redirect_to new_subscription_path 
    end 
    end 

    private 
    def is_student? 
    if current_user.profile_type != "Student" 
     flash[:notice] = I18n.t "is_student_notice_flash" 
     redirect_to root_path 
    end 
    end 
end 
+0

你有沒有嘗試過,如果在你的選項中設置start_at有所作爲? – doesterr

+0

我試過start_at = Time.now,得到了那個結果,現在嘗試start_at = Time.now + 1.month。看來以後1個月甚至支付試用期的所有事務將啓動。 –

+0

我自己解決了這個問題,謝謝你的評論。 –

回答

0

(回答一個問題的編輯,轉換爲一個社區維基答案。見What is the appropriate action when the answer to a question is added to the question itself?

的OP寫道:

我解決了自己的問題。問題是paypal_payment.rb

def make_recurring 
    process :request_payment 
    process :create_recurring_profile, period: :monthly, frequency: 1, start_at: Time.now + 1.month 
    end 
因爲 process :request_payment部分

內。它向用戶旁邊收取定期付款的費用。