我想在 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/