2015-05-16 3 views
0

Я использую рельсы для создания приложения, в котором использование монетами использует paypal. Я использую кнопку общей покупки, созданную на сайте Paypal. У меня есть кнопка, задающая IPN для 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 

в настоящее время выше код ошибки говоря «не могу найти пользователя с идентификатором = "

Контроллер приложения:

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

эй снова. Отправьте код модели для своего пользователя и IPN. – errata

+0

У меня нет кода для IPN. Что касается Пользователя, можете сделать. – Noob

+0

Чтобы уточнить, что я не кодировал IPN, я использую только «payful» defualt, который я настроил в профиле учетной записи моего фасилитатора. Насколько я знаю, он установил параметры, которые я не знаю, как их изменять. Что касается пользователя, добавлен код. Также спасибо за помощь. – Noob

ответ

0

IPN отправляется с сервера PayPal на ваш сервер отдельно от сеанса пользователя. Это будет его собственный сеанс, поэтому вы не получаете никаких данных сеанса. Это не разрушается. Это совсем другая сессия.

Если вы хотите передать идентификатор пользователя, чтобы он возвращался в IPN, вы можете использовать параметр «custom» в вашем коде кнопки. На самом деле это называется «custom», и вы можете отправить все, что хотите, до 256 символов.

Так что добавьте следующую строку в ваш код кнопки ...

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

Затем он вернется в СПИ, как $_POST['custom'].

Еще один способ, которым вы могли бы это порекомендовать, - это то, что вы могли бы создать свою учетную запись счета в вашей системе, которая затем имела бы соответствующую запись клиента, прежде чем отправлять пользователя в PayPal. Затем вы можете использовать параметр «счет-фактура», чтобы передать свой идентификатор счета в PayPal. Таким образом, он будет включен в подробности транзакции PayPal и просто предоставит приятную ссылку в деталях PayPal.

Еще раз, что вернулось бы в IPN как $_POST['invoice'], чтобы затем можно было попасть в вашу базу данных, чтобы вытащить любой счет-фактуру или связанные с ней детали клиента, чтобы вы могли использовать ее в своем сценарии IPN.

+0

Спасибо за ответ, это имеет большой смысл. Попробуйте сейчас – Noob

+0

Это сработало. Еще раз спасибо. – Noob

Смежные вопросы