gpt4 book ai didi

ruby-on-rails - Paypal 经常性 gem 和试用期

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:31 24 4
gpt4 key购买 nike

我通过遵循 Rails Casts EP289 实现了 paypal 循环。 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

订阅.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

最佳答案

(在问题编辑中回答。转换为社区维基答案。参见 What is the appropriate action when the answer to a question is added to the question itself?)

OP 写道:

I solved the problem myself. The problem was inside the paypal_payment.rb

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

because of the process :request_payment part. It charges the amount to the user beside of the charge of recurring payment.

关于ruby-on-rails - Paypal 经常性 gem 和试用期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com