То, что в СМС пишут, не всегда реально коррелирует с типом транзакции. Ну то есть коррелирует, но шаблон для текста может не отражать всю реальную суть транзакции. Это на усмотрение банка.
Диспенсер выдал 10 купюр аккуратной стопочкой, злоумышленник тихонько вытягивает купюру из середины стопки, банкомат ждёт 45 секунд, сжирает назад стопку и отправляет ее в отстойник. Автореверс генерится в ту же минуту. Злоумышленник стал богаче на номинал купюры.
Банки не среагируют до инкассации (пока не сравнят количество оставшихся купюр в кассетах с тем, сколько у них должно быть по учетной системе). Тогда уже поднимаются логи, начинаются разборки: где и кто накосячил.
Есть 2 варианта проверки PIN-а для EMV-чипа: офлайновый и онлайновый. На POS-терминалах до определенной суммы обычно (либо от настроек терминала) проверяют офлайновый пин. На транзакциях с ATM обычно настраивают сразу онлайновую проверку PIN-а.
Кароч, всё зависит от того, что эмитент прошил в данные EMV-карты, настроек POS-терминала/ATM-терминала, настроек эквайера. И все это регулируется хотелками эквайера/эмитента в рамках правил и рекомендаций, навязанных сверху платежной системой.
Ну вот такой кейс: клиент хочет снять 3000 рублей, банкомат посылает фронту в банке данные, фронт считает (обычно он сам ведет учет купюр в кассете), что в ней купюр достаточно (а на самом деле по какой-то причине там уже пусто) и говорит банкомату: отдай клиенту столько-то купюр из такой-то кассеты. Диспенсер банкомата обнаружил, что бабло клиенту не выдано. Тогда банкомат говорит фронту: Reversal. А фронт-то уже до этого посчитал, что транзакция успешна, даже смс-ку ему послал. Вот он и проводит откат транзакции с попутной отсылкой новой смс-ки.
Есть три типа операций по возврату: Reversal (та, что в статье, предусмотрена для возврата средств на карту в случае, если, например, диспенсер в АТМ по каким-то причинам не смог отдать валюту), Unhold (разморозка средств на счету для транзакций с предавторизацией, обычно применяется в интернет-магазинах в ситуациях, когда, например, клиент ввел реквизиты карты при оплате товаров, а потом ему позвонил менеджер из магазина, и клиент отказался от части товаров) и Refund (полноценная транзакция по возврату денег на счет клиента после того, как они уже были списаны с него).
Reversal — выполняется в онлайне, остальные две — в офлайне.
Проблема в том, что транзакции снятия денег и reversal выполняются у эквайера, а эмитент только исполняет, что ему пришло от МПС. В результате он теряет деньги. И если у эквайера криво настроено сопоставление (например, позволяется посылка с POS-терминала reversal транзакции, выполненной на ATM), то имеем такую ситуацию.
В России находятся 2 компании из крупнейших разработчиков ПО для процессинга (OpenWay, BPC), ещё есть компании, которые разрабатывают POS-терминалы (Inpas), ещё есть в банках персонал, работающий с процессингом. Так что людей, знающих протоколы платежных систем, гораздо больше 20.
Для существующих богачей вряд ли такое возможно в обозримом будущем (во всех тканях клетки надо будет заменять). А вот, свежесозданный индивид, клетки (не только раковые и стволовые) которого не будут подвержены пределу Хейфлика, это уже можно ожидать в ближайшем времени.
Вот код ed и sed из Version 7 UNIX. От современного C отличий мало и отлично читается. Более того, этот код с минимальными исправлениями соберется на современном тулчейне(gnu-make,binutils,gcc).
О, кстати. У нас тут через JMS передаются объекты (в основном byte[], String и классы, отнаследованные от пары интерфейсов). Что из быстрого использовать вместо сериализации?
Кароч, всё зависит от того, что эмитент прошил в данные EMV-карты, настроек POS-терминала/ATM-терминала, настроек эквайера. И все это регулируется хотелками эквайера/эмитента в рамках правил и рекомендаций, навязанных сверху платежной системой.
Reversal — выполняется в онлайне, остальные две — в офлайне.
В принципе-то и ладно, пусть накапливаются для начала. И так уже будет сильный прорыв в долголетии.
Ссылка на оригинальную статью: https://drj11.wordpress.com/2013/09/01/on-compiling-34-year-old-c-code/