Вылетает программа при работе с pilot_nt.dll от Сбербанка

Занимаюсь интеграцией эквайрингового терминала от Сбербанк в ИС с помощью библиотеки pilot_nt.dll. В рамках ИС есть два варианта оплаты: оплата услуги и покупка подарочного сертификата. В первом случае все работает, как часы. Но при покупке сертификата программа проходит всю процедуру до конца, а после этого внезапно вылетает. После этого в выводе появляется следующее:

Необработанное исключение типа "System.Windows.Markup.XamlParseException" в WindowsBase.dll Переполнение или потеря точности в арифметической операции.

Код вызывается следующей строчкой:

    PayByAcquiring((int)PendingPayment.Cost * 100)

А вот основные методы:

    public static bool PayByAcquiring(int amount)
    {
        try
        {
            var authAnswer = Authorization(amount);
            SuspendTransaction(amount);
            CommitTransaction(amount);
            return true;
        }

        catch (Exception ex)
        {
            appUtils.sendWarning(ex.Message);
            return false;
        }
    }

    public static AuthAnswer13 Authorization(int amount)
    {
        var authAnswer = new AuthAnswer13
        {
            ans = new AuthAnswer
            {
                TransactionType = TransactionType.Purchase,
                Amount = amount,
            }
        };

        authAnswer = Authorization(authAnswer, null);
        return authAnswer;
    }

    static AuthAnswer13 Authorization(AuthAnswer13 answer, string track2)
    {
        CheckError(() => Pilot.CardAuthorize(track2, ref answer));

        var slip = GlobalFree(answer.ans);
        Trace.WriteLine(slip);
        return answer;
    }

    private static void CheckError(Func<int> action)
    {
        var errorCode = action();
        if (IsSpasiboFirstCall((int)errorCode))
            return;

        if (errorCode != SUCCESS)
        {
            switch (errorCode)
            {
                case USER_CANCEL:
                    throw new Exception("Клиент отказался от выполнения операции");
                case TIMEOUT_CANCEL:
                    throw new Exception("Истек период ожидания рекции клиента");
                case NOPINPAD:
                    throw new Exception("Терминал не подключен. \nПроверьте кабели, ведущие к терминалу и перезагрузите терминал.");
                case CARD_DATE_ERROR:
                    throw new Exception("Срок действия карты истек");
                case CARD_EXTRACTED:
                    throw new Exception("Карта преждевременно извлечена. \nПопробуйте провести операцию еще раз еще раз");
                case TIMEOUT_CANCEL_PINPAD:
                    throw new Exception("Превышено время ожидания операции от терминала");
                case PIN_CODE_DISABLE:
                    throw new Exception("Пин код карты заблокирован");
                case OUT_OF_MONEY:
                    throw new Exception("Недостаточно средств");
                default:
                    throw new Exception("При оплате произошла ошибка c с кодом " + errorCode);
            };
        }    
    }

    static bool GlobalFree(AuthAnswer answer)
    {
        string checkStr = Marshal.PtrToStringAnsi(answer.Cheque);

        if (checkStr != null)
        {
            var ss =  Pilot.GlobalFree(answer.Cheque);
            TestPinPad();              
        }

        return true;
    }

    public static int TestPinPad()
    {
        int result = Pilot.TestPinpad();
        return result;
    }

    public static void SuspendTransaction(int amount)
    {
        CheckError(() => Pilot.SuspendTransaction(amount, null));
    }

    public static void CommitTransaction(int amount)
    {
        CheckError(() => Pilot.CommitTransaction(amount, null));
    }

    [DllImport("kernel32.dll")]
    internal static extern IntPtr GlobalFree(IntPtr hMem);

    [DllImport("pilot_nt.dll", EntryPoint = "_card_authorize13", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int CardAuthorize(string track2, ref AuthAnswer13 authAnswer);

    [DllImport("pilot_nt.dll", EntryPoint = "_SuspendTrx", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int SuspendTransaction(int amount, string track2);

    [DllImport("pilot_nt.dll", EntryPoint = "_CommitTrx", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int CommitTransaction(int amount, string track2);

    [DllImport("pilot_nt.dll", EntryPoint = "_TestPinpad", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int TestPinpad();

Ответы (0 шт):