从Stripe / PayPal计算支付费用 - 函数中的奇怪输出

时间:2016-03-21 11:58:33

标签: php math paypal stripe-payments percentage

我有以下功能来计算支付费用(比如Stripe或PayPal)。

/**
 * Calculate payment provider fee. As described in this article: https://support.stripe.com/questions/can-i-charge-my-stripe-fees-to-my-customers
 *
 * 
 * @param  integer $amount  The amount you wish to charge
 * @param  float  $fixed   The fixed fee on the gateway
 * @param  float  $percent The percent fee on the gateway (0.029 = 2.9%)
 * @return integer          The fee that the gateway will charge
 */

function calcPaymentFee($amount, $fixed = 0.30, $percent = 0.029) {
    $a = $amount+$fixed;
    return round($a / (1 - $percent) - $amount, 3);
}

我是根据this article from Stripe开发的:

  

但是,当你增加你要求Stripe收费的总金额时,你也增加了条纹费用,因为Stripe的定价是固定费用加上总费用金额的百分比。因此,您需要确定需要收取的总金额,以便在Stripe扣除其费用后,您会收到一些可预测的净额。

     

这是一个数学问题,并不像听起来那么简单,但为了节省一些计算:

     

enter image description here

我相信在使用较低百分比(即2.9%,5%等)时,我的功能应该正常工作 - I tested output according to this tool。但随着百分比的增加,输出看起来很奇怪,而且我认为这个功能有些搞砸了,或者我没有正确理解如何收取费用。无论哪种情况都可以想象。

输出:

calcPaymentFee(100, 0, 0.029) // 2.9%: 2.987 (seems correct, this tool gives same output: http://thefeecalculator.com/stripe/) 
calcPaymentFee(100, 0, 0.1) // 10%: 11.111 (seems correct)
calcPaymentFee(100, 0, 0.5) // 50%: 100.0 (?!? - makes no sense)

我真的不明白为什么支付费用是100.如果我传入“0.5”作为第三个参数,我会想象它是50%。也许我误解了一些东西,但这看起来很奇怪。

我想要实现的目标

我希望计算Stripe或PayPal将收取的费用,然后将此费用计入客户。

因此,如果我以100美元的价格出售,条纹费用为2.9%,我将向客户收取102.9美元。

我目前不明白,如果我想卖100美元的东西,我已经将费用设定为50%,我被告知收取200美元。

2 个答案:

答案 0 :(得分:1)

这里我们会找一些计算同样事情的基本脚本:

<form method="post" target="<?php echo $_SERVER['PHP_SELF']; ?> ">
    <input ty
    <input type="text" name="amount">
    <input type="submit" name="submit" value="Calculate"> 
</form>

<?php
    $fixed = 0.3;
    $percent = 0.029;        
    function calcPaymentFee($amount) {
        global $fixed, $percent;
        $arr = array();
        $arr['fee'] = ($amount * $percent + $fixed);
        $arr['net'] = $amount - $arr['fee'];
        return $arr;
    }

    function calcTotal($amount) {
        global $fixed, $percent;
        $arr = array();
        $r = (100 - $percent*100) / 100;
        $arr['total'] = ($amount + $fixed) / $r;
        $arr['fee'] = $arr['total'] - $amount;
        return $arr;
    }

    if (isset($_POST['submit']) && !empty($_POST['amount'])) {
        $left = calcPaymentFee($_POST['amount']);
        $right = calcTotal($_POST['amount']);
        printf('Amount: %.2f<br>', $_POST['amount']);
        printf('Fee: %.2f<br>', $left['fee']);
        printf('Net sum: %.2f<br>', $left['net']);
        echo '<br>';
        printf('If you want net sum of %.2f you must ask for:<br>', $_POST['amount']);
        printf('Amount: %.2f<br>', $right['total']);
        printf('Fee: %.2f<br>', $right['fee']);
    }
?> 

输出:

Amount: 100.00
Fee: 3.20
Net sum: 96.80

If you want net sum of 100.00 you must ask for:
Amount: 103.30
Fee: 3.30

简而言之,calcPaymentFee函数中的公式有点不对,必须是:

return ($amount * $percent + $fixed);

答案 1 :(得分:0)

实际上50%的100美元费用是正确的。

想象一下这种情况:

  • 客户支付200美元。
  • 其中50%的人需要银行。 =&GT; 100 $
  • 你得到100美元(200美元的50%)