使用 Devise 和 Paypal 进行用户注册

Posted

技术标签:

【中文标题】使用 Devise 和 Paypal 进行用户注册【英文标题】:User Registration with Devise and Paypal 【发布时间】:2012-03-20 12:01:52 【问题描述】:

我想将Paypal 集成到Devise 用户注册过程中。我想要的是有一个基于devise resource 的标准rails 表单,它还具有属于用户模型的自定义字段。

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

请注意,您的示例将用户的密码 base64 编码(即基本上是明文)发送到 Paypal。我建议将待处理的注册数据存储在您身边,并仅通过 Paypal 传递对相应记录的引用。或者将密码完全留在客户端的浏览器中,并将其存储为加密的 cookie 或 sessionStorage。

以上是关于使用 Devise 和 Paypal 进行用户注册的主要内容,如果未能解决你的问题,请参考以下文章

从 Paypal 获取 first_name(和其他信息)并使用 paypal-recurring gem 创建 Rails Devise 帐户

使用 Devise 从 Rails 上的 json api 进行身份验证

使用 Rails 和 Devise 进行功能测试。在我的固定装置里放啥?

设计 - 如何禁止某些用户登录?

Devise for Rails中的唯一用户名

从 JSON 在 Devise 中创建用户