記一次支付異步校驗邏輯漏洞,以前支付出現問題很長時間了,最後經過日誌發現是最後覈對金額時出現了問題。php
舉例,當用戶使用微信支付1筆商品價格爲19.9元的訂單時,微信支付平臺異步回調時會獲得具體的用戶支付金額。html
如1990(以分爲單位,即19.90元)。數據庫
校驗邏輯服務器
<?php $notify_money = 1990;//微信服務器返回的金額 $db_money = 19.90;//數據庫存儲的訂單金額 if(intval($notify_money) === intval($db_money*100)){ echo 'SUCCESS'; }else{ echo 'FAIL'; }
這個邏輯,第一眼看起來可能沒什麼問題,在實際的使用狀況下,有的訂單則會經過(SUCCESS),有的則可能會失敗(FAIL)。微信
通過測試,發現這兩個值的intval結果是徹底不一樣的。異步
最後查閱了一番發現這是浮點數處理不當引發的問題。測試
http://php.net/manual/en/function.intval.php#60793微信支付
http://www.laruence.com/2013/03/26/2884.html.net
拜讀了鳥哥的講解以後,內心終於明白是怎麼回事了。日誌
最終的解決辦法是,換作round或者先將浮點轉換到字符串再使用intval進行便可。
修改後的一個邏輯
<?php $notify_money = 1990;//微信服務器返回的金額 $db_money = 19.90;//數據庫存儲的訂單金額 if(round($notify_money) === round($db_money*100)){ echo 'SUCCESS'; }else{ echo 'FAIL'; } //或 if(intval($notify_money) === intval((string)($db_money*100))){ echo 'SUCCESS'; }else{ echo 'FAIL'; }
這個問題可能不僅僅限於微信支付或者其餘支付都有可能遇到,每每就在於多個業務的金額單位不一致致使的。