簡體   English   中英

Braintree PHP設置量並避免舍入錯誤

[英]Braintree PHP setting amount and avoiding rounding errors

我正在使用PHP / Laravel和Braintree創建一個用於付款的Web應用程序。 我正在使用Braintree dropin

Web應用程序的簡化流程:

  1. 用戶上傳文件並從下拉菜單中選擇服務,然后提交表單
  2. 顯示給用戶的報價/價格是根據上載文件的字數*所選服務計算得出的
  3. 用戶通過Braintree插件選擇付款,提交表格進行付款
  4. Web應用觸發了Braintree_Transaction::sale()
  5. 顯示用戶成功頁面

向客戶收費

關於上述內容,我想在步驟4的Braintree_Transaction::sale()方法調用中獲取有關設置數量的最佳實踐的建議。

github上的Braintree PHP示例中, Braintree_Transaction::sale()方法調用中使用的金額來自表單中的文本輸入,我可以假設用戶對此進行了編輯。

在上述的我的Web應用程序流程中,在步驟1之后,我是否正確地設置了會話中所選服務的報價/價格,然后在步驟2中將會話中的該值顯示給用戶,最后從會話中傳遞了該值作為Braintree_Transaction::sale()amount 還是有其他推薦的方法? 我主要關心的是向客戶收取正確的金額。

避免舍入錯誤

由於報價/價格是用PHP計算的,方法是采用上載文件的字數並將其乘以客戶選擇的服務,因此有時會涉及浮點數。 例如,字數是1000,選擇的服務是校對x1.5,因此報價將是1500 =>£15.00。

如果我的記憶正確地為我服務,則條紋表示例如1便士100英鎊。 這很好,因為它有助於避免舍入錯誤。 另一方面,我認為布倫特里(Braintree)期望以磅小數點1.00表示一個英鎊。

在這種情況下,避免任何舍入錯誤的最佳方法是什么?

感謝您的任何建議,如果需要,請索取更多詳細信息,我已嘗試使之盡可能簡短和籠統。

在會話中設置所選服務的報價/價格,然后在步驟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, '.', '');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM