В настоящее время я веду переговоры по этому вопросу с PayPal.
Дело в том, что иногда вы получаете такую последовательность сообщений:
- Завершено (продажа)
- Перевернуто (жалоба покупателя)
Иногда вы получаете это:
- Завершено (продажа)
- Возврат (покупатель пожаловался вам, а вы вернули без «официальной» жалобы)
Иногда вы получаете это:
- Завершено (продажа)
- Перевернуто (жалоба покупателя)
- Возвращено (вы вернули после жалобы)
Таким образом, если PayPal не согласится внедрить мое решение, чтобы всегда отправлять Canceled_Reversal перед возвратом в последнем примере (как это было несколько лет назад), или не предложит другое решение, которое обеспечит определенную уверенность в этом вопросе, вам нужно использовать свои собственные механизмы, чтобы не считать счет дважды.
Если вы храните транзакции в БД, из моего POV может быть довольно убедительно:
if (($stat == 'Refunded' || $stat == 'Reversed') && !empty($_POST['parent_txn_id']))
{
$sum = $db->query('SELECT SUM(`mc_gross`) FROM `transactions` WHERE `parent_txn_id`= ?', $_POST['parent_txn_id'])->fetchColumn();
if ($sum && $sum < 0) {
// already had reversed/refunded call,
// ignore this one
}
}