ruby-on-rails - 使用 Devise 和 Paypal 进行用户注册

标签 ruby-on-rails ruby-on-rails-3 devise paypal paypal-sandbox

我想在 Devise 用户注册过程中集成 Paypal。我想要的是拥有一个基于 devise 资源 的标准 Rails 表单,该表单还具有属于用户模型的自定义字段。

当用户填写这些字段并点击注册时,它将被重定向到 Paypal,当他从 paypal 清除并返回到我们的网站时,必须创建用户数据。

对于用户填写 paypal 表单但没有返回我们网站的情况,我们必须在重定向到 Paypal 之前保留用户记录。

为此我们可以在用户模型中创建一个标志并使用 Paypal IPN 并在用户交易通知时设置该标志。

但在用户被重定向到 Paypal 但未完成交易的情况下,如果用户返回注册并再次注册,我们的模型不应抛出错误,指出输入的电子邮件已存在于表中。

我们如何处理所有这些情况,是否有可用的 gem 或插件?

最佳答案

这里我发布了执行整个过程的详细代码。

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

关于ruby-on-rails - 使用 Devise 和 Paypal 进行用户注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525589/

相关文章:

ruby-on-rails - 检测 Ruby 中的重叠范围

mysql - 如何从 schema.rb 文件生成 SQL Server 数据库?

ruby-on-rails - 使用 Faker gem 使用 Ruby on Rails 为 Google Maps 生成 VALID 地址

ruby-on-rails - 跨子域的 Rails 4 session

javascript - Rails 什么时候编译 CoffeeScript?

ruby-on-rails-3 - 处理请求 : invalid byte sequence in UTF-8 时出现意外错误

jquery - nested_form gem 添加有效但删除失败...为什么?

ruby-on-rails - 设计:Recaptcha 不起作用

ruby-on-rails - 为什么 Devise + Omniauth 回调没有命中正确的 Controller ?

ruby-on-rails - 设计 - 将 OAuth 与现有帐户合并