我正在构建一个使用PayPal Express的市场应用程序。我有一个表单供卖家输入他们的PayPal API凭证,但我需要一种方法来通过对PayPal进行某种调用来验证它们。
我在ActiveMerchant中使用PaypalExpressGateway,除了标准的购买控件之外我什么都看不到。是否可以使用任何类型的空操作?
非常感谢任何帮助!
答案 0 :(得分:2)
我正在使用TransactionSearch操作来实现此目的。通过指定STARTDATE=2100-01-01 00:00:00
,它基本上会导致无操作。
它将为您验证凭据,而无需卖家提供任何其他输入。
答案 1 :(得分:1)
我个人没有答案。但我知道Railscasts.com的Ryan Bates最近专门为ActiveMerchant和Paypal投了六集(!)剧集。查看railscasts.com上的#141到#146集。
答案 2 :(得分:1)
出于安全原因,无法检查电子邮件是否为有效的PayPal帐户。如果确实需要帐户有效性,您可以随时进行小额交易,然后将其取消。
答案 3 :(得分:1)
好的,4个小时后......
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
感谢Neil的检查交易搜索的想法。
如果有更好的方法可以检查api字段是否发生变化,请告诉我。
答案 4 :(得分:1)
API中还有一个GetBalance调用。 Some sample code
看起来像最简单(也是最快?)的方式。
答案 5 :(得分:0)
PayPal确实有AddressVerify
API。它确认邮政地址和邮政编码是否与指定的PayPal帐户持有人匹配。事实上,我现在正在我们的网站上实施它。
你可以在这里阅读更多相关信息:
https://www.x.com/docs/DOC-1162#id0862M0QH02L
答案 6 :(得分:0)
是的,如果您想使用ActiveMerchant测试用户的凭据,请在网关上使用transaction_search方法
此示例将返回成功(确保填写您的测试凭据)
@username = ''
@password = ''
@signature = ''
gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(
login: @username,
password: @password,
signature: @signature,
test: true
)
gateway.transaction_search({start_date: DateTime.now})