Nano Hash - криптовалюты, майнинг, программирование

Почему мой пользователь не вошел в систему при возврате платежа через Paypal?

После того, как пользователь зарегистрировал учетную запись, он автоматически входит в систему.

Затем у них есть возможность «Активировать свою учетную запись», чтобы разблокировать функции приложения. Активация учетной записи приводит их к шлюзу Paypal. После успешного завершения платежа они перенаправляются обратно на страницу счета. Однако на странице счета-фактуры нет текущего сеанса пользователя. Любые идеи о том, что я делаю неправильно? код ниже

Я использую devise для управления аутентификацией.

Вот модель пользователя

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

  validates :first_name, :last_name, :email, :password, presence: true

  serialize :notification_params, Hash
  def paypal_url(return_path)
    values = {
        business: "[email protected]",
        cmd: "_xclick",
        upload: 1,
        return: "#{Rails.application.secrets.app_host}#{return_path}",
        invoice: id,
        amount: 20,
        item_name: "Online Store",
        item_number: 1,
        quantity: '1',
        notify_url: "#{Rails.application.secrets.app_host}/hook"
    }
    "#{Rails.application.secrets.paypal_host}/cgi-bin/webscr?" + values.to_query
  end

end

Вот мои маршруты:

Rails.application.routes.draw do
  devise_for :users #, :controllers => {:registrations => 'memberships'}
  root 'pages#dashboard'
  get 'home' => 'pages#dashboard'

  devise_scope :user do 
    post 'invoice' => "memberships#show"
    post 'hook' => "memberships#hook"
  end

Вот контроллер, управляющий платежом/вебхуком

class MembershipsController < ApplicationController

  def show
    @user = current_user

  end

  protect_from_forgery except: [:hook]
  def hook
    params.permit! # Permit all Paypal input params
    status = params[:payment_status]
    if status == "Completed"
      @user = User.find params[:invoice]
      @user.update_attributes notification_params: params, status: status, transaction_id: params[:txn_id], purchased_at: Time.now
    end
    render nothing: true
  end
end

Вот страница показа сообщения о счете, имейте в виду, что она была упрощена для тестирования:

%section#course-content
  %section#ruby
    %section.detailed-syllabus
      .wrapper-inside
        %h3.title Course invoice
      .columns.clearfix
        .left{style: "padding-left:100px;"}
          %p#notice= notice
          %p
            - if user_signed_in?
              %strong Email:
              = current_user.first_name
            - else
              %strong Invalid User Session

Дайте мне знать, если есть что-то еще, что вам нужно увидеть. Спасибо


Ответы:


1

После некоторых исследований я нашел ответ Стефана Вробеля на форуме Google.

Хорошо, я понял это наконец. Для rails 3.0.4 и выше автоматическая защита CSRF в формах сделает сеанс недействительным, если будет выполнено какое-либо действие, кроме GET, и не будет предоставлен токен аутентификации. Поскольку нет возможности заставить Paypal отправить токен подлинности, есть два способа обойти это:

  1. Разрешите Paypal сохранить поведение по умолчанию и отправлять сообщения обратно на ваш сайт. В этом случае вы можете отключить защиту от подделки, используя protect_from_forgery :except =› [:controller_action_name], хотя это может считаться потенциальной дырой в безопасности, если вы принимаете информацию о передаче платежных данных Paypal, не проверяя ее каким-либо образом, поскольку кто-то может просто отправить поддельные данные POST и завершить сделка.

  2. Заставьте Paypal отправить пользователя обратно через GET, установив для стандартного параметра веб-платежей rm значение 1, что принудительно GET (rm означает метод возврата и должен использоваться вместе с параметром возврата для указания URL-адреса). См. здесь: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables#id08A6HI0709B

Удачи, Надеюсь это поможет! Потребовалось слишком много времени, чтобы понять это...

06.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..