Поддержка ActiveMerchant для определения статуса счета (подтвержденный/неподтвержденный) клиента/покупателя PayPal Express Checkout

В настоящее время я работаю над веб-приложением Ruby-on-Rails, которое принимает платежи PayPal через PayPal Express Checkout и ActiveMerchant. Я провел несколько исследований поддержки ActiveMerchant, чтобы определить, оплатил ли клиент/покупатель, используя проверенную или неподтвержденную учетную запись PayPal, но мне не повезло найти полезное руководство.

Я также считаю, что ActiveMerchant в настоящее время плохо документирован, поэтому он не так уж полезен.

Ниже приведены соответствующие коды, которые в настоящее время использует мой проект. В PaymentsController#purchase я временно использовал методы #params['protection_eligibility'] и #params['protection_eligibility_type'] объекта ActiveMerchant::Billing::PaypalExpressResponse, возвращаемого вызовом метода EXPRESS_GATEWAY.purchase, чтобы оценить, есть ли у клиента/покупателя PayPal подтвержденная/неподтвержденная учетная запись PayPal. Позже я узнал, что это не является надежным основанием для знания состояния счета клиента.

Я надеюсь, что кто-нибудь может дать мне мудрость, чтобы узнать, есть ли у клиента/покупателя PayPal проверенная/непроверенная учетная запись с использованием ActiveMerchant Ruby-on-Rails или с использованием других альтернатив на Rails.

# config/environments/development.rb
config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :test
  paypal_options = {
      # credentials removed for this StackOverflow question
      :login => "",
      :password => "",
      :signature => ""
  }
  ::EXPRESS_GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
end

# app/models/payment.rb
class Payment < ActiveRecord::Base
  # ...
  PAYPAL_CREDIT_TO_PRICE = {
      # prices in cents(US)
      1  =>  75_00,
      4  => 200_00,
      12 => 550_00
  }
  STATUSES  = ["pending", "complete", "failed"]
  TYPES     = ["paypal", "paypal-verified", "paypal-unverified", "wiretransfer", "creditcard"]
  # ...
end

# app/controllers/payments_controller.rb
class PaymentsController < ApplicationController
  # ...
  def checkout
    session[:credits_qty] = params[:credit_qty].to_i

    total_as_cents = Payment::PAYPAL_CREDIT_TO_PRICE[session[:credits_qty]]
    setup_purchase_params = {
        :allow_guest_checkout => true,
        :ip => request.remote_ip,
        :return_url => url_for(:action => 'purchase', :only_path => false),
        :cancel_return_url => url_for(:controller => 'payments', :action => 'new', :only_path => false),
        :items => [{
                       :name => pluralize(session[:credits_qty], "Credit"),
                       :number => 1,
                       :quantity => 1,
                       :amount => Payment::PAYPAL_CREDIT_TO_PRICE[session[:credits_qty]]
                   }]
    }

    setup_response = EXPRESS_GATEWAY.setup_purchase(total_as_cents, setup_purchase_params)
    redirect_to EXPRESS_GATEWAY.redirect_url_for(setup_response.token)
  end

  def purchase
    if params[:token].nil? or params[:PayerID].nil?
      redirect_to new_payment_url, :notice => I18n.t('flash.payment.paypal.error')
      return
    end

    total_as_cents = Payment::PAYPAL_CREDIT_TO_PRICE[session[:credits_qty]]
    purchase_params = {
        :ip => request.remote_ip,
        :token => params[:token],
        :payer_id => params[:PayerID],
        :items =>  [{
                        :name => pluralize(session[:credits_qty], "Credit"),
                        :number => 1,
                        :quantity => 1,
                        :amount => Payment::PAYPAL_CREDIT_TO_PRICE[session[:credits_qty]]
                    }]
    }

    purchase = EXPRESS_GATEWAY.purchase total_as_cents, purchase_params
    if purchase.success?
      payment = current_user.payments.new
      payment.paypal_params = params
      payment.credits = session[:credits_qty]
      payment.amount  = Payment::PAYPAL_CREDIT_TO_PRICE[session[:credits_qty]]
      payment.currency = "USD"
      payment.status = "complete"
      if(purchase.params["receipt_id"] && (purchase.params["success_page_redirect_requested"] == "true"))
        payment.payment_type = "creditcard"
      else
        if purchase.params['protection_eligibility'] == 'Eligible' && purchase.params['protection_eligibility_type'] == 'ItemNotReceivedEligible,UnauthorizedPaymentEligible'
          payment.payment_type = 'paypal-verified'
        else
          payment.payment_type = 'paypal-unverified'
        end
      end
      payment.ip_address = request.remote_ip.to_s
      payment.save!

      SiteMailer.paypal_payment(payment).deliver
      SiteMailer.notice_payment(payment).deliver

      notice = I18n.t('flash.payment.status.thanks')
      redirect_to profile_url, :notice => notice
    else
      notice = I18n.t('flash.payment.status.failed', :message => purchase.message)
      redirect_to new_payment_url, :notice => notice
    end
  end
  # ...
