ruby-on-rails – Paypal Recurring Gem – 暂停付款
发布时间:2020-12-17 02:40:25 所属栏目:百科 来源:网络整理
导读:我正在寻找为paypal经常性宝石设置付款暂停(跟随铁轨演员).我不确定是否需要设置IPN,因为在gem的文档中没有提到它.我目前的代码不采取任何行动. 我在模型中定义了取消重复,但我不知道如何完成代码,因为我很难理解这一切是如何工作的.其他人已经问过这个问题,
我正在寻找为paypal经常性宝石设置付款暂停(跟随铁轨演员).我不确定是否需要设置IPN,因为在gem的文档中没有提到它.我目前的代码不采取任何行动.
我在模型中定义了取消重复,但我不知道如何完成代码,因为我很难理解这一切是如何工作的.其他人已经问过这个问题,但没有答案. 如果有人有时间资产我,那就太棒了! 问题是如何暂停/取消用户定期付款. Paypal_payment.rb: 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 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 订阅控制器: 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) @customer.update_subscription(:plan => "1",:prorate => true) current_user.save! flash.alert = 'Your subscription has been updated!' redirect_to root_url end def cancelsubscription @user = current_user @customer = Stripe::Customer.retrieve(@user.subscription.stripe_customer_token) @customer.cancel_subscription() 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 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 订阅模型: 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 self.status = "canceled" save end end 路线: get "subscriptions/cancelsubscription" get "subscriptions/updatesubscription" get "subscriptions/changecard" get "subscriptions/suspend" get "subscriptions/updatebilling" resources :charges resources :subscriptions resources :plans get 'paypal/checkout',to: 'subscriptions#paypal_checkout' 视图: <%= link_to "Suspend paypal",subscriptions_suspend_path,:data => { :confirm => "Are you sure?" } %> 解决方法
PaypalPayment是Paypal-recurring gem的一种包装.因此,本类中的所有方法都只是准备并委托给PayPal :: Recurring,这就是为什么所有方法都只调用实例化并传递操作的’process’方法.
因此,对于暂停/取消,您只需为每个操作添加一个方法.正如文档所述,您需要执行此操作以取消 ppr = PayPal::Recurring.new(:profile_id => "I-VCEL6TRG35CU") ppr.suspend 所以对于你的PaypalPayment类,它看起来像这样: def suspend process :suspend,:profile_id => @subscription.paypal_recurring_profile_token end 所以你的模型订阅.rb def suspend_paypal paypal.suspend self.status = "canceled" save end 和控制器susbcription_controller.rb def suspend current_user.suspend_paypal end 关于IPN,如果用户通过您的网站暂停,我认为没有必要,但由于用户可能直接通过PayPal取消它,您必须处理此案例,以便用户不要停止付费,而是保持有效订阅. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |