2012-03-01 107 views
4

我想集成PaypalDevise用户注册过程。我想要的是基于一个devise resource的标准导轨形式,也有一些属于用户模型的自定义字段。用户注册与设计和贝宝

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

对于一种情况,当用户填写贝宝但不回到我们的网站上时,我们必须在重定向到贝宝之前保留用户的记录。

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

但在用户重定向到PayPal但未完成交易的情况下,我希望如果他再次注册并注册,我们的模型不会说表中已存在该电子邮件。

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

回答

7

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

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