Последнее изменение статьи 04.04.2026

СберСпасибо работает в одно прикладывание карты. Для списания бонусов гостю надо только оплатить заказ и согласиться на списание бонусов, повторно прикладывать карту не надо.

Подключение терминала

Прием платежей по банковским картам производится через терминал авторизации. Произведите предварительную настройку терминала:

  1. Установите драйвер самого терминала (его можно найти на сайте продавца или производителя)
  2. Получите от представителей Сбера требуемое ПО (как правило, при заключении договора представитель Сбера сразу производит установку терминала и дополнительного ПО, но также можно обратиться в отдел обслуживания по предоставленным в договоре контактам)
  3. Обратитесь к сотруднику Сбера для выставления настройки Возвращать промежуточный код ответа
  4. В корне рабочего каталога в pilot_nt.dll в файле pinpad.ini укажите COM-порт терминала (номер COM-порта можно посмотреть в диспетчере устройств)

Установка и конфигурирование Farcards и ExtSpasiboPurchase.dll

Установка сертификата для работы с ПЦ

Представителями Сбера будут выданы сертификаты, отдельные для каждой точки подключения. Их необходимо установить. 

Мы разберем установку для ОС Windows 10. Пути к сертификатам и названия файлов сертификатов могут отличаться.

Установка корневых и промежуточных сертификатов:

  1. Перейдите к корневым и промежуточным сертификатам. Нажмите правой кнопкой мыши на сертификате и выберите Установить сертификат

  2. Выберите расположение хранилища, куда будет установлен сертификат

  3. Для каждого сертификата выберите соответствующее сертификату хранилище

  4. Нажмите Готово для завершения импорта сертификата.
  5. Дождитесь подтверждения импорта.

Готово. Повторите процесс для каждого предоставленного Сбером сертификата.

Установка личного сертификата:

  1. Перейдите к личным сертификатам. Нажмите правой кнопкой мыши на сертификате и выберите Установить PFX
  2. Выберите расположение хранилища, куда будет установлен сертификат
  3. Выберите файл сертификата
  4. Укажите пароль, предоставленный Сбером и нажмите Далее
  5. Хранилище сертификатов для данного сертификата выбирать не надо, система определит его автоматически
  6. Нажмите Готово и завершите импорт.

Настройка Farcards

Для работы Спасибо необходим установленный Farcards. Он может быть установлен на отдельном компьютере или на том же, что и кассовый сервер.
Подробную инструкцию по установке FarCards можно найти в статье установка и настройка системы ПДС

  1. Скачайте актуальную версию ExtSpasiboPurchase по ссылке https://files-rkcloud.ucs.ru/d/65231391cff842d49a1a/?p=/rk7/other/Spasibo&mode=list
  2. Распакуйте сборку и скорректируйте содержимое в соответствии с настройками своего ПК:
  3. FARCARDS.ini

    [FarServer]
    Type = 1
    DLL = .\ExtSpasiboPurchase.dll
    Log = 10
    XMLCP=1251
     
    [LinkDLL]
    1 = pds_netk
     
    [pds_netk]
    NetServerName = Spasibo
    ininame=netk.ini
    DebugMessages=1
    D


  4. Также скопируйте в этот каталог файл с сертификатом .pfx, предоставленный Сбером.

Настройка конфигурационного файла appsettings.json

Перед настройкой необходимо знать:

  • PartnerId — идентификатор ТСП (юр.лица) в ПЦ
  • TerminalId — внешний идентификатор терминала
  • ServicePointExtId — внешний идентификатор торговой точки
  • NetworkId — идентификатор Сети в ПЦ
  • URL — URL сервера.
Если эти данные отсутствуют, то их необходимо запросить у Сбера.

Настройка appsettings.json:

appsettings.json

