Используем KKM Server API для печати чека. Как правильно подключиться к системе KKM. Ниже привели пример кода который используем, нашли его в примере API на официальном сайте KKM. При его запуске печатается аннулированный чек без товара. Так же не печатается QR код Печать производится по нажатию на кнопку: ``` <button class="btn btn-danger" onclick="RegisterCheck(1, 1, 1);">Печать чека</button> ``` Вот код обработчика: ``` function ExecuteSuccess(result) { $('#kkm-result').html(JSON.stringify(result)); } // Печать чека function RegisterCheck(NumDevice, TypeCheck, IsBarCode, Print) { // Подготовка данных команды, параметры (TypeCheck = 0, NumDevice = 0, InnKkm = "", CashierName = "") var Data = KkmServer.GetDataCheck(TypeCheck, NumDevice, "", "Kазакова Н.А.", "430601071197"); Data.NumDevice = NumDevice; Data.InnKkm = ""; Data.KktNumber = ""; Data.Timeout = 30; // Это фискальный или не фискальный чек Data.IsFiscalCheck = true; // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) Data.TypeCheck = TypeCheck; // Не печатать чек на бумагу Data.NotPrint = false; //true, // Количество копий документа Data.NumberCopies = 0; // Продавец, тег ОФД 1021 Data.CashierName = "Kазакова Н.А."; // ИНН продавца тег ОФД 1203 Data.CashierVATIN = "430601071197"; Data.ClientAddress = "sochi@papa.com"; Data.ClientInfo = "Везучий В.В. РЕ-125486"; Data.ClientINN = "502906602876"; Data.SenderEmail = "sochi@mama.com"; Data.PlaceMarket = "kkmserver.ru"; Data.TaxVariant = ""; // Дополнительный реквизит пользователя тег ОФД 1084 Data.UserAttribute = { // Наименование дополнительного реквизита пользователя тег ОД 1085 Name: "Поле-тест", // Значение дополнительного реквизита пользователя тег ОФД 1086 Value: "Тестовое значение" }; // Дополнительный реквизит чека тег 1192 Data.AdditionalAttribute = "Тест"; Data.KPP = "782543005"; Data.PayByProcessing = false; //В тестовом чеке автоматический эквайринг выключен // Номер устройства для эквайринга - Null - из настроек на сервере, 0 - любое, число - номер конкретного устройства Data.NumDeviceByProcessing = null; // Номер чека для эквайринга Data.ReceiptNumber = "TEST-1"; // Печатать Слип-чек после чека (а не в чеке) PrintSlipAfterCheck = false; // Печатать Слип-чек дополнительно для кассира (основной слип-чек уже будет печататся в составе чека) Data.PrintSlipForCashier = true; //Если это чек возврата то возможны два поля для отмены транзакции (если не указано то по эквайрингу будет не отмена а возврат оплаты) Data.RRNCode = ""; // RRNCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! Data.AuthorizationCode = ""; // AuthorizationCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! // Добавление признаков агенте и поставщика Data.AddDataAgent( 2, // Операция платежного агента тег 1044 "95315", // Телефон платежного агента тег 1073 "+79995554422", // Телефон оператора по приему платежей тег 1074 "+72223334455", // Телефон оператора перевода тег 1075 "+74447776655", // Наименование оператора перевода тег 1026 "ООО Тестовая организация", // Адрес оператора перевода тег 1005 "Москва, зубовский бульвар 44", // ИНН оператора перевода тег 1016 "430601071197", // Телефон поставщика тег 1171 "+76662229955" ); // Добавление печати текста по полям //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ Data.AddTextString(">#2#<ООО \"Рога и копыта\"", 1); // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая Data.AddTextString("<<->>"); Data.AddTextString("Пример №1:<#10#>154,41"); Data.AddTextString("2-рое поле:<#10#>4,00"); Data.AddTextString("<<->>"); Data.AddTextString("Пример №2:<#8#>>4,00"); Data.AddTextString("2-рое поле:<#8#>>1544,00"); Data.AddTextString("<<->>"); Data.AddTextString("Шрифт № 1", 1, 15); Data.AddTextString("Шрифт № 2", 2, 10); Data.AddTextString("Шрифт № 3", 3, 5); Data.AddTextString("Шрифт № 4", 4, 15); Data.AddTextString("<<->>"); // Добавление печати фискальной строки var DataStr = Data.AddRegisterString( // НаименованиеТовара(64 символа) "Сапоги женские DF-3099-1", // Количество (3 знака после запятой) 1, // ЦенаБезСкидки (2 знака после запятой) 1, // СуммаСтроки (2 знака после запятой) 0.01, // СтавкаНДС(0(НДС 0%), 10(НДС 10%), 20(НДС 20%), -1(НДС не облагается), 120 (НДС 20/120), 110 (НДС 10/110)) -1, // Отдел 0, // Код товара EAN13 - не обязательно "1254789547853", 4, 1, "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM", // Единица измерения предмета расчета. Можно не указывать "пара", // Цифровой код страны происхождения товара (CountryOfOrigin) в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230 "156", // Регистрационный номер таможенной декларации (CustomsDeclaration) 32 симв. Тег 1231 "54180656/1345865/3435625/23", // Сумма акциза (ExciseAmount) с учетом копеек, включенная в стоимость предмета расчета Тег 1229 0.01, // Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 ! "Тест-доп.реквизит" ); // DataStr.EGAIS = { // Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V", // Ean: "3423290167937", // Volume: 0.7500, // }; Data.AddAgentSign(2); // Добавляет в последнею строку данные агента (не обязательно) Data.AddAgentData( // Операция платежного агента тег 1044 "95315", // Телефон платежного агента тег 1073 "+79995554422", // Телефон оператора по приему платежей тег 1074 "+72223334455", // Телефон оператора перевода тег 1075 "+74447776655", // Наименование оператора перевода тег 1026 "ООО Рога и копыта", // Адрес оператора перевода тег 1005 "Москва, зубовский бульвар 44", // ИНН оператора перевода тег 1016 "430601071197" ); // Добавляет в последнею строку данные поставщика (не обязательно) Data.AddPurveyorData( // Телефон поставщика тег 1171 "+76662229955", // Наименование поставщика ОФД 1225 "ООО 'Гаражик в деревне'", // ИНН поставщика тег 1226 "430601071197" ); // Добавление печати штрихкода // Data.AddBarcodeString(ТипШтрихКода ("EAN13", "CODE39", "CODE128", "QR", "PDF417", "1254789547853"), ШтрихКод); Data.AddBarcodeString("EAN13", "1254789547853"); Data.AddTextString("<<->>"); Data.AddTextString("Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", 4, 0); // Добавление печати еще одной фискальной строки Data.AddRegisterString("Шаровары мужские красные: НИМБУС-2000", 1, 1, 0.01, 1, 1, "1254789547853", 1, 1); // Добавляет в последнею строку Код товарной номенклатуры Data.AddGoodCodeData("02", "04630037591316", "sgEdK2y5"); // Наличная оплата (2 знака после запятой) Data.Cash = 100; // Сумма электронной оплаты (2 знака после запятой) Data.ElectronicPayment = 0.01; // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) Data.AdvancePayment = 0; // Сумма постоплатой(в кредит) (2 знака после запятой) Data.Credit = 0; // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) Data.CashProvision = 0; //#if Relese // Скидываем данные об агенте - т.к.у Вас неверняка ККТ не зарегистрирована как Агент. Data.AgentSign = null; Data.AgentData = null; Data.PurveyorData = null; //#endif for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings != undefined && Data.CheckStrings.Register != undefined) { Data.CheckStrings.Register.AgentSign = null; Data.CheckStrings.Register.AgentData = null; Data.CheckStrings.Register.PurveyorData = null; }; }; } ```
Ну судя по всему, вот тут Все же не единички надо (по крайней мере 2 первых параметра точно) а необходимые реквизиты, в частности номер устройства и тип чека... Ну и в остальное не вникал - надеюсь нужные параметры не из тестового примера а вы свои реальные и подставили.... Ну и к php вопрос вообще не имеет отношения
1. В логах посмотри нет ли ошибок 2. Для печати фискального чека в настройках устройства должен быть выбран параметр фискализации. Для тестов там есть режим печати нефискального чека --- Добавлено --- всё же скорее всего единички. Что тип чека, что номер устройства - целочисленные значения --- Добавлено --- Код (Text): Data.ClientAddress = "sochi@papa.com"; Data.ClientInfo = "Везучий В.В. РЕ-125486"; Data.ClientINN = "502906602876"; Это убирай. Это данные только для выигрышей, лотерей и тд. --- Добавлено --- А ещё - тип чека 1 - это чек возврата. Он может быть аннулирован в том случае, если в ККМ нет денег, т.е. не было продаж --- Добавлено --- Код (Text): // Наличная оплата (2 знака после запятой) Data.Cash = 100; // Сумма электронной оплаты (2 знака после запятой) Data.ElectronicPayment = 0.01; не все кассы умеют одновременно и наличными, и кешем принимать --- Добавлено --- Данные о поставщике я бы тоже убрал. И вообще половину данных ненужных.
Номер устройства это не какой-то номер устройства на компе, а порядковый номер подключённого к KKMServer устройства. Начинается с единицы. Чаще всего к серверу подключается только одна ККМ --- Добавлено --- И к тому же, если чек аннулирован - значит касса его всё же пыталась обработать