У меня есть функция, описанная ниже, которая рассчитывает комиссию за платеж, которая поступит поставщику платежа (например, 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);
}
Я был разработан на основе эта статья от Stripe:
Однако, когда вы увеличиваете общую сумму, которую вы просите Stripe, вы также увеличиваете комиссию Stripe, потому что цена Stripe — это фиксированная комиссия плюс процент от общей суммы комиссии. Таким образом, вам необходимо выяснить, какую сумму брутто вам нужно взимать, чтобы после вычетов Stripe свою комиссию вы получали предсказуемую чистую сумму.
Это оказывается математическая задача, которая не так проста, как кажется, но чтобы сэкономить некоторые вычисления:
Я считаю, что моя функция должна работать при работе с более низкими процентами (то есть 2,9%, 5% и т. Д.) — Я проверил вывод в соответствии с этим инструментом. Но по мере того, как процент увеличивается, вывод кажется странным, и я думаю, что функция как-то испорчена, или я не совсем понимаю, как взимать плату. Любой случай мог быть вообразим.
Выход:
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. Я бы предположил, что это будет что-то вроде 50%, если я передам «0,5» в качестве третьего параметра. Может быть, я что-то неправильно понимаю, но это кажется странным.
Я хочу рассчитать комиссию, которую будет взимать Stripe или PayPal, а затем положить эту комиссию на клиента.
Так что, если я продам что-то за 100 $, а комиссия Stripe составит 2,9%, я буду взимать с клиента 102,9 $.
Что я сейчас не понимаю, Если я хочу продать что-то за 100 $, где я установил комиссию в 50%, мне говорят, что я должен взимать 200 $.
На самом деле 100 $ комиссия за 50% это правильно.
Представьте себе этот сценарий:
Здесь мы рассмотрим базовый скрипт, который рассчитывает те же вещи:
<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);