您必须确保您发送到 PayPal 的金额已针对该货币进行了正确的四舍五入。这意味着美元金额最多有 2 个子单位(美分)。
如果使用自适应支付红宝石宝石但仍然遇到问题:
我最近在使用他们的 ruby gem 时遇到的另一个问题是他们使用浮点数而不是小数,这对于货币价值来说是一种不好的做法。浮点数不准确。例如在红宝石中...
2.20 - 2.01 = 0.1900000000000004
如果您在将参数传递给他们的build_pay 方法时正确设置了金额的子单位,但您仍然收到错误...
If the fractional amount is rounded for currency conversion, funds could be lost
那么问题很可能在于他们的 gem 对 float 的使用。您的日志将显示这一点,您可以使用 715.57 的数量对其进行测试,他们的 gem 将其作为 715.57000000001 发送到他们的 api,因为他们在 paypal-sdk-core gem 中使用了 .to_f。
为了解决这个问题,我在我的 rails 应用程序中修补了他们的 Float 类,将其添加到我的应用程序中,基本上将其转换为 BigDecimal 而不是 Float:
module PayPal::SDK::Core
module API
module DataTypes
module SimpleTypes
class Float < ::Float
def self.new(float)
# Floats are inccurate. BigDecimal is better.
# Ruby example: 2.20 - 2.01 = 0.1900000000000004
# To support currencies with up to 4 subunits, we round(4)
BigDecimal.new(float.to_f.round(4).to_s)
end
end
end
end
end
end
致我的config/initializers/paypal.rb。我不能说这是最优雅的解决方案,但它确实有效。我也在他们的 repo 上创建了一个问题,希望很快能收到回复。
有关货币浮动问题的更多信息:
参考1:https://stackoverflow.com/a/3730040/1109211
参考2:https://stackoverflow.com/a/3730249/1109211