rubypaypal-sandboxactivemerchant

Problem matching amounts with PaypalExpressGateway.setup_authorization


I'm using ruby client with activemerchant to create call for Paypal sandbox API. Script is being called from command line, so variables are filled with command line parameters. Here's the code sample:

login = ARGV[0]
password = ARGV[1]
signature = ARGV[2]
ip = ARGV[3]
subtotal = ARGV[4]
shipping = ARGV[5]
handling = ARGV[6]
tax = ARGV[7]
currency = ARGV[8]
return_url = ARGV[9]
cancel_return_url = ARGV[10]
allow_guest_checkout = ARGV[11]
items = JSON.parse(ARGV[12])

ActiveMerchant::Billing::Base.mode = :test
paypal_options = {
    login: login,
    password: password,
    signature: signature
}

gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)

setup_hash = {
    ip: ip, 
    items: items, 
    subtotal: Integer(subtotal),
    shipping: Integer(shipping),
    handling: Integer(handling), 
    tax: Integer(tax), 
    currency: currency, 
    return_url: return_url, 
    cancel_return_url: cancel_return_url, 
    allow_guest_checkout: allow_guest_checkout
}

amount = subtotal.to_i + shipping.to_i + handling.to_i + tax.to_i
puts "amount: " + amount.to_s
puts "items: " + items.to_s
response = gateway.setup_authorization(amount, setup_hash)
if !(response.success?)
    puts response.message.to_s
end

And here's what I get in console:

amount: 10000
items: [{"name"=>"sample", "description"=>"desc", "quantity"=>1, "amount"=>10000}]
The totals of the cart item amounts do not match order amounts.

So, how come 10000 in amount doesn't match 10000 in items?


Solution

  • After long and boring debugging I found out the following: internal hash items should be [:{name=>"sample", :description=>"desc", :quantity=>1, :amount=>10000}] rather than [{"name"=>"sample", "description"=>"desc", "quantity"=>1, "amount"=>10000}] in example above.

    So, I've changed JSON parser to nice_hash and with items = ARGV[12].json it works like a charm.