amount=100.00 → amount=0.01支付寶只保證「該訂單已支付」,不保證「支付金額等於訂單金額」。
trade_no,前端不可篡改金額// 回調處理關鍵邏輯
public ActionResult AlipayNotify(AlipayNotifyModel model) {
// 1. 驗證簽名(防篡改)
if (!AlipayVerify.Verify(model)) return Content("fail");
// 2. 核心:金額一致性檢查
var order = _orderRepo.Get(model.out_trade_no);
if (order == null) return Content("fail");
if (Math.Abs(order.Amount - model.total_fee) > 0.01m) {
Log.Warn($"金額不符: 訂單{order.Amount} vs 支付{model.total_fee}");
AlertRiskControl(order.Id, model.total_fee);
return Content("fail"); // 拒絕確認
}
// 3. 幂等性:防止重複處理
if (order.Status == OrderStatus.Paid) return Content("success");
order.MarkPaid(model.trade_no, model.gmt_payment);
_orderRepo.Save(order);
return Content("success");
}