Braintree PHP设置金额并避免舍入错误

时间:2017-03-04 21:40:32

标签: php paypal e-commerce braintree

我正在创建一个使用PHP / Laravel和Braintree进行付款的网络应用程序。我正在使用Braintree dropin

简化的网络应用流程:

  1. 用户上传文件并从下拉列表中选择服务,提交表单
  2. 显示用户的报价/价格,通过上传文件的字数*选择的服务
  3. 计算
  4. 用户通过Braintree drop-in选择付款,提交表单付款
  5. 网络应用会触发Braintree_Transaction::sale()
  6. 用户显示成功页面
  7. 为客户收费

    关于上述内容,我想就步骤4中Braintree_Transaction::sale()方法调用中设置金额的最佳做法提供一些建议。

    在Braintree PHP example on github中,Braintree_Transaction::sale()方法调用中使用的金额来自表单中的文本输入,这可以由用户编辑,我假设为例。

    在上面描述的我的网络应用程序流程中,在步骤1之后,我是否正确设置会话中所选服务的报价/价格,然后在步骤2中将会话中的值显示给用户,最后传递值从会话amountBraintree_Transaction::sale()?或者是否有不同的推荐方法?我主要担心的是向客户收取正确的金额。

    避免舍入错误

    由于报价/价格是以PHP计算的,通过获取上传文件的字数并将其乘以客户选择的服务,这有时会涉及浮点数。例如。字数为1000,所选服务是校对,即x1.5,所以引用为1500 => £15.00。

    如果我的记忆正确地为我服务,例如,Stripe代表一便士100一磅(£)。这很好,因为它有助于避免舍入错误。另一方面,我认为Braintree希望用英镑1.00表示一磅(£)。

    在这种情况下,避免任何舍入错误的最佳方法是什么?

    感谢您提出任何建议,如有需要,请提供更多详细信息。我已尝试尽可能简短和一般。

1 个答案:

答案 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, '.', '');