Когда очищать корзину пользователя в своем движке интернет магазина?
Первое: оплата и подтверждение
Нужно работать адекватно с подтверждением оплаты
вы когда передаете данные заказа, то вы кодируете данные одним ключем
банк раскодирует и потом кодирует вторым ключем и вы уже при подтвержддении их раскодируете также вторым ключем их и смотрите -- какой заказ подтвердил банк 
Все платежки, которые я знаю работают по такому принципу:
- выдаются 2 ключа
- туда отправляете данные -- одним кодируете
- полученные данные вторым раскодируете
- в полученных данных есть номер заказаВторое: очистка корзины
Очищайте корзину сразу после принятия заказа и записывайте заказ в заказы (что логично)
А оплачен заказ или нет -- другая история, у пользователя в случае ошибки оплаты просто будет не оплаченный заказ
Если нужно что-то напомнить -- напоминайте. У вас, мол, не оплачен заказ, оплатите, пока есть на месте товары
У вас должна быть отдельная сущность - заказ, которых много, у которых есть статус - не оплачен, оплачен, доставлен и т.п. в момент, когда вы нажимаете оплатить - все содержимое корзины должно переехать в новый заказ а корзина очиститься.
Если пользователю понадобится, дайте ему возможность открыть историю заказов и при необходимости набрать корзину заново (или повторно оплатить, если статус - отказ/ошибка/отмена).