Validar as credenciais de API do usuário - Trilhos, ActiveMerchant e PayPal Express gateway
-
21-08-2019 - |
Pergunta
Estou construindo uma aplicação de mercado que usa PayPal Express. Eu tenho um formulário para os vendedores para introduzir as suas credenciais da API do PayPal, mas eu preciso de uma maneira de validá-los, fazendo uma espécie de chamada para PayPal.
Eu estou usando o PaypalExpressGateway em ActiveMerchant, e eu não vejo outra coisa senão os controles de compra padrão. Existe algum tipo de null-operação que pode ser usado?
Qualquer ajuda seria muito apreciada!
Solução
Por razões de segurança, não há uma maneira de verificar se o e-mail é uma conta paypal válido. Você sempre pode fazer uma pequena transação e, em seguida, anulá-lo se validade conta é realmente necessário.
Outras dicas
Eu estou usando o TransactionSearch operação para esta finalidade. Especificando STARTDATE=2100-01-01 00:00:00
que basicamente resulta em uma-op não.
Ele irá validar as credenciais para você, sem necessidade de qualquer entrada adicional do vendedor.
Eu não tenho a resposta pessoalmente. Mas eu sei que Ryan Bates de Railscasts.com dedicou recentemente seis (!) Episódios para ActiveMerchant e Paypal em particular. Confira episódios Nº 141 até # 146 em railscasts.com .
Ok, após 4 horas ...
module ActiveMerchant #:nodoc: module Billing #:nodoc: class PaypalExpressGateway < Gateway def get_balance(options = {}) commit 'GetBalance', build_get_balance_request(options) end private def build_get_balance_request(options) xml = Builder::XmlMarkup.new :indent => 2 xml.tag! 'GetBalanceReq', 'xmlns' => PAYPAL_NAMESPACE do xml.tag! 'GetBalanceRequest', 'xmlns:n2' => EBAY_NAMESPACE do xml.tag! 'n2:Version', API_VERSION xml.tag! 'n2:ReturnAllCurrencies', '1' end end xml.target! end end end end class SellerMerchantValidator < ActiveModel::Validator def validate(record) paypal_attrs = ['paypal_api_username', 'paypal_api_password', 'paypal_api_signature'] if record.paypal_merchant? && (record.changed - paypal_attrs).size < record.changed.size # one of paypal_attrs changed response = record.gateway.get_balance unless response.params['balance'].present? record.errors[:base] << "Please check the PayPal details and make sure all three are entered correctly." end end end end
Graças ao Neils para a idéia para verificar o TransactionSearch.
Por favor, deixe-me saber se existe uma maneira melhor para verificar se algum do campo api alterado.
Há também uma chamada para GetBalance na API. Um código de exemplo
Parece que o mais simples (e mais rápida?) Caminho.
PayPal tem uma API AddressVerify
. Ela confirma se um endereço postal e código postal corresponder aos do titular da conta especificado PayPal. Eu estou no processo de implementação em nosso site agora, na verdade.
Você pode ler mais sobre ele aqui:
https://www.x.com/docs/DOC-1162#id0862M0QH02L
Certo, então se você quiser testar as credenciais de um usuário usando ActiveMerchant, use o método transaction_search no gateway
Este exemplo retornará um sucesso (certifique-se de preencher as suas credenciais de teste)
@username = ''
@password = ''
@signature = ''
gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(
login: @username,
password: @password,
signature: @signature,
test: true
)
gateway.transaction_search({start_date: DateTime.now})