微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想在Devise用户注册过程中集成Paypal.我想要的是拥有一个基于设计资源的标准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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