Интеграция с ПО UPOS через библиотеку PILOT_NT. 1.0 Платформа Win32.

- Титульная страница
- Группы
- Структуры данных

Выполнение платежа с аварийной отменой
Расширенный функционал

В случае, если внешняя программа не обеспечивает гарантированной печати банковского чека, она может использовать следующую логику:

1. Выполнить функцию Оплата.
2. После успешного завершения оплаты, вызвать функцию Приостановить транзакцию и приступить к печати чека.
3. Если чек напечатан успешно, вызвать функцию Зафиксировать транзакцию.
4. Если во время печати чека возникла неустранимая проблема, вызвать функцию Откатить транзакцию для отмены платежа.
5. Если в ходе печати чека произойдет зависание ККМ или сбой питания, то транзакция останется в «подвешенном» состоянии. При следующем сеансе связи с банком она автоматически отменится.

Для корректного выполнения операций с функцией аварийной отмены необходимо придерживаться следующих правил:

1. Функция Приостановить транзакцию должна вызываться, только если оплата завершилась успешно – если возвращен код ответа 0.
2. Если вызов функции Приостановить транзакцию завершился ошибкой, операция должна считаться не выполненной, Откатить транзакцию или Зафиксировать транзакцию не должны вызываться. Если необходимо отменить операцию – то только ручной обработкой через письмо в банк с пояснением ситуации и приложением имеющихся документов. Причинами ошибок при выполнении функции Приостановить транзакцию могут быть:
   1. Не верная сумма операции (см. п 4.);
   2. Отсутствие связи с пинпадом;
   3. Ошибки в системном ПО пинпада (например, сбой файловой системы).
3. Функции Зафиксировать транзакцию или Откатить транзакцию должны вызываться, только если был успешный вызов Приостановить транзакцию.
4. В функции Приостановить транзакцию, Зафиксировать транзакцию, Откатить транзакцию обязательно должна передаваться корректная сумма операции.
5. Если касса работает по описанному выше алгоритму и функция Зафиксировать транзакцию вернет ошибку – откатываем операцию на кассе, товар не отдаем, если клиент считает, что деньги списаны – предлагаем клиенту написать претензию или сами пишем в Сбербанк с просьбой отменить операцию.
6. Если касса работает по описанному выше алгоритму и функция Откатить транзакцию вернет ошибку – необходимо обратиться в Сбербанк с информацией об операциях (чеки, контрольные ленты) c просьбой отменить эту операцию.
7. Авариная отмена предназначена только для операции «Оплата».

Например:

//оплата на 10 руб (1000 коп).
auth_answer aa;
memset(&aa, 0, sizeof(aa));
aa.TType=OP_PURCHASE;
aa.Amount=1000;
carderr=card_authorize(NULL, &aa);
if (carderr==0){
carderr = SuspendTrx(1000, NULL);
//если carderr!=0, считаем операцию не выполненной,
//CommitTrx() или RollbackTrx() не вызываем товар не отдаем, если клиент считает,
//что деньги списаны, предлагаем клиенту написать претензию или сами пишем в
//Сбербанк с просьбой отменить операцию
if (действия кассы по печати чека, сохранению операции и т.п. успешны){
if (carderr==0){
carderr=CommitTrx(1000, NULL);
if (carder!=0){
//Отменяем операцию на кассе, товар не отдаем, если клиент считает,
//что деньги списаны, предлагаем клиенту написать претензию или сами пишем в Сбербанк с просьбой отменить операцию
}
}
//если carderr!=0, то подтверждать не надо, т.к. suspend отработал с ошибкой.
}else{
// действия кассы по печати чека, сохранению операции и т.п. НЕ УСПЕШНЫ
if (carderr==0){
carderr=RollbackTrx(1000, NULL);
if (carderr!=0){
//пишем письмо в Сбербанк с просьбой отменить эту операцию
}
}else{
//пишем письмо в Сбербанк с просьбой отменить эту операцию (см. п.2)
}
}
}
//Не забываем освободить поле auth_answer::Check
if (aa.Check)
::GlobalFree((HGLOBAL)aa.Check);