Под nginx есть хороший модуль
Secure link позволяющий делать и проверять ссылки с подписью и ограниченным временем жизни.
Получив сигнал от платёжной системы о завершении платежа, генерить индивидуальную ссылку для купившего и передавать ему по почте. Ставить время жизни ссылки, например, на 2 часа.
Похожий сценарий можно развернуть на Amazon Web Services: S3 + CloudFront, который поддерживает
подписанные ссылки с ограниченным временем жизни.