我正在创建一个使用PHP / Laravel和Braintree进行付款的网络应用程序。我正在使用Braintree dropin。
简化的网络应用流程:
Braintree_Transaction::sale()
关于上述内容,我想就步骤4中Braintree_Transaction::sale()
方法调用中设置金额的最佳做法提供一些建议。
在Braintree PHP example on github中,Braintree_Transaction::sale()
方法调用中使用的金额来自表单中的文本输入,这可以由用户编辑,我假设为例。
在上面描述的我的网络应用程序流程中,在步骤1之后,我是否正确设置会话中所选服务的报价/价格,然后在步骤2中将会话中的值显示给用户,最后传递值从会话amount
到Braintree_Transaction::sale()
?或者是否有不同的推荐方法?我主要担心的是向客户收取正确的金额。
由于报价/价格是以PHP计算的,通过获取上传文件的字数并将其乘以客户选择的服务,这有时会涉及浮点数。例如。字数为1000,所选服务是校对,即x1.5,所以引用为1500 => £15.00。
如果我的记忆正确地为我服务,例如,Stripe代表一便士100
一磅(£)。这很好,因为它有助于避免舍入错误。另一方面,我认为Braintree希望用英镑1.00
表示一磅(£)。
在这种情况下,避免任何舍入错误的最佳方法是什么?
感谢您提出任何建议,如有需要,请提供更多详细信息。我已尝试尽可能简短和一般。
答案 0 :(得分:2)
我是否正确设置会话中所选服务的报价/价格然后在步骤2中将会话中的值显示给用户,最后将会话中的值作为金额传递给Braintree_Transaction :: sale( )?
是的,这是一种有效的方法。会话值存储在服务器端,因此它们不能由用户直接操作,并且用于跨页面请求传送信息。
另一种解决方案是在数据库中存储类似购物车的东西。这具有长期存储的优势,因此用户可能会在以后完成该过程,您可以轻松地针对它运行报告,并且可以跟踪辍学率等事项。
除了显示值之外,不要信任浏览器。含义不要将引用存储在浏览器中或在那里执行任何计算,因为它们可以被用户更改。
在这种情况下,避免任何舍入错误的最佳方法是什么?
开发人员在开始项目之前没有考虑到这一点。如果您不使用整数,则需要使用定点数学。
如果您使用的是关系数据库,请将货币值存储为DECIMAL。
在PHP中使用正确处理固定位置小数的bcmath库计算所有内容。它很简单,并且将数字保存在字符串中。按照你的例子:
$quote = bcmul('1000', '1.5', 2);
// '1500.0'
// Get 2 decimal places for Braintree
$sale = number_format((float)$quote, 2, '.', '');