Ошика в фаркарде-это ошибка работы внешнего модуля. Я ,работая с РК7 при помощи фаркардз 5, получал все данные корректно, за исключением бонусов, которые корректно работают только в 6.02
Вид для печати
Ошика в фаркарде-это ошибка работы внешнего модуля. Я ,работая с РК7 при помощи фаркардз 5, получал все данные корректно, за исключением бонусов, которые корректно работают только в 6.02
Параллельно разбираюсь со связью r-keeper и gamekeeper. Т.е. использование gk карт в качестве бонусных на кассах рк. Это работает с farcard 5.07 и R-keeper 7.5.7.65. Причем только с фаркард 5.07 это работает. С 6-ым не работает.
Вложение 5834
Т.е. схема farcard 5.07 + rk 7.5.7 рабочая. Что подкрутить в другой внешней dll чтобы заработало?
Добрый день!
Имеем задачу, схожую с задачей ТС - а именно "подружить keeper с собственной бонусной системой".
Есть farcards, написала dll с необходимыми функциями - farcards подключается, пишет, что dll готова к работе, но как только запускаем кипер и пробуем провести картой (это делает специалист по настройке, не из нашей конторы, я ему попросту отдала dll, поэтому не могу быть уверена, что он верно все настроил со стороны keeper'a) - возвращается ответ "Карта не найдена", логи моей dll не пишутся, из чего делаю вывод, что до ее вызова не доходит. В логах же Farcards имеются следующие строки
Хотелось бы понять, что происходит.Код:call GetCardInfoEx (,,,,,437,1,,,)
code: 12...
Почему не доходит до вызова функций dll?
Почему, судя по логам, из всех параметров функции заполенны только InpLen и InpKind?
Что такое code: 12... ?
Буду благодарна за помощь.
Кипер какая версия?
Надо для начала смотреть, отдается ли в настройках номер карты на Вашу dll.
Версия R-Keeper 7.5 7.75.
По словам тестирующего - при работе с другой библиотекой запрос выглядит так же
, но не выдается код ошибки 12, ф-я отрабатывает.Код:call GetCardInfoEx (,,,,,437,1,,,)
Есть ли возможность увидеть более подробные логи? Или узнать значение кода ошибки 12? Пока непонятно, куда копать...
в farcard.ini в секции [FarServer] прописать параметр Log = 3 (3 это max уровень)
И кстати, FarCard какой версии используется?
Добрый день, у нас возникла проблема с farcards 6.04 .
Мы написали для нее dll - ку .
Метод GetCardInfoEx вызывается , в нем заполняем структуру ,
но Rkeeper не получает ответа от farcards по данным структуры, а только возвращается номер карточки.
лог farcads
28.06.17 14:03:25.014 185.97.112.243, __UNIT01 > QOneCard
28.06.17 14:03:25.014 Card: 1001, Rant: 1, Unit: 1
28.06.17 14:03:25.014 OptKind: 1, Size: 648 -> 1029
28.06.17 14:03:25.014 call GetCardInfoEx(,,,,, InpLen = 1029, InpKind = 1,,,)
28.06.17 14:03:25.014 To cache 1001 1 1 -> 0 0
28.06.17 14:03:25.014 Account: 0, PersonID: 0, Status: Active
28.06.17 14:03:25.014 Balance: 0,00, Discount: 0, Bonus: 0, DiscLimit: 0,00
28.06.17 14:03:25.014 Account: 0, PersonID: 0
28.06.17 14:03:25.029 185.97.112.243, __UNIT01 > CQGetImage
28.06.17 14:03:25.029 Card: 1001, NoDos: 0...
28.06.17 14:03:25.029 ... Packed size: 0
пример кода в методе GetCardInfoEx
Код:int GetCardInfoEx(int64_t Card, int64_t Restaurant, DWORD UnitNo,
Info *info, char *InpBuf, DWORD InpLen, WORD InpKind,
const char *OutBuf, DWORD OutLen, WORD OutKind) {
//loadDataBase();
std::ofstream outfile("loyal.txt");
outfile << "Card: " << Card << std::endl;
outfile << "Restaurant: " << Restaurant << std::endl;
outfile << "UnitNo: " << UnitNo << std::endl;
//if (InpBuf) {
// outfile << "InpBuf: " << InpBuf << std::endl;
//}
outfile << "InpLen: " << InpLen << std::endl;
outfile << "InpKind: " << InpKind << std::endl;
outfile.close();
info->size = 1164;
info->owner_id = 1;
info->card_owner= "Maximus\0";
info->access_amount = 0;
info->bounus_num = 1000;
info->discount_num = 10;
info->acces_amount2 = 0;
info->access_amount3 = 0;
//info->access_amount4 = 0;
//info->access_amount5 = 0;
//info->access_amount6 = 0;
//info->access_amount7 = 0;
info->account_number = Card;
//info->not_pay_type = 2;
//info->max_discount = 1000;
//info->screen_comment = "\0";
//info->comment = "\0";
//info->access_amount8 = 100;
//info->blocked = 0;
//string test2 = "test2";
//info->block_reason = test2.c_str();
//info->deleted = 0;
//info->expired = 0;
//info->manager_confirm = 0;
//info->nedd_withdraw = 0;
info->not_valid = 0;
//info->printer_comment = "\0";
//OutKind = 101;
return 0;
}
все поля разкоменчивали , все равно ничего не меняется.
результат в RKeeper
Вложение 5956
также интересно , что из Ркипера в фаркардс приходит только номер карты,стальные поля не заполняются.
Все приходит там приходит нужно только взять...
Судя по коду вы пишите на Си. Значит и структуры данных у вас описаны типами Си.
Есть различия (по размеру занимаемой памяти) м/у вроде бы одинаковыми типами переменных в Си и Паскале.
FarCard написан на Delphi, соответственно типа дынных Паскалевские.
Я как то пытался это победить (корректно описать структуру типами данных Си) и по итогу плюнул и перевел проект на Delphi. Тогда дело пошло...
Что касается GetCardInfo - проблема у вас такая же. Заполняя структуру вы "промазываете" в памяти и когда эта структура приходит в FC он ее криво разбирает и в итоге криво отображается инфа на кассе.
Спасибо , попробуем побороть, либо попробуем на дельфях )
Все таки что то с приходящей структурой , у нас в скудной документации вот такая структура указана:
Структура, на которую указывает Info:
Word размер структуры = 1164 байт (это поле заполнено при вызове)
Byte Карта существовала, но была удалена
0 - нет, и сейчас есть
1 - да, удалена
Byte Карту надо изъять
0 - нет
1 - да
Byte Истек срок действия
0 - нет
1 - да
Byte Сейчас карта не действует
0 - нет, действует
1 - да, не действует
Byte Нужно ли подтверждение менеджера
0 - не нужно
1 - нужно
Byte Карта заблокирована
0 - нет
1 - да
256 байт Asciiz строка - причина блокировки карты - будет показана на кассе
40 байт Asciiz строка - имя владельца карты
Int64 Идентификатор владельца карты
DWORD Номер счета
DWORD тип неплательщика
Word номер бонуса
Word номер скидки
Int64 предельная сумма скидки, в копейках
Int64 сумма, доступная для оплаты счета, в копейках
Int64 сумма на карточном счете N 2, в копейках
Int64 сумма на карточном счете N 3, в копейках
Int64 сумма на карточном счете N 4, в копейках
Int64 сумма на карточном счете N 5, в копейках
Int64 сумма на карточном счете N 6, в копейках
Int64 сумма на карточном счете N 7, в копейках
Int64 сумма на карточном счете N 8, в копейках
256 байт Asciiz - произвольная информация о карте
256 байт Asciiz - информация для вывода на экран кассы
256 байт Asciiz - информация для распечатки на принтере
Версия RKeeper 6.109
Версия Farcards 6.04
Возможно ли , что эти версии не совместимы по протоколу передачи данных?
Все так. Все совместимо.
Покажите что ли как у вас структура описана в коде...
вот наша структура
Код:struct Info {
//размер структуры = 1164 байт(это поле заполнено при вызове)
WORD size;
//Удалена или нет
BYTE deleted;
//0 - нет, и сейчас есть
//1 - да, удалена
//Карту надо изъять
BYTE nedd_withdraw;
//0 - нет
//1 - да
//Истек срок действия
BYTE expired;
//0 - нет
//1 - да
//Сейчас карта не действует
BYTE not_valid;
//0 - нет, действует
//1 - да, не действует
//Нужно ли подтверждение менеджера
BYTE manager_confirm;
//0 - не нужно
//1 - нужно
//Карта заблокирована
BYTE blocked;
//0 - нет
//1 - да
//256 байт Asciiz строка - причина блокировки карты - будет показана на кассе
char block_reason[256];
//40 байт Asciiz строка - имя владельца карты
char card_owner[40];
//Идентификатор владельца карты
INT64 owner_id;
//Номер счета
DWORD account_number;
//тип неплательщика
DWORD not_pay_type;
//номер бонуса
WORD bounus_num;
//номер скидки
WORD discount_num;
//предельная сумма скидки, в копейках
INT64 max_discount;
//сумма, доступная для оплаты счета, в копейках
INT64 access_amount;
//сумма на карточном счете N 2, в копейках
INT64 acces_amount2;
//сумма на карточном счете N 3, в копейках
INT64 access_amount3;
//сумма на карточном счете N 4, в копейках
INT64 access_amount4;
//сумма на карточном счете N 5, в копейках
INT64 access_amount5;
//сумма на карточном счете N 6, в копейках
INT64 access_amount6;
//сумма на карточном счете N 7, в копейках
INT64 access_amount7;
//сумма на карточном счете N 8, в копейках
INT64 access_amount8;
//256 байт Asciiz - произвольная информация о карте
char comment[256];
//256 байт Asciiz - информация для вывода на экран кассы
char screen_comment[256];
//256 байт Asciiz - информация для распечатки на принтере
char printer_comment[256];
};
Вот размер структуры (в байтах) посчитанный для Дельфей. По итогу складываются нужные 1164 байта.Код:WORD size; 2
BYTE deleted; 1
BYTE nedd_withdraw; 1
BYTE expired; 1
BYTE not_valid; 1
BYTE manager_confirm; 1
BYTE blocked; 1
char block_reason[256]; 256
char card_owner[40]; 40
INT64 owner_id; 8
DWORD account_number; 4
DWORD not_pay_type; 4
WORD bounus_num; 2
WORD discount_num; 2
INT64 max_discount; 8
INT64 access_amount; 8
INT64 acces_amount2; 8
INT64 access_amount3; 8
INT64 access_amount4; 8
INT64 access_amount5; 8
INT64 access_amount6; 8
INT64 access_amount7; 8
INT64 access_amount8; 8
char comment[256]; 256
char screen_comment[256]; 256
char printer_comment[256]; 256
ИТОГО Байт 1164
SizeOf(Info) - у вас сколько покажет? Если не 1164, то тогда проверяйте каждый используемый тип (его длину) через SizeOf().
Си под рукой нету, поэтому сказать точно какой тип данных у вас не того размера не могу. Да еще и от компилятора зависит...
В памяти структура выравнивается соответственно ваша структура 1168 используйте паковку.
Вложение 5978
Реализация в c++ builder
Всем спасибо, да там была трабла со структурой походу и ошибка в одном из типов в методе, не тот тип аргумента ), мы это поправили, но родилась еще проблемка. Строковые переменные все норм приходят, а int-ы только старший байт что ли (тоесть приходит максимальная цифра инта ), хотя мы заполняем вменяемыми суммами.
---------- Добавлено в 14:22 ---------- Предыдущее сообщение было размещено в 12:24 ----------
Теперь работаем с методом TransactionEx И начали понимать в каком типе у нас пролемы идут - Это тип DWORD , в дельфи видимо он другой по размеру , пытаемся его побороть. Каким типом его интерпритировать в C++ его ?
Ну в дельфи DWORD это 4 байта.
Что под это подойдет в Си - вам виднее. Вы же на Си пишите...
Хотя вон в примере Slion - тоже DWORD используется и вроде как ничего...
Специально зарегистрировался чтобы отблагодарить.
СПАСИБО SLion за ExtDll!!!
И Ильину Александру за намек с размером структуры!
И Всем Форумчанам за внимание к данному вопросу!
:drinks:
Народ подскажите. Написал DLL для R-Keeper 6 на Visual Studio 2013. Все работает отлично. Но периодически зависает FarCards. На терминале при этом пишет что-то такое: "нет соединения с сервером карт". Я пробовал заливать пустую DLL, где функции возвращают только 0 и структуру с некоторыми значениями. Но все-равно виснет. В чем может быть дело? :(
Спасибо большое за этот совет, перешел на rTcp.dll и проблема пропала.
Но появилась другая.
У меня в transactionEX тип оплаты всегда приходит 1 из (0...3), а так как у меня бонусы и я поставил скидку 0, то в транзакции и сумма приходит 0, поэтому беру данные из XML о товаре, которое присилает getCardInfoEX. Однако, если я использую "частичную оплату бонусами", то я в XML не вижу каких-либо признаков такой операции, а в транзакции тип по прежнему 1. В чем может быть проблема или что можно попробовать? :(
Подскажите, есть ли возможность передать свое сообщение об ошибке через Farcards на R-Keeper?
Я заполняю поля OutBuff и OutLen, но эффект от этого нулевой - RK выдает свою ошибку вида
Кроме того, непонятно, что писать в поле OutKind?Цитата:
Ошибка NNNN
Персональная дисконтная система(ПДС): Ошибка "Внешняя ошибка выполнения транзакции (kind=7, account=0, Sum=45.0)" (12)
Есть какая-нибудь документация или примеры того, как правильно заполнять эти поля?
где найти инстуркцию по подключению farcards к рк7? на саппорте её нету.
нашёл. на саппорте как и писал выше инструкции нету, но нашёл инструкцию как подключать какую то стороннюю систему, а там уже было показано как настроить фаркардс. я и не знал, что он цепляется через pds_netk.dll.
Здравствуйте!
Подскажите, пожалуйста, как узнать версию FarCards которая стоит на RK 7?
- - - Добавлено - - -
Здравствуйте!
Подскажите, пожалуйста, как узнать версию FarCards которая стоит на RK 7?
А. В логах которые пишет файркард
Б. Если запущен не службой а как десктоп, то на морде в заголовке окна
А куда по дефолту он пишет логи?
Я включаю farcard через CardRetranslate.cmd в котором START /B Farcards.exe /desktop
https://ibb.co/g7zOTU ссылка на скриншот. 6 02 07 это версия?
Да верно. Это номер версии
Доброго времени суток!
кто нибудь может поделиться верной структурой PCardInfo для функции GetCardInfoEx?
описания которые встречал в интернете для FC 4.х а то что есть тут на форуме, привел к такому виду:
type
PTInfo = ^TTInfo;
TTInfo = packed record
size: WORD;
deleted: BYTE;
need_withdraw: BYTE;
expired: BYTE;
not_valid: BYTE;
manager_confirm: BYTE;
blocked: BYTE;
block_reason: Array[0..255] of Char;
card_owner: Array[0..39] of Char;
owner_id: INT64;
account_number: DWORD;
not_pay_type: DWORD;
bonus_num: WORD;
discount_num: WORD;
max_discount: INT64;
access_amount: INT64;
acces_amount2: INT64;
access_amount3: INT64;
access_amount4: INT64;
access_amount5: INT64;
access_amount6: INT64;
access_amount7: INT64;
access_amount8: INT64;
comment: Array[0..255] of Char;
screen_comment: Array[0..255] of Char;
printer_comment: Array[0..255] of Char;
end;
но оно почему то не работает, кто может подсказать?
Доброго времени суток. может кто нибудь подсказать, при проводке карты сумма у нас умножается на 65536. с чем это может быть связано?
FC 6.04 RK 7.6.2.190
есть дикое предположение, что в какой-то момент вместо деления на 0х100 происходит умножение на 0х100, а 65536=0х10000)
Я что то не понял
Вы пишете свою extdll или у вас не заводится какая то готовая?
Какой post???
Если речь про готовую dll то значит она и писалась под 5ю версию.
Если вы разрабатываете сами то писать под FC5 не очень умное решение.
Приветствую, ранее здесь был вопрос о том, что всегда приходит только один вид операции (в TransactionsEx) и в единственном числе. Мой вопрос на ту же тему.
При проведении смешанной оплаты - баллами и рублями - сведения в dll приходят только об одном элементе транзакции, касающемся оплаты баллами и не получаются сведения об оплате наличными. Count при этом всегда равен 1. Вид операции всегда 0 (из 0...3)
Смешанную оплату мы проводим следующим образом.
1. Оплатить
2. Платежные карты
3. ПДС оплата 300 рублей
4. Ввод номера карты/телефона
5. Оплата части суммы имеющимися баллами
6. Оплата оставшейся части наличными.
Если поменять местами последовательность оплат, т.е. сначала заплатить рубли, а потом баллы, то всё равно приходят только сведения об оплате баллами... Что может быть не так?