Регистрация пользователя в Devise и Paypal - PullRequest
5 голосов
/ 02 марта 2012

Я хочу интегрировать Paypal в процесс регистрации пользователей Devise. Я хочу иметь стандартную форму рельсов, основанную на devise resource, которая также имеет настраиваемые поля, принадлежащие модели пользователя.

Когда пользователь заполняет эти поля и нажимает на регистрацию, он будет перенаправлен на Paypal, когда он очищается от PayPal и возвращается на наш сайт, тогда пользовательские данные должны быть созданы.

В случае, когда пользователь заполняет форму PayPal, но не возвращается на наш сайт, мы должны вести учет пользователя, прежде чем перенаправить на Paypal.

Для этого мы можем создать флаг в пользовательской модели и использовать Paypal IPN, и когда пользовательская транзакция уведомит об этом, установите этот флаг.

Но в случае, когда пользователь перенаправляется на Paypal, но не завершает транзакцию, если пользователь возвращается к регистрации и повторной регистрации, наша модель не должна выдавать ошибку, говоря, что введенный адрес электронной почты уже существует в таблице.

Как мы можем справиться со всеми этими сценариями, есть ли доступный для работы гем или плагин?

1 Ответ

8 голосов
/ 27 июля 2012

Здесь я размещаю подробный код для выполнения всего процесса.

registration_controller.rb

module Auth
  class RegistrationController < Devise::RegistrationsController
    include Auth::RegistrationHelper

    def create
      @user = User.new params[:user]
      if @user.valid?
        redirect_to get_subscribe_url(@user, request)
      else
        super
      end
    end
  end
end

registration_helper.rb

module Auth::RegistrationHelper
  def get_subscribe_url(user, request)
    url = Rails.env == "production" ? "https://www.paypal.com/cgi-bin/webscr/?" : "https://www.sandbox.paypal.com/cgi-bin/webscr/?"
    url + {
        :ip => request.remote_ip,
        :cmd => '_s-xclick',
        :hosted_button_id => (Rails.env == "production" ? "ID_FOR_BUTTON" : "ID_FOR_BUTTON"),
        :return_url => root_url,
        :cancel_return_url => root_url,
        :notify_url => payment_notifications_create_url,
        :allow_note => true,
        :custom => Base64.encode64("#{user.email}|#{user.organization_type_id}|#{user.password}")
    }.to_query
  end
end

payment_notification_controller.rb

class PaymentNotificationsController < ApplicationController
  protect_from_forgery :except => [:create]
  layout "single_column", :only => :show

  def create
    @notification = PaymentNotification.new
    @notification.transaction_id = params[:ipn_track_id]
    @notification.params = params
    @notification.status = "paid"
    @custom = Base64.decode64(params[:custom])
    @custom = @custom.split("|")
    @user = User.new
    @user.email = @custom[0]
    @user.organization_type_id = @custom[1].to_i
    @user.password = @custom[2]
    if @user.valid?
      @user.save
      @notification.user = @user
      @notification.save
      @user.send_confirmation_instructions
    end
    render :nothing => true
  end

  def show
  end
end
...