2012-03-01 156 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