1

Я наконец понял, как реализовать PayPal Recurring Billing, используя этот учебник. http://railscasts.com/episodes/289-paypal-recurring-billingКак отменить подписку на Paypal?

Все работает, но как же отменить подписку ....

Ниже всего кода я написал, и я также добавил некоторые комментарии/вопросы

ОШИБКА

app/controllers/subscriptions_controller.rb:27:in `show' 

Couldn't find Subscription with id=cancel_account 

Пожалуйста, помогите новому для рельсов. :)

КОНТРОЛЛЕР

class SubscriptionsController < ApplicationController 

    def new 
    plan = Plan.find(params[:plan_id]) 
    @subscription = plan.subscriptions.build 
    @subscription.user_id = current_user.id 
    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 destroy 
    @subscription = current_user.subscription 
    @previous_plan = @subscription.plan 

    if @subscription.cancel_recurring 
     flash[:success] = 'Subscription Canceled.' 
    end 
    redirect_to some_path 
    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 

end 

МОДЕЛИ

class Subscription < ActiveRecord::Base 
    attr_accessible :paypal_customer_token, :paypal_recurring_profile_token, 
        :plan_id, :user_id, :email, :paypal_payment_token 

    attr_accessor :paypal_payment_token 

    belongs_to :plan 
    belongs_to :user 

    validates_presence_of :plan_id 
    validates_presence_of :email 
    validates_presence_of :user_id 

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

class PaypalPayment 
    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 + 1.month 
    end 

    def cancel_recurring 
    response = ppr.cancel_subscription(at_date_end: true) #Needs a end period field in 
    self.current_date_end_at = Time.at(response.current_date_end) 
    self.plan_id = plan.id 
    self.status = "canceled" 
    return self.save 
    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.to_i, 
     currency: "USD" 
    ) 
    response = PayPal::Recurring.new(options).send(action) 
    raise response.errors.inspect if response.errors.present? 
    response 
    end 
end 

МНЕНИЯ

<%= form_for @subscription do |f| %> 

    <%= f.hidden_field :plan_id %> 
    <%= f.hidden_field :user_id %> 
    <%= f.hidden_field :paypal_customer_token %> 
    <%= f.hidden_field :paypal_payment_token %> 

    <% unless @subscription.payment_provided? %> 
    <div class="field"> 
    <%= radio_button_tag :pay_with, :paypal %> 
    <%= label_tag :pay_with_paypal do %> 
     <%= image_tag "paypal.png" %> 
    <% end %> 
    </div> 
    <% end %> 


*** WHAT WOULD BE THE LINK TO CANCEL THE SUBSCRIPTION *** 

    <%= link_to image_tag("https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"), 
    paypal_checkout_path(plan_id: @subscription.plan_id) %> 

    <%= link_to "Cancel Subscription", cancel_account_subscriptions_path(plan_id: 
    @subscription.plan_id) %> 



    <div id="billing_fields"> 
    <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 

    </div> 
    <% if @subscription.payment_provided? %> 
     Payment has been provided. Click "Subscribe" to complete the subscription. 
    <% end %> 
    <div class="actions"> 
     <%= f.submit "Subscribe" %> 
    </div> 
    </div> 
<% end %> 

МАРШРУТЫ

App::Application.routes.draw do 

    resources :subscriptions do 
    collection do 
     delete :cancel_account 
    end 
    end 

    get 'paypal/checkout', to: 'subscriptions#paypal_checkout' 

end 

ответ

3

Чтобы уничтожить пользователей системы PayPal подписки вы должны создать уничтожить действие в вашей модели подписки.

Subscription_controller.rb

def destroy 
    @subscription = current_user.subscription 
    @previous_plan = @subscription.plan 

    if @subscription.cancel_recurring 
     flash[:success] = 'Subscription Canceled.' 
    end 
    redirect_to some_path 
    end 

В модели получить текущего пользователя и отменить подписку. Если пользователь подписывается ежемесячно, но отменяется в течение 2 дней из 30 дней, их подписка на подписку должна быть действительной до периода at_end_date (только хэдз-ап).

def cancel_recurring 
    response = ppr.cancel_subscription(at_date_end: true) #Needs a end period field in 
    self.current_date_end_at = Time.at(response.current_date_end) 
    self.plan_id = plan.id 
    self.status = "canceled" 
    return self.save 
    end 

routes.rb

resources :subscriptions do 
collection do 
    delete :cancel_account 
end 
end 

По вашему мнению вы бы перебирать планы, как так

<% @plans.each do |plan| %> 
    <%= link_to "Cancel Account", cancel_account_subscriptions_path(@subscription, plan_id: plan.id), method: :delete %> 
<% end %> 
+0

Как бы я назвать это с точки зрения .... Я попытался с помощью <% = link_to «Отменить подписку», cancel_account_subscriptions_path (plan_id: @ subscription.plan_id)%>, но получите сообщение об ошибке. Я обновил код выше –

+0

Я обновил свой код выше, дайте мне знать, если он сработает для вас. – coletrain

+0

Я получаю эту ошибку. Действие «cancel_account» не найдено для SubscriptionsController .... –

Смежные вопросы