Вылетает программа при работе с 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();