Интеграция Paypal Express ActiveMerchant - PullRequest
2 голосов
/ 31 декабря 2010

Я слежу за железной дорогой Райана Бейтса 146 , и это действительно полезно.Тем не менее, я пытаюсь удалить объект корзины из процесса, и просто обработать заказ индивидуально.У меня проблема в том, как установить сумму, которая используется дважды: один раз для настройки покупки, а затем один раз для ее фактического исполнения.Это то, к чему я прибегал, но оно выставляет сумму в return_url, что я считаю, вероятно, плохой практикой:

class OrdersController < ApplicationController
  def express
    response = EXPRESS_GATEWAY.setup_purchase(params[:amount],
      :ip                => request.remote_ip,
      :return_url        => new_order_url(:amount=>params[:amount]),
      :cancel_return_url => root_url
    )
    redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token)
  end

  def new
    @order = Order.new(:express_token => params[:token], :price_in_cents=>params[:amount])
  end

Затем в представлении я добавляю скрытое поле с суммой, чтобыкогда заказ создан, в него встроена сумма (я добавил поле price_in_cents в модель заказа).Это работает хорошо, но выставление суммы в качестве параметра может быть немного сомнительным.Наконец, код покупки выглядит следующим образом:

 def purchase
    response = process_purchase
    transactions.create!(:action => "purchase", :amount => price_in_cents, :response => response)
    cart.update_attribute(:purchased_at, Time.now) if response.success?
    response.success?
  end

Короче, как я могу это сделать, не передавая сумму в параметрах?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 января 2011

Спасибо за ваш вклад, ребята. В итоге я сохранил сумму в сеансе пользователя, например, session[:amount], а затем установил ее на nil, как только они закончат процесс. Таким образом, он скрыт от пользователя и избавляет меня от необходимости создавать новые объекты или шифровать.

0 голосов
/ 10 января 2011

Отправка суммы в URL - очень плохая практика - она ​​позволяет изменить цену и купить то, что вы продаете, за сумму, указанную в URL.

Я вижу два пути решения этой проблемы:
1. Вы можете зашифровать передаваемые вами параметры и расшифровать их по URL. Посмотрите, как зашифровать здесь
2. Вы можете создать новую сущность, которая будет содержать цену покупки (или, если вы продаете конкретный товар (поскольку вы не используете корзину) - вы можете передать идентификатор этого товара и запросить его цену, нужно это). Что-то вроде этого: </p> <pre><code>class OrdersController < ApplicationController def express @product = Product.find(params(:product_id)); response = EXPRESS_GATEWAY.setup_purchase(product.price_in_cents, :ip => request.remote_ip, :return_url => new_order_url(product.price_in_cents), :cancel_return_url => root_url ) redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token) end def new @product = Product.find(params(:product_id)); @order = Order.new(:express_token => params[:token], :price_in_cents=> @product.price_in_cents) end

...