如何将用户与IPN关联

时间:2015-05-16 19:56:13

标签: ruby-on-rails paypal devise paypal-ipn

我正在使用rails来创建一个应用程序,其中使用可以通过硬币使用paypal。我正在使用Paypal网站上创建的通用立即购买按钮。我已将按钮设置为在我的网站上为URL提供IPN。 以前我遇到了身份验证问题,但使用下面的代码我已经解决了。现在的问题是,当IPN通知控制器但会话被销毁时,我无法使用硬币。所以我的问题是如何检索/保留会话或用户,以便我可以将硬币添加到正确的帐户?

用户模型(相关部分):

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable

# Gets the amount of coins the user currently has.
# @return The amount of coins the user has.
def get_coins
self.coins
end

# Adds an amount of coins to the user and saves to the database.
# @param amount The amount of coins to add to the user.
def add_coins(amount)
full_amount = amount + self.coins
self.coins = full_amount
self.save
end

控制IPN指向:

class PaymentNotificationsController < ApplicationController
before_action :authenticate_user!, :except => [:create]
# POST /payment_notifications
# POST /payment_notifications.json

def create
puts "made it here"
#PaymentNotification.create!(:params => params)
user =User.find(session[:user_id])
user.coins += 100
user.save!
render :nothing => true
end
end

目前上面的代码有一个错误,上面写着“无法找到id =”的用户

应用程序控制器:

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user!
skip_before_filter :verify_authenticity_token
end

1 个答案:

答案 0 :(得分:0)

IPN从PayPal服务器发送到与用户会话分开的服务器。这将是它自己的会话,这就是为什么你没有得到任何会话数据的原因。它没有被摧毁。这只是一个完全不同的会议。

如果您想传递用户ID以便它在IPN中返回,您可以使用&#34; custom&#34;按钮代码中的参数。它实际上被称为&#34; custom&#34;你可以发送任何你想要的东西,最多256个字符。

所以将以下内容添加到按钮代码中......

<input type="hidden" name="custom" value="{user_id_value}" />

然后它将以$_POST['custom']的形式返回IPN。

您可以处理它的另一种方式(这是我建议的)是您可以在系统中创建发票记录,然后在将用户发送到PayPal之前会有相关的客户记录。然后你可以使用&#34;发票&#34;将您的发票ID传递给PayPal的参数。这样,它就会包含在PayPal交易详情中,并且只是在PayPal详细信息中提供了一个很好的参考。

再一次,它会以$_POST['invoice']的形式返回到IPN,这样您就可以点击数据库来提取所需的任何发票或相关客户详细信息,以便在IPN脚本中使用它。