end

person ebcagadas    schedule 28.01.2013    source источник
comment
В чем именно заключается ваш вопрос?   -  person Peter Brown    schedule 28.01.2013
comment
Привет, Берлингтон, мой вопрос: есть ли у ActiveMerchant функция для указания того, что платеж PayPal Express Checout выполняется с проверенной/неподтвержденной учетной записи PayPal?   -  person ebcagadas    schedule 28.01.2013


Ответы (2)


Я использовал гем PayPal paypal-sdk-merchant, чтобы выполнить работу, с которой ActiveMerchant не смог мне помочь (получение статуса учетной записи плательщика: проверенная/непроверенная учетная запись PayPal. Я следил за установкой paypal-sdk-merchant на https://github.com/paypal/merchant-sdk-ruby

  • gem 'paypal-sdk-merchant'
  • пакетная установка
  • rails генерирует paypal:sdk:install

Затем я настроил их образцы https://github.com/paypal/merchant-sdk-ruby#samples. После настройки примеров перейдите в /samples вашего приложения Rails, и вы найдете множество генераторов кода для любой функции, которая вам нужна, из API PayPal. Не забудьте настроить файл config/paypal.yml. Я настроил имя пользователя, пароль и подпись (можно получить из вашей песочницы PayPal, в частности, из вашей учетной записи тестового продавца) и удалил app_id в моем случае.

Я получил следующий код для получения статуса учетной записи плательщика PayPal (подтвержденный/неподтвержденный) с использованием образцов PayPal (/samples) и поместил его в метод класса модели в моем приложении:

def self.get_paypal_payer_status(transaction_id)
  require 'paypal-sdk-merchant'
  api = PayPal::SDK::Merchant::API.new

  get_transaction_details = api.build_get_transaction_details({
    :Version => "94.0",
    :TransactionID => transaction_id
  })
  get_transaction_details_response = api.get_transaction_details(get_transaction_details)

  get_transaction_details_response.payment_transaction_details.payer_info.payer_status
end
person ebcagadas    schedule 01.03.2013

Я не знаком с ActiveMerchant, поэтому не могу сказать вам конкретно об этом, но с любой реализацией Express Checkout вы можете использовать GetExpressCheckoutDetails для получения информации о плательщиках, которая будет включать параметр PAYERSTATUS со значением "verified" или "unverified".

Это необязательный вызов, но я предполагаю, что ActiveMerchant, вероятно, включает его, поэтому вам просто нужно отследить его и соответствующим образом вытащить этот параметр.

Кроме того, вы можете использовать Мгновенное уведомление о платеже (IPN) для получения информации о транзакции, и вы также получите здесь параметр payer_status.

person Drew Angell    schedule 28.01.2013
comment
Здравствуйте, Эндрю, ваш ответ заставил меня копать больше на странице разработчиков PayPal, и там я нашел их так называемые новые SDK PayPal, а оттуда я узнал о жемчужине PayPal paypal-sdk-merchant, которая помогла выполнить работу, которую ActiveMerchant не выполнял. в состоянии помочь мне. Спасибо за ваше руководство! - person ebcagadas; 02.03.2013