feat(pally): support customer-pays-fees scenario with BalanceAmount validation
This commit is contained in:
@@ -51,8 +51,8 @@ async def pally_callback(
|
||||
|
||||
logger.info(
|
||||
"Pally webhook received - InvId: %s, OutSum: %s, Commission: %s, TrsId: %s, Status: %s, "
|
||||
"CurrencyIn: %s, custom: %s, SignatureValue: %s",
|
||||
InvId, OutSum, Commission, TrsId, Status, CurrencyIn, custom, SignatureValue
|
||||
"CurrencyIn: %s, custom: %s, BalanceAmount: %s, SignatureValue: %s",
|
||||
InvId, OutSum, Commission, TrsId, Status, CurrencyIn, custom, BalanceAmount, SignatureValue
|
||||
)
|
||||
|
||||
# Enhanced logging for failed payments
|
||||
@@ -105,15 +105,43 @@ async def pally_callback(
|
||||
return "OK"
|
||||
|
||||
try:
|
||||
amount = int(float(OutSum))
|
||||
|
||||
# Validate payment amount
|
||||
if bill.amount != amount:
|
||||
logger.error(
|
||||
"Amount mismatch for bill %s (TrsId: %s) - Expected: %s, Received: %s",
|
||||
bill.id, TrsId, bill.amount, amount
|
||||
# Handle fee scenarios: use BalanceAmount if available (net amount after fees),
|
||||
# otherwise use OutSum (gross amount paid by customer)
|
||||
if BalanceAmount is not None:
|
||||
# Customer pays fees - BalanceAmount is the net amount credited to merchant
|
||||
credited_amount = int(float(BalanceAmount))
|
||||
gross_amount = int(float(OutSum))
|
||||
|
||||
logger.info(
|
||||
"Customer-pays-fees payment: bill_id=%s, expected=%s, gross_paid=%s, net_credited=%s",
|
||||
bill.id, bill.amount, gross_amount, credited_amount
|
||||
)
|
||||
return "OK"
|
||||
|
||||
# Validate that the net credited amount matches our bill amount
|
||||
if bill.amount != credited_amount:
|
||||
logger.error(
|
||||
"Net amount mismatch for bill %s (TrsId: %s) - Expected: %s, Net credited: %s, Gross paid: %s",
|
||||
bill.id, TrsId, bill.amount, credited_amount, gross_amount
|
||||
)
|
||||
return "OK"
|
||||
|
||||
amount = credited_amount # Credit the net amount (without fees)
|
||||
|
||||
else:
|
||||
# Standard payment - OutSum should match bill amount exactly
|
||||
amount = int(float(OutSum))
|
||||
|
||||
logger.info(
|
||||
"Standard payment: bill_id=%s, expected=%s, received=%s",
|
||||
bill.id, bill.amount, amount
|
||||
)
|
||||
|
||||
if bill.amount != amount:
|
||||
logger.error(
|
||||
"Amount mismatch for bill %s (TrsId: %s) - Expected: %s, Received: %s",
|
||||
bill.id, TrsId, bill.amount, amount
|
||||
)
|
||||
return "OK"
|
||||
|
||||
logger.info("Processing payment: bill_id=%s, user_id=%s, amount=%s",
|
||||
bill.id, bill.creator_id, amount)
|
||||
|
||||
Reference in New Issue
Block a user