我的网络项目存在问题;什么是最安全的方法来计算货币值,包括使用Javascript进行Stripe的预期费用?

问题描述 投票:0回答:1

我想做什么

我在工作中遇到困难,我想在工作中解决这个问题。

我需要在HTML / JS中有一个表单,该表单使用Stripe进行付款,然后进行计算以查找一些稍后可以存储的值。该表格需要付款,付款将在公司和客户之间分配。

最低付款金额为1美元,无论如何,公司一开始会收取所收取金额的1%。客户收到Stripe费用后的剩余款项,并从公司中扣除上述1%的款项。

[还需要有一种可选的方式来支付公司和Stripe费用,以便在扣除Stripe费用和公司费用后,客户获得指定的金额。

这听起来有点令人困惑,例如:

  • 如果我在不支付任何费用的情况下进行了1.00美元的交易,那么我将发送1.00美元的费用,并期望Stripe获得0.33美元,客户获得0.66美元,公司获得0.01美元。
  • 如果我花了$ 1.00并想支付任何费用,那么我将寄出$ 1.35的费用,并希望Stripe获得$ 0.34,客户获得$ 1.00,公司获得$ 0.01。

我的担忧

最近,我开始担心浮点计算不正确的陷阱,以及它们如何影响货币计算。

(我最近才发现浮点数不准确,当我在进行此项目时在Web控制台中将两个浮点数加在一起时得到了意外的结果后,偶然发现了一些信息。我被链接this video到解释。)

我以前编写的函数可以满足我上面解释的所有要求,但现在我担心我的解决方案可能有缺陷,我对所写内容的不确定性感到不胜其烦。我想从其他开发人员那里获得一些见识,以帮助我更改代码以使其更安全。

我曾尝试使用dinero.js重写函数,但发现我变得有些困惑。我的数学成绩很差,所以到目前为止我已经尽力了。

下面是我当前的函数,它接收一个JS浮点值(来自文本输入)和一个布尔值,用于确定是否应支付交易费用。让我真正感到困惑的是,在测试交易之后,我一直希望在Stripe仪表板中验证数据时出现问题,并且还没有发现我的功能未能按预期工作的情况。

我对代码进行的最后更改是使函数返回整数值,以将其存储为元数据,以便在单独的Web应用程序中进行进一步处理。 (例如199代表1.99美元)

感谢您阅读到目前为止的问题,如果您愿意,请帮助我。非常感谢任何有见地的回答,它们可以帮助我进一步了解如何更改代码。

function account_for_fees(amount,cover) { //amount is a string representation of an amount in USD e.g. "1.00"
    if(cover) {
        amount = parseFloat(amount);
        var company_fee = Math.round((amount * 0.01)*100)/100; //company fee of initial charge (1%)
        amount += company_fee;

        //Calculate stripe fees based on amount
        var f = (amount * 0.029) + 0.3;
        var p = (amount + 0.3) / (1 - 0.029);
        var cn = ((p - ((p * 0.029) + 0.3)) - company_fee);

        return { 
            charge: Math.round(p * 100), 
            stripe_fee: Math.round(((p * 0.029) + 0.3) * 100),
            client_net: Math.round(cn * 100), 
            company_net: Math.round(company_fee * 100)
        };
    }
    else {
        var r = parseFloat(amount);
        var company_fee = Math.round((r * 0.01) * 100) / 100;         
        var cn = ((r - ((r * 0.029) + 0.3)) - company_fee);
        return { 
            charge: (Math.round(r * 100)), 
            stripe_fee: (Math.round(((r * 0.029) + 0.3) * 100)),
            client_net: (Math.round(cn * 100)),
            company_net: (Math.round(company_fee * 100))
        };
    }
}

编辑:我将函数重写为以下内容:

function account_for_fees(amount,cover) { //amount is a string representation of an amount in USD e.g. "1.00"
    if(cover) {
        amount = parseFloat(amount) * 100;
        var company_fee = Math.round(amount * 0.01); //company fee of initial charge (1%)
        amount += company_fee;

        //Calculate stripe fees based on amount
        var f = Math.round((amount * 0.029)) + 30;
        var p = Math.round((amount + 30) / (1 - 0.029));
        var cn = ((p - (Math.round(p * 0.029) + 30)) - company_fee);

        return { 
            charge: p, 
            stripe_fee: (Math.round(p * 0.029) + 30),
            client_net: cn, 
            company_net: company_fee
        };
    }
    else {
        var amount = parseFloat(amount) * 100;
        var company_fee = Math.round((amount * 0.01));       
        var cn = ((amount - (Math.round(amount * 0.029) + 30)) - company_fee);
        return { 
            charge: amount, 
            stripe_fee: (Math.round(amount * 0.029) + 30),
            client_net: cn,
            company_net: company_fee
        };
    }
}
javascript stripe-payments currency
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.