经常出现例如用户充值 1 元到账 0.994 元这类情况,导致用户余额无法购买商品
以下是充值部分业务逻辑代码:
$paidCredit = checkStringSign($invoice->credit);
if (isset($user->Credits) && $user->Credits != "") {
$currentCredit = checkStringSign($user->Credits);
}
$currentCredit = $currentCredit + $paidCredit;
$updatedCredit = signString($currentCredit);
$updatePricePlanId = "";
if ($paidCredit > 99.5 && $user->RiskyScore < 1) {
$updatePricePlanId = ",RiskyScore=0";
}
$query = "UPDATE users SET Credits = '$updatedCredit' $updatePricePlanId WHERE UserId = '$user->UserId'";
$objDBCD14->execute($query);
$comments = $out_trade_no;
$updateQuery = "update payments set Paid=1,TransactionId='$trade_no' WHERE PaymentId = '$out_trade_no' ";
$objDBCD14->execute($updateQuery);
$paymentId = $payments->PaymentId;
$objDBCD14->execute("INSERT INTO topUpRecords SET UserId ='$user->UserId', Credits = '$paidCredit', CreditsLeft = '$updatedCredit', Comments = '$comments'");
$invoice
中记录的金额是正确的
topUpRecords
中记录的金额就变成 0.994 了
但又不是 100%复现,排查了一晚上还没找出问题
checkStringSign 和 signString 接受的参数都是字符串,signString 内部逻辑是把字符串通过简单变换签名后将签名用 .{sign}
的格式附加在末尾,checkStringSign 内部逻辑是根据最后一个.分隔原文和签名,验签成功则返回原文,否则抛出错误,其中都不含显式的 cast 逻辑。
不熟悉 PHP ,之前写这个程序的人已经离职了,临时翻文档学的
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.