Разделите доступ и уведомление

Храните право на скачивание отдельно от письма покупателю. Повторное событие оплаты должно находить существующий доступ, а не создавать ещё одну лицензию. Это предлагаемый подход, а не подтверждённая функция Web3Cart.

Задайте устойчивый ключ

Создайте уникальный ключ из магазина, позиции заказа и типа доступа. Выдавайте доступ только после проверки оплаты по настроенной политике. Уникальность должна обеспечиваться базой данных: проверка перед вставкой сама по себе не исключает гонку двух процессов.

Восстановление после сбоя

Если письмо не отправилось после создания доступа, повторите уведомление с прежней записью. Разделите состояния доступа и письма. Не записывайте секретные ссылки в обычные журналы; противоречивые ссылки на заказ или платёж отправляйте на проверку.

Проверьте последовательность

Повторите подтверждённое событие, отправьте две копии одновременно и смоделируйте сбой письма. Должен остаться один доступ. Непроверенное событие не должно выдавать доступ. Зафиксируйте ожидаемый и фактический результат.