2017-10-03 6 views
0

J'ai intégré paypal système de paiement adaptatif dans un site Web, mais j'obtiens une erreur pendant que je vérifie que si le montant jusqu'à 2 décimales n'est pas arrondi, le montant fractionnaire pourrait être perdu. Quelle est la solution pour ceci? Je suis en train d'arrondir les montants, mais vous savez aussi comment obtenir le montant fractionnaire?paypal Adaptive payment issue- le montant fractionnaire est arrondi

+0

Quelle est la devise que vous utilisez qui utilise plus de deux chiffres à la droite de la virgule point? La plus petite unité de la devise américaine est un cent (0,01), et il n'y a pas de plus petit * montant fractionnaire * que 1/100 de dollar. La solution est l'arrondi approprié, de sorte que les cents fractionnaires soient arrondis vers le haut (ou vers le bas) de manière appropriée. Vous ne pouvez pas très bien dire à un client * Votre coût est de 11,125 $ *, alors que ce n'est pas ce qui va apparaître sur leur relevé. –

Répondre

0

Vous devez vous assurer que le montant que vous envoyez à PayPal est arrondi correctement pour la devise. Cela signifie qu'un montant en dollars américains aurait au plus 2 sous-unités (cents).

Si vous utilisez les pierres précieuses rubis de paie adaptatives et rencontrez toujours des problèmes:

Une autre question que j'ai récemment rencontré avec leurs pierres précieuses rubis est qu'ils utilisent des flotteurs au lieu de décimales, ce qui est une mauvaise pratique pour les valeurs monétaires . Les flotteurs sont inexacts. Par exemple, en rubis ...

2.20 - 2.01 = 0.1900000000000004

Si vous configurez correctement les sous-unités de la quantité lors du passage dans la méthode à leur param build_pay et vous obtenez toujours l'erreur ...

If the fractional amount is rounded for currency conversion, funds could be lost

alors le problème peut très bien être dans l'utilisation de float par leur gemme. Vos journaux afficheront cela, et vous pouvez le tester en utilisant le montant 715.57, que leur gem envoie à leur API comme 715.57000000001 en raison de leur utilisation de .to_f dans leur gemme paypal-sdk-core.

Pour résoudre ce problème, le singe I patché leur application classe Float dans mes rails en ajoutant à mon application, jetant essentiellement comme un BigDecimal au lieu d'un flotteur:

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 

à mon config/initializers/paypal.rb. Je ne peux pas dire que c'est la solution la plus élégante, mais cela fonctionne. J'ai aussi créé un problème sur leur repo, et j'espère pouvoir vous répondre bientôt.

Plus d'informations sur les problèmes de flotteur avec monnaie:

Référence 1: https://stackoverflow.com/a/3730040/1109211

Référence 2: https://stackoverflow.com/a/3730249/1109211