Общая информация

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

Для корректной работы связки RkMobWaiter и системы CRM (ПДС) необходимо использовать следующий алгоритм формирования QR-кода:

  1. Текущая дата переводится в строку в формате "yymmdd"
  2. К дате в виде строки добавляется код карты
  3. Полученная строка шифруется методом, реализованным в функции IpsEncodeString
  4. К строке 'QRK=' добавляется полученная на ш.3 строка и используется для генерации QR-кода
 

Пример генерации QR-кода (Delphi):

 
cardCodeCrypted := 'QRK=' + IpsEncodeString(NowToString() + cardCode);

function NowToString() : string;
var
  str: string;
  dt: TDateTime;
begin
  dt := Now;
  str := FormatDateTime('yymmdd', dt);
  Result := str;
end;
 
Где 
  • cardCode - код карты гостя
  • NowToString() - функция получение текущей даты и преобразование ее в текстовый формат  "yymmdd"
  • IpsEncodeString() - функция кодирования кода карты (см. ниже)
  • cardCodeCrypted - результирующее значение QR-кода, полученное операцией объеденения (конкатенации) строк 'QRK=' + IpsEncodeString(NowToString() + cardCode)

 

Функция IpsEncodeString реализована в модуле ipscrpt.pas (см. вложенный файл ipscrpt.7z), ниже приведен исходный код модуля:

unit ipscrpt;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Dialogs, StdCtrls;

  function IpsEncodeString( source: string ): string;
  function IpsDecodeString( source: string ): string;

type
arr = array[0..9, 0..9] of integer;

const mas1: arr = (
      (1, 2, 3, 6, 0, 8, 5, 4, 7, 9),
      (2, 1, 8, 6, 5, 9, 7, 0, 4, 3),
      (7, 6, 1, 5, 8, 4, 2, 9, 3, 0),
      (2, 6, 5, 7, 4, 0, 8, 1, 3, 9),
      (0, 8, 6, 2, 7, 9, 4, 5, 3, 1),
      (5, 7, 8, 0, 6, 9, 2, 4, 3, 1),
      (0, 6, 5, 3, 8, 7, 1, 2, 9, 4),
      (9, 7, 8, 6, 3, 0, 1, 5, 2, 4),
      (1, 0, 5, 9, 2, 7, 3, 6, 4, 8),
      (6, 2, 9, 4, 1, 0, 8, 5, 3, 7)
);

const mas2: arr = (
      (4, 0, 1, 2, 7, 6, 3, 8, 5, 9),
      (7, 1, 0, 9, 8, 4, 3, 6, 2, 5),
      (9, 2, 6, 8, 5, 3, 1, 0, 4, 7),
      (5, 7, 0, 8, 4, 2, 1, 3, 6, 9),
      (0, 9, 3, 8, 6, 7, 2, 4, 1, 5),
      (3, 9, 6, 8, 7, 0, 4, 1, 2, 5),
      (0, 6, 7, 3, 9, 2, 1, 5, 4, 8),
      (5, 6, 8, 4, 9, 7, 3, 1, 2, 0),
      (1, 0, 4, 6, 8, 2, 7, 5, 9, 3),
      (5, 4, 1, 8, 3, 7, 0, 9, 6, 2)
);

implementation

function IpsEncodeString( source: string ): string;
var
  i,j,k: integer;

begin

  for i:=length(source) downto 1 do
  if not(source[i] in ['0'..'9']) then delete(source,i,1);

  result := '';

  i := 0;
  j := 0;

  while (i <= Length(source) - 1) do begin

    k := mas1[j, StrToInt(source[i+1])];
    result := result + IntToStr(k);

    inc(i);
    inc(j);
    if (j>=10) then j := 0;
  end;
end;

function IpsDecodeString( source: string ): string;
var
  i,j,k: integer;

begin

  for i:=length(source) downto 1 do
  if not(source[i] in ['0'..'9']) then delete(source,i,1);

  result := '';

  i := 0;
  j := 0;

  while (i <= Length(source) - 1) do begin

    k := mas2[j, StrToInt(source[i+1])];
    result := result + IntToStr(k);

    inc(i);
    inc(j);
    if (j>=10) then j := 0;

  end;

end;

end.
AttachmentSize
ipscrpt.7z779 bytes