{
 
  "Spasibo": {
    "Url": "URL сервера",
 
    //Идентификатор ТСП (юр.лица) в ПЦ, осуществляющего продажу
    "PartnerId": "Идентификатор ТСП (юр.лица) в ПЦ",
 
 
    "Terminal": "Внешний идентификатор терминала",
    "ServicePointExtId": "Внешний идентификатор торговой точки",
 
    //Идентификатор Сети в ПЦ.
    "Network": "Идентификатор Сети в ПЦ",
    "CertPassword": "Пароль сертификата",
    "CertFile": "Имя файла с сертификатом .pfx",
 
    // Общий таймаут каждой операции FarCards лояльности СПАСИБО в мс
    "OperationTimeout": 30000,
 
    //Период выгрузки очередей, с
    "QueueFlushPeriod": 60,
 
    //Cписок кодов ошибок HTTP status code, по которым должна выполняться перепосылка запросов в RESTful-сервисы
    "RestRetryErrors": [ "500", "503", "504", "422 PURCHASE_STATUS_NOT_VALID" ],
 
 
 
    // необязательное переназначение терминалов на код станции. Если не удалось найти соответствие, то берется из параметра Terminal
    "Terminals": {
      "TerminalName1: [ 8, 9 ],
      "TerminalName2": [ 10, 11 ]
    },
 
    // необязательное переназначение . Если не удалось найти соответствие, то берется из параметра ServicePointExtId
    "ServicePoints": {
      "ServicePoint1": [ 199990111],
      "ServicePoint2": [ 199990112]
    }
 
  },
 
 
  "Config": {
    //код валюты "Спасибо"
    "SpasiboPayCode": 126,
 
    //Международный ISO-код валюты чека (810 - Российский рубль)
    "Currency": "810",
 
 
    //Если задан, то использовать код документа, отличный от по-умолчанию 101
    "PrintDocumentCode": 101
  }
}
JSON

Настройки в менеджерской r_keeper

Добавление устройства "Spasibo from Sberbank"

В конфигурацию кассового сервера добавьте устройство Spasibo from Sberbank со следующими настройками:

где PDS Server Name — имя, которое назначили NetServerName, настраивая FARCARDS.ini:

Настройка интерфейса

В справочнике Интерфейсы проверьте, что устройство Spasibo from Sberbank выбрано для предустановленного интерфейса СберСпасибо.

Создание MCR-алгоритма

Создайте и настройте MCR-алгоритм:

  • В качестве Объекта назначьте предустановленный интерфейс СберСпасибо (код 129)
  • В качестве Скрипта укажите:
    function MCR1001331(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
    begin
      Result := (pos('SBRF:', Parameter) = 1) and (length(Parameter) > 6);
      if Result then begin
        delete(Parameter, 1, 5);
        if Parameter[1] = 'H' then
          delete(Parameter, 1, 1);
      end;
    end;
    JSON


Настройка драйвера терминала авторизации

  • Path to pilot_nt  путь до каталога с ПО Сбербанка (пусть установки терминала)
  • Log level  при наличии проблем с работой можно выводить полный лог для локализации, но при нормальной работе рекомендуется указывать только ошибки
  • RemindLoyalty — установите значение WithPayPass
  • Остальные параметры настраиваем, как указано на рисунке:
Важно! В настройках самого терминала необходимо включить прерывание 4353. Для этого необходимо обратиться к сотрудникам банка.

В качестве модуля у принтера укажите Sberbank Pilot POS terminal driver (XML) #1.

В свойствах кассы Терминалу авторизации назначьте принтер устройства банковского терминала.

В свойствах валюты для оплаты банковской картой поставьте флаг Использовать терминал и укажите назначение терминала авторизации.

Создание валюты для оплаты бонусами СберСпасибо

Для оплаты бонусами СберСпасибо надо создать отдельную валюту, в свойстве Интерфейс которой указать предустановленный интерфейс СберСпасибо (код 129)

Добавление скрипта в формы

Использовать списание бонусов можно как в быстром чеке (в форме Редактирование заказа (быстрый чек)), так и в заказе с обслуживанием (в форме Редактирование заказа).

  1. Выберите предустановленную форму, где предполагается использовать функционал. Создайте её копию и переименуйте, для удобства дальнейшей работы.
  2. Откройте редактирование формы. Выделите компонент CheckView и добавьте скрипт событию для OnOrderVerify:

    1
    2

    if AVerifyType = vtAfterPay then
     CheckLoyaltyOnAuthorization;

  3. Затем поднимитесь в самое начало скриптера и вставьте следующий список процедур и функций:
    const minordersum = 250;
    const SpasiboCurrencyCode = 126;
    const RESERVE_VALUE = 1.0;
     
    function ExtractPartFromExtTransactionInfo(ExtTransactionInfo:String;
    PartName:String):String;
    var i:Integer;
     s:string;
    begin
      i:=pos(PartName,ExtTransactionInfo);
      if i>1 then begin
        i:=pos('/'+PartName,ExtTransactionInfo);
        if i>0 then
          i:=i+1;
      end;
      if i=0 then
        s:=''
      else begin
        s:=copy(ExtTransactionInfo,i+length(PartName),65535);
        i:=pos('/',s);
        if i>0 then
          SetLength(s,i-1);
      end;
      Result:=s;
    end;
     
    procedure PerformLoyalyMCR(PayLine: TPayLine);
    var i: integer;
      CardCode: string;
      FirstNumbers:String;
      LastNumbers:String;
      BankName:String;
    begin
      CardCode := ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'PdsCard=');
      i:=pos(';',CardCode);
      if i > 0 then begin
        LastNumbers:=copy(CardCode,i+1,255);
        SetLength(CardCode, i-1);
      end else
        LastNumbers:='';
      FirstNumbers:=PayLine.CardNum;
      i:=pos('*',PayLine.CardNum);
      if i>0 then
        SetLength(FirstNumbers, i-1);
      BankName:=ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'BANK:');
      // Slide a spasibo card
      // gui.ShowMessage('PerformMcrAlgorithSilent '+BankName+':'+CardCode+';'+LastNumbers);
      RK7.PerformMcrAlgorithSilent(BankName+':'+CardCode+';'+LastNumbers, 1);
    end;
     
    function PartialSpasiboPay(PayLine: TPayLine; MCRPay: TMCRPay; prepaid: double; toPay: double): boolean;
    var
      sourceValue: double;
      peio: TPayExtraInfoObj;
      Editor: TNumEditor;
      CurrCode: integer;
      payItem: TCheckItem;
      payBankItem: TPayLine;
      k: integer;
    begin
      Result := False;
      if RK7.PerformMcrAlgorithSilent('SBRF:#SPEND'+floattostr(toPay)+'#'+McrPay.CardNum, 1) = 2 then begin        
        k := GUI.MessageDlgEx('При списании бонусов Спасибо произошла ошибка', mtInformation,
              mbYes + mbCancel, 'Оплатить всю сумму банковской картой;Отмена оплаты');    
        if k <> ID_YES then begin
          RKCheck.DeleteCheckItem(PayLine);
          RKCheck.ChangePaymentIntentCorrection(PayLine.PrintCheckItem);
          RKCheck.CurrentOrder.Recalc();
          Result := True;
        end;
        exit;
      end;
      Editor := TNumEditor(GUI.FindComponentByName('Editor'));
      peio := payLine.GetExtraInfoObj();
      sourceValue := payLine.OriginalSum;
      CurrCode := PayLine.RefItem.Code;
      RKCheck.DeleteCheckItem(PayLine);
      RKCheck.ChangePaymentIntentCorrection(PayLine.PrintCheckItem);
      RKCheck.CurrentOrder.Recalc();
      Editor.Text := FloatToStr(toPay);
      payItem := RKCheck.CreateCheckItem(rkrefCurrencies, IntToStr(McrPay.Code), McrPay.CardNum);
      if payItem = nil then
        exit;
      TPayLine(payItem).ProcessOneStepIntentReceipt();
      Editor.Text := '';
      payBankItem := RKCheck.CreatePayLine(CurrCode, sourceValue - toPay, peio);
      payBankItem.ProcessOneStepIntentReceipt();
      rk7.postoperation(rkoBalanceReceipt,0);
      Result := True;
    end;
     
    function SpasiboOnAuthorize(PayLine: TPayLine):Boolean;
    var i, k: integer;
      CardCode: string;
      it: TCheckItem;
      McrPay: TMcrPay;
      prepaid: double;
      SpasiboExists: boolean;
      BankName:String;
      toPay: double;
      newValStr: string;
    begin
      //Exit; //Uncomment me to disable auto write-off SB SPASIBO
      Result:=False;
      prepaid := 0;
      SpasiboExists := False;
      for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
        it := RKCheck.CurrentOrder.Sessions.Lines[i];
        if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin
          if (it.Code = trunc(SpasiboCurrencyCode)) and (it.State <> disDeleted) and (PayLine.seat=TPayLine(it).seat) then
            SpasiboExists := True;
          if (it<>PayLine) and (it.State <> disClosed) and (it.State <> disDeleted) and (PayLine.seat=TPayLine(it).seat) then
            prepaid := prepaid + TPayLine(it).OriginalSum;
        end;
      end;
      if PayLine = Nil then Exit;
      BankName:=ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'BANK:');
      //отладка gui.showmessage('BankName: '+BankName+' paid='+floattostr(prepaid)+' OriginalSum='+floattostr(PayLine.OriginalSum)+' SpasiboExists='+inttostr(ord(SpasiboExists)));
      if SpasiboExists or (BankName<>'SBRF') then
        Exit;
      if PayLine.OriginalSum < minordersum then begin
        //gui.showmessage('Сумма оплаты меньше минимальной');
        Exit;
      end;
      if prepaid>0 then begin
        //gui.showmessage('Оплата спасибо разрешена только если весь заказ оплачен банковской картой');
        exit;
      end;
          // Spasibo card code: between "PdsCard=" and "/"
      CardCode := ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'PdsCard=');
      if copy(CardCode,1,1)='H' then
        CardCode := Copy(CardCode, 2, 255);
      // Slide a spasibo card
      PerformLoyalyMCR(PayLine);
        
      for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.Count - 1 do begin
        McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Items[i]);
        // Checking mcr-payment for spasibo card    
        //отладка gui.showmessage('McrPays.CardNum= '+McrPay.CardNum+' McrPay.Amount='+FloatToStr(McrPay.Amount));
        if (McrPay.CardNum = CardCode) and (McrPay.Amount >= minordersum - RESERVE_VALUE) then begin
          toPay := PayLine.OriginalSum - RESERVE_VALUE;
          if toPay > McrPay.Amount then
            toPay := McrPay.Amount;
          k := GUI.MessageDlgEx('Оплата ' +FloatToStr(PayLine.OriginalSum)+
               '. Для списания доступно ' + FloatToStr(toPay)+' бонусов' , mtInformation,
              mbYes + mbCancel, 'Списать '+FloatToStr(toPay)+';Не списывать');    
          if k = ID_YES then
            Result := PartialSpasiboPay(PayLine, McrPay, prepaid, toPay);
          Exit;
        end;
      end;
      // Mcr-pay not found, Result=False
    end;
     
    procedure CheckLoyaltyOnAuthorization;
    var i:integer;
     it: TCheckItem;
     PayLine: TPayLine;
    begin
     PayLine := Nil;
     for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
       it := RKCheck.CurrentOrder.Sessions.Lines[i];
       if (it.state <> disDeleted) and SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin
         if TPayLine(it).TransactionStatus = tsAuthorizing then
           PayLine := TPayLine(it)
       end;
     end;
     if PayLine = Nil then Exit;
     if SpasiboOnAuthorize(PayLine) then exit;
     RK7.PerformOperation(rkoReAuhorizePay, 0);
    end;
    JSON


    здесь: 
    • minordersum = 250 — минимальная сумма заказа, при которой можно использовать оплату баллами Спасибо
    • SpasiboCurrencyCode =126 — код валюты для работы с программой Спасибо.
  4. Модифицированную форму назначьте используемой схеме форм.

Настройка передачи дополнительных атрибутов блюд

Настройка передачи дополнительных атрибутов блюд настраивается по согласованию со Сбером.

По доп.атрибутам ПЦ Сбера сможет понять, что в отношении блюд требуется специфическая обработка (запрет начисления или списания бонусов, повышенное начисление бонусов и т.д.).

По умолчанию настроена передача следующих дополнительных атрибутов:

  • genSpasiboBonus  Спасибо: начисление бонусов. Возможные значения:
    • noBonus — запрет начисления бонусов
    • extraBonus — повышенное начисление бонусов
  • genSpasiboSpend  Спасибо: списание бонусов. Возможные значения:
    • stopSpend — запрет списания бонусов.

Чтобы включить передачу, активируйте предустановленные элементы:

  • В справочнике Перечисляемые свойства в группе Предустановленные/СберСпасибо активируйте значения атрибутов
  • В справочнике Расширенные свойства в группе Свойства для справочников/СберСпасибо  активируйте сами атрибуты.

При необходимости можно настроить передачу иных атрибутов. Для этого:

  1. В справочнике Перечисляемые свойства в группе СберСпасибо создайте новый перечисляемый тип
  2. Создайте значения нового перечисляемого типа. Значения будут являться значениями нового атрибута
  3. В справочнике Расширенные свойства в группе СберСпасибо создайте новое расширенное свойство.
    • задайте системное имя (системное имя расширенного свойства с приставкой gen будет передаваться в качестве названия атрибута)
    • укажите тип свойства Value list
    • укажите ранее созданный перечисляемый тип
  4. В списке типов нового расширенного свойства укажите типы объектов, к которым оно будет добавлено (это могут быть как элементы меню, так и другие объекты, такие, как категория заказа)
  5. Далее в справочнике Интерфейсы в свойствах предустановленного интерфейса "СберСпасибо" укажите новые расширенные свойства или в параметре XML атрибуты чека (для общих в рамках чека объектов, таких, как категория заказа) или  в параметре XML атрибуты блюд (для блюд)

    В данном примере добавлена строка 11264.genSpasiboOrderCategory.AltName:
    • genSpasiboOrderCategory — это системное имя расширенного свойства с приставкой gen. Это значение будет передаваться в ПЦ Сбера в качестве названия атрибута 
    • 11264 — это идентификатор типа объекта. Его можно узнать при привязке расширенного свойства к объекта
  6. Задайте значения нового расширенного свойства для элементов

Готово. Если всё сделано правильно, то указанные значения доп. атрибутов будут передаваться в ПЦ при продаже. При этом действует следующая логика:

  • Если значение расширенного свойства передается с привязкой к блюду — значение передается с конкретным блюдом
  • Если значение расширенного свойства передается с привязкой к общему в рамках чека элементу (например, к категории заказа) — то оно передается со всеми блюдами, включенными в данный заказ.

Работа на кассовой станции

При настройке Формы в скрипте задаётся минимальная сумма заказа, при которой возможна оплата бонусами — minordersum. Поэтому возможны два сценария работы на кассе: когда минимальная сумма не достигнута, и когда достигнута.

Оплата при сумме заказа меньше minordersum

Если при расчете заказа его стоимость меньше указанной в скрипте, то процесс расчета аналогичен классической оплате по банковской карте. Списание бонусов предложено не будет.

Оплата при сумме заказа больше minordersum

Если при расчете заказа его стоимость больше указанной в скрипте, то после выбора для оплаты банковской карты и печати чека намерения, на этапе подтверждения оплаты выйдет сообщение с предложением списать бонусы СберСпасибо.

При выборе варианта Списать, спишется  максимальное количество доступных для списания бонусов.

При выборе варианта Не списывать пройдет оплата полной суммы заказа банковской картой без списания бонусов.

После выбора одного из вариантов, заказ закроется.

Ошибка при списании бонусов

Возможна ситуация, когда при попытке списания бонусов, происходит ошибка. В этом случае выводится сообщение:

При выборе варианта Оплатить всю сумму банковской картой полная сумма заказа будет оплачена баковской картой. Бонусы СберСпасибо в этом случае не списываются.

При выборе варианта Отмена оплаты произойдет возврат в режим редактирования заказа, после чего можно попробовать повторно оплатить заказ со списанием бонусов.

Ограничения списания бонусов

Бонусы СберСпасибо не получится списать, если:

  • Заказ оплачивается более, чем одной валютой. Например, банковской картой и наличными
  • В заказе используется другая система лояльности
  • Есть проблемы, связанные с доступностью сервера СберСпасибо.