Настройка страницы обзора Paypal Express с помощью ActiveMerchant - PullRequest
6 голосов
/ 10 октября 2010

Я использую ActiveMerchant, чтобы предоставить моему приложению rails доступ к экспресс-оплате Paypal. Я хотел бы включить детали заказа на странице обзора, как описано здесь: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECCustomizing

Можно ли это сделать?

В настоящее время мой код контроллера выглядит следующим образом:

def paypal
  #currently, options is unused, I'm not sure where to send this info
  options = { 
              :L_NAME0=>"Tickets", 
              :L_QTY0=>@payment.quantity, 
              :L_DESC0=>"Tickets for #{@payment.event_name}",
              :L_AMT0=>@payment.unit_price
            }

  #the actual code that gets used
  setup_response = gateway.setup_purchase(@payment.amount,
    :ip=> request.remote_ip,
    :return_url=> url_for(:action=>:confirm, :id=>@payment.id, :only_path=>false),
    :cancel_return_url => url_for(:action=>:show, :id=>@payment.id, :only_path=>false)
  )
  redirect_to gateway.redirect_url_for(setup_response.token)
end

Если то, что я пытаюсь сделать, возможно, что мне нужно изменить?

Ответы [ 4 ]

11 голосов
/ 25 апреля 2011

Убедитесь, что у вас есть activemerchant версия не менее 1.12.0.

EXPRESS_GATEWAY.setup_purchase(220,
  :items => [{:name => "Tickets", :quantity => 22,:description => "Tickets for 232323",                          :amount => 10}],
  :return_url => 'example.com',
  :cancel_return_url => 'example.com'
)

Надеюсь, это поможет:)

4 голосов
/ 14 января 2011

@ Soleone Я пробую ваше решение, но у меня не работает.

xml.tag! 'n2:OrderDescription', options[:description]
xml.tag! 'n2:Name', options[:name]
xml.tag! 'n2:Description', options[:desc]
xml.tag! 'n2:Amount', options[:amount]
xml.tag! 'n2:Quantity', options[:quantity]

Я думаю, что структура xml неправильная, элементы заказа несколько, поэтому должно быть вот так

xml.tag! 'n2:OrderItems' do
    xml.tag! 'n2:OrderItem' do
        xml.tag! 'n2:Name', options[:name]
        xml.tag! 'n2:Description', options[:desc]
        xml.tag! 'n2:Amount', options[:amount]
        xml.tag! 'n2:Quantity', options[:quantity]
    end
end

Но на самом деле я не знаю правильную структуру, сейчас ищу.

==== Обновление

Я нашел API-документ SOAP, https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_soap_r_SetExpressCheckout#id09BHC0QF07Q

xml.tag! 'n2:PaymentDetails' do
    xml.tag! 'n2:PaymentDetailsItem' do
        xml.tag! 'n2:Name', options[:name]
        xml.tag! 'n2:Description', options[:desc]
        xml.tag! 'n2:Amount', options[:amount]
        xml.tag! 'n2:Quantity', options[:quantity]
    end
end

Но также не работает, кто может помочь?

===== ОБНОВЛЕНИЕ ====

Я попробовал метод добавления параметра PaymentDetails, но, похоже,все еще не работает, я нашел схему SetExpressCheckoutReq xml, http://www.visualschema.com/vs/paypal/SetExpressCheckoutReq/, нет определения PaymentDetails, который делал это раньше, надеюсь на вашу помощь.

====== FINAL========

Я исправил эту проблему, новая версия ActiveMerchant поддерживает обзор деталей заказа, и mwagg выпустил патч по этому поводу, вы, ребята, можете использовать эту версию https://github.com/mwagg/active_merchant

3 голосов
/ 14 января 2011

Вы можете увидеть доступные параметры в этой таблице (применяется только средний столбец, поскольку activemerchant использует SOAP API):

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECCustomizing#id086NA300I5Z__id086NAC0J0PN

Чтобы лучше понять, как работает activemerchantвероятно, чтобы посмотреть непосредственно в реализации.Вы видите, как соответствующие параметры вставляются в запрос SOAP XML (в настоящее время), начиная со строки 98, где вставляется OrderTotal:

https://github.com/Shopify/active_merchant/blob/master/lib/active_merchant/billing/gateways/paypal_express.rb#L98

Обратите внимание, как параметры выбираются изхеш options, чтобы вы могли видеть правильный символ для передачи каждого из них здесь.

В вашем случае, перечисляя следующие параметры, вы сделали бы это следующим образом:

def paypal
  options = { 
    :name => "Tickets", 
    :quantity => @payment.quantity, 
    :description => "Tickets for #{@payment.event_name}",
    :amount => @payment.unit_price
    :ip => request.remote_ip,
    :return_url => url_for(:action=>:confirm, :id=>@payment.id, :only_path=>false),
    :cancel_return_url => url_for(:action=>:show, :id=>@payment.id, :only_path=>false)
  }

  # the actual code that gets used
  setup_response = gateway.setup_purchase(@payment.amount, options)
  redirect_to gateway.redirect_url_for(setup_response.token)
end

Обратите внимание: поля name, quantity и amount в настоящее время не поддерживаются в activemerchant.Вам придется раскошелиться на репозиторий, вставить их самостоятельно и использовать свою копию проекта.Это действительно очень просто, когда вы смотрите на код и видите, как это делается с остальными.

Например, чтобы добавить название заказа, количество товара и цену за единицу, вы бы поставили эти строки после OrderDescription вставляется:

  xml.tag! 'n2:Name', options[:name]
  xml.tag! 'n2:Amount', options[:amount]
  xml.tag! 'n2:Quantity', options[:quantity]

Надеюсь, это поможет!

ОБНОВЛЕНИЕ:

Хорошо, я думаю, что в соответствии со схемой XML для SOAP API это выглядит так, как будто вы должны указатьэто как в activemerchant:

xml.tag! 'n2:PaymentDetails' do
  items = options[:items] || []
  items.each do |item|
    xml.tag! 'n2:PaymentDetailsItem' do
      xml.tag! 'n2:Name', item[:name]
      xml.tag! 'n2:Description', item[:desc]
      xml.tag! 'n2:Amount', item[:amount]
      xml.tag! 'n2:Quantity', item[:quantity]
    end
  end
end

И вы бы передавали все свои элементы в приложение Rails следующим образом:

options = {
  :items => [
    { 
      :name => "Tickets", 
      :quantity => @payment.quantity, 
      :description => "Tickets for #{@payment.event_name}",
      :amount => @payment.unit_price
    },
    { 
      :name => "Other product", 
      :quantity => @other_payment.quantity, 
      :description => "Something else for #{@other_payment.event_name}",
      :amount => @other_payment.unit_price
    }
  ]
  :ip => request.remote_ip,
  :return_url => url_for(:action=>:confirm, :id=>@payment.id, :only_path=>false),
  :cancel_return_url => url_for(:action=>:show, :id=>@payment.id, :only_path=>false) 
}

Надеюсь, что это работает лучше, удачи!

1 голос
/ 15 ноября 2011

У меня также были проблемы, чтобы заставить это работать.Решение состоит в том, что сумма суммы всех позиций должна быть промежуточной суммой заказа, при этом промежуточная сумма, доставка, обработка и налог должны составлять общую сумму заказа.Мой контроллер PayPal выглядит так:

def begin_paypal
  # ...
  options = express_options(@order)
  # ... 
  response = EXPRESS_GATEWAY.setup_purchase(@order.gross_price_in_cent, options)
  redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token)
end

private
def express_options order
  options = {}
  options[:ip] = request.remote_ip
  options[:order_id] = order.bearbeitungsnummer

  # subtotal, shipping, handling and tax must sum up to the orders total value
  # subtotal must be the sum of all amounts of all items
  options[:subtotal] = order.gross_price_in_cent
  options[:shipping] = 0
  options[:handling] = 0
  options[:tax] = 0

  options[:items] = order.line_items.map do |line_item|
    {
      :name => line_item.product.name,
      :number => line_item.product.kcode,
      :quantity => line_item.quantity,
      :description => line_item.product.beschreibung,
      :amount => line_item.gross_price_in_cent,
      :url => nil
    }
  end
  # ...
end

Работает нормально

...