Насколько я понимаю, у вас есть сайт, который принимает деньги, обработанные через платежный шлюз. Шлюз отправляет уведомление по указанному URL в конце транзакции с результатами транзакции. Затем вы берете эти результаты и обновляете свою систему с новым балансом. Вы опасаетесь, что клиент может вручную вызвать указанный URL-адрес, который дважды уведомляет вашу систему.
Если это так, вот мое предложение:
Ваш платежный шлюз уже должен помешать кому-либо вручную вызывать URL-адреса уведомлений путем имплементации постоянных ключей, которые создаются с использованием данных транзакции, данных вашей учетной записи и закрытого ключа. Во-вторых, вы должны управлять своей базой данных, обновляя и сохраняя свои собственные статусы транзакций.
Например, у вас есть таблица транзакций с полем uniqueid в качестве первичного ключа, суммы, даты / времени, внешнего ключа, связанного с таблицей пользователей, и внешнего ключа, связанного с таблицей состояния. Ваша таблица состояния будет состоять из «inProgress», «Cancelled» и «Complete».
Как только вы отправите транзакцию через платежный шлюз, создайте транзакцию в таблице Transactionns со статусом «inProgress». Когда вы получите уведомление о возврате для обновления вашей системы, запустите следующую логику:
if(returnedStatus == "Completed" && status = "inProgress")
(
status = "Completed";
//update balance
)
elseif(returnedStatus == "Cancelled" && status != "Completed"))
{
status = "Cancelled";
//display cancelled message
}
Это обновит баланс счета, если транзакция все еще выполняется, не обновит учетную запись, если она уже сделана, и ничего не изменит с балансом счета, если она была отменена по какой-либо причине.
PS: есть шутка на monsterpay в качестве шлюза www.monsterpay.com