我正在尝试在 rails 应用程序中启用信用卡计费,并且在尝试创建订单时收到以下错误:undefined method 'has_key?' for #<ActiveMerchant::Billing::CreditCard:0x244b3d8>
引用的代码是purchase
订单模型中的方法:
class Order < ActiveRecord::Base
...
include ActiveMerchant::Billing
...
def credit_card
@credit_card ||= ActiveMerchant::Billing::CreditCard.new(
:type => card_type,
:number => card_number,
:month => card_expires_on.month,
:year => card_expires_on.year,
:first_name => first_name,
:last_name => last_name,
:verification_value => card_verification
)
end
def purchase
response = GATEWAY.authorize(price_in_cents, credit_card)
if response.success?
GATEWAY.capture(price_in_cents, response.authorization)
cart.update_attribute(:purchased_at, Time.now)
else
raise StandardError, response.message
end
end
end
我正在使用 Paypal Express 网关,Active Merchant 库对其定义purchase
如下:
def purchase(money, options = {})
requires!(options, :token, :payer_id)
commit 'DoExpressCheckoutPayment', build_sale_or_authorization_request('Sale', money, options)
end
private
def build_get_details_request(token)
xml = Builder::XmlMarkup.new :indent => 2
xml.tag! 'GetExpressCheckoutDetailsReq', 'xmlns' => PAYPAL_NAMESPACE do
xml.tag! 'GetExpressCheckoutDetailsRequest', 'xmlns:n2' => EBAY_NAMESPACE do
xml.tag! 'n2:Version', API_VERSION
xml.tag! 'Token', token
end
end
xml.target!
end
def build_sale_or_authorization_request(action, money, options)
currency_code = options[:currency] || currency(money)
xml = Builder::XmlMarkup.new :indent => 2
xml.tag! 'DoExpressCheckoutPaymentReq', 'xmlns' => PAYPAL_NAMESPACE do
xml.tag! 'DoExpressCheckoutPaymentRequest', 'xmlns:n2' => EBAY_NAMESPACE do
xml.tag! 'n2:Version', API_VERSION
xml.tag! 'n2:DoExpressCheckoutPaymentRequestDetails' do
xml.tag! 'n2:PaymentAction', action
xml.tag! 'n2:Token', options[:token]
xml.tag! 'n2:PayerID', options[:payer_id]
xml.tag! 'n2:PaymentDetails' do
xml.tag! 'n2:OrderTotal', localized_amount(money, currency_code), 'currencyID' => currency_code
# All of the values must be included together and add up to the order total
if [:subtotal, :shipping, :handling, :tax].all?{ |o| options.has_key?(o) }
xml.tag! 'n2:ItemTotal', localized_amount(options[:subtotal], currency_code), 'currencyID' => currency_code
xml.tag! 'n2:ShippingTotal', localized_amount(options[:shipping], currency_code),'currencyID' => currency_code
xml.tag! 'n2:HandlingTotal', localized_amount(options[:handling], currency_code),'currencyID' => currency_code
xml.tag! 'n2:TaxTotal', localized_amount(options[:tax], currency_code), 'currencyID' => currency_code
end
xml.tag! 'n2:NotifyURL', options[:notify_url]
xml.tag! 'n2:ButtonSource', application_id.to_s.slice(0,32) unless application_id.blank?
xml.tag! 'n2:InvoiceID', options[:order_id]
xml.tag! 'n2:OrderDescription', options[:description]
end
end
end
end
xml.target!
end
看起来credit_card
我的订单模型中的参数被视为options
在has_key?
Active Merchant 库中被调用的,其CreditCard
代码未定义has_key?
。我正在使用最新版本的 Active Merchant。
有什么帮助吗?