Обновление PayControl с версии 3 на версию 6

Материал из PayControl Wiki
Версия от 17:25, 15 ноября 2024; D.bizyukov (обсуждение | вклад) (Откат обновления в случае сбоя)
Перейти к: навигация, поиск

Введение

Резервное копирование

Перед обновлением необходимо выполнить резервное копирование БД PCS и PCIS Internal.

Обновление Java

Перед обновлением компонентов PC требуется остановить Wildfly и обновить Java до версии 17. Версия 11 больше не поддерживается.

При установке Java новой версии, старая версия не удаляется, и PC может продолжить работать на версии 11, что приведёт к ошибкам.

Для того чтобы компоненты работали под Java 17, необходимо либо удалить неактуальную версию Java, либо выбрать необходимую версию с помощью:

sudo update-alternatives --config java

Изменение названий серверов

В версии 6 изменены названия серверов:

  • PC Server (PCS) — без изменений;
  • PC Interaction Internal — PC Pusher (PCP);
  • PC Interaction External — PC External (PCE).

Изменения в БД

Правки структуры таблиц БД PCS

Для обеспечения должного функционирования системы PC, в некоторые таблицы необходимо внести изменения, выполнив запросы:

MS SQL

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'transaction_type'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        transaction_type integer;

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_SYSTEM]')
          AND name = 'callback_url'
    )
ALTER TABLE PC_SYSTEM
    ADD
        callback_url character varying(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_USER]')
          AND name = 'blocked'
    )
ALTER TABLE PC_USER
    ADD
        blocked smallint;

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_KEYINFO]')
          AND name = 'external_approve_data_id'
    )
ALTER TABLE PC_KEYINFO
    ADD
        external_approve_data_id character varying(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_PUBLICKEY]')
          AND name = 'autosign_public_key'
    )
ALTER TABLE PC_PUBLICKEY
    ADD
        autosign_public_key varbinary(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_DELAYEDKEYINFO]')
          AND name = 'renew_challenge'
    )
ALTER TABLE PC_DELAYEDKEYINFO
    ADD
        renew_challenge character varying(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_DEVICE]')
          AND name = 'app_id'
    )
ALTER TABLE PC_DEVICE
    ADD
        app_id character varying(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'autosign_enabled'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        autosign_enabled smallint;

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'ext_pulp'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        ext_pulp character varying(255);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'extended_check'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        extended_check smallint;

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'render_type'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        render_type integer;

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_TRANSACTION]')
          AND name = 'scoring_settings'
    )
ALTER TABLE PC_TRANSACTION
    ADD
        scoring_settings character varying(1023);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_CONFIRM_ATTEMPT]')
          AND name = 'scoring_results'
    )
ALTER TABLE PC_CONFIRM_ATTEMPT
    ADD
        scoring_results character varying(512);

IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_CONFIRM_ATTEMPT]')
          AND name = 'scoring_settings'
    )
ALTER TABLE PC_CONFIRM_ATTEMPT
    ADD
        scoring_settings character varying(512);
		
IF NOT EXISTS(
        SELECT *
        FROM sys.columns
        WHERE object_id = OBJECT_ID(N'[dbo].[PC_EVENT]')
          AND name = 'event_data'
    )
    ALTER TABLE PC_EVENT
        ADD
            event_data VARCHAR(MAX);
ELSE
    ALTER TABLE PC_EVENT
        ALTER COLUMN event_data VARCHAR(MAX);

alter table pc_event ALTER COLUMN requester_ip varchar(64);

Запрос на регистрацию и лицензия

Получение нового запроса и лицензии

Для получения нового запроса на регистрацию и лицензии обратитесь в компанию Сэйфтек.

Замена запроса в БД

В приведённом ниже запросе необходимо:

  • заменить %SYSTEMID% на реальное значение systemid зарегистрированное для Вашей прикладной системы. Обратите внимание, что знаки процента нужно удалить;
  • заменить %REGISTERREQUEST% на реальные данные запроса, созданного для Вашей прикладной системы. Обратите внимание, что знаки процента нужно удалить;
    • пример нужных данных запроса eyJyZXF1ZXN0Ijp7InFyVVJMU2NoZW1lIjoiIiwiYmlsbGluZ1R5cGUiOjIsImludGVyYWN0aW9uRXh0ZXJuYWxVUkwiOiJodHRwczovL3BheWNvbnRyb2wuZXhhbXBsZS5jb20vcGMtY2xpZW50LWFwaS8iLCJpbnRlcmFjd----m1VRERpZndVU3VOS3BoYmV4emsifQ==
update pc_system_params set register_request='%REGISTERREQUEST%' where systemid='%SYSTEMID%';

Замена лицензии(при наличии) в БД

В приведённом ниже запросе необходимо:

  • заменить %SYSTEMID% на реальное значение systemid зарегистрированное для Вашей прикладной системы. Обратите внимание, что знаки процента нужно удалить;
  • заменить %LICENSE% на реальные данные лицензии, созданной для Вашей прикладной системы. Обратите внимание, что знаки процента нужно удалить;
    • пример нужных данных запроса {"request":{"systemId":"99000000-e00e-0ad0-00ab-f00f0000a0b0","dateTime":1700000000000,"usersCount":100,"licenseID":"0000e000-0000-0000-b0ec-c0f0000000f0","type":2,"features":{"gost_crypto":false,"pki":{"openssl":false},"binary_data":{"raw":true,"pdf":true},"server_signer":false,"rks":false}},"signature":"MEYCIQDy7OUT6iiligbiugYcpK9fjkU/GDRIUiJtB+UcHppVwIhAKzS+EcktxyRikvqEThPyo1jHlPuAfgxW+EEo5gioW7Y"}
update pc_system_params set register_request='%LICENSE%' where systemid='%SYSTEMID%';



Обновление модулей PC

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

Для установки PC 6-й версии воспользуйтесь инструкцией по ссылке - https://repo.paycontrol.org/server/doc/latest/pc-install-guide/ru/#перед-установкой

После обновления необходимо отключить автозапуск Wildfly.

Корректировка (смена) адресов компонентов серверов PC

Изменение адреса PCS для подключения с PCE

На сервере PCE необходимо заменить часть строки с адресом сервера PCS (host и port заменить на реальные значения). Для этого:

  • на Linux в файле <WF_PATH>/bin/standalone.conf нужно заменить
    JAVA_OPTS="$JAVA_OPTS -Dpcservice.endpoint=http://<host>:<port>/ws/PayControlServiceV3?wsdl -Duser.language=ru -Dpaycontrol.locale=ru"
    
    на строку
    JAVA_OPTS="$JAVA_OPTS -Dpc_url=http://<host>:<port>/pc-api/ -Dpc_locale=ru"
    
  • на Windows в файле <WF_PATH>/bin/standalone.conf.bat нужно заменить
    set "JAVA_OPTS=%JAVA_OPTS% -Dpcservice.endpoint=http://<host>:<port>/ws/PayControlServiceV3?wsdl -Duser.language=ru -Dpaycontrol.locale=ru"
    
    выше метки :JAVA_OPTS_SET на строку
    set "JAVA_OPTS=%JAVA_OPTS% -Dpc_url=http://<host>:<port>/pc-api/ -Dpc_locale=ru"
    

Изменение адреса PCP для подключения с PCS

Для изменения адреса сервера PCP, необходимо, предварительно указав корректные данные (протокол (HTTP/HTTPS), имя или IP сервера, порт, идентификатор системы), выполнить запрос к БД PCS:

update pc_system set pc_is_internal_url = 'http[s]://<IP или DNS-имя>[:PORT]/pc-pusher-api/' where systemid='<SYSTEMID>';

Изменение адреса для внешних подключений (PCE) с мобильных устройств

Для изменения внешнего адреса сервера PC, по которому связываются мобильное приложение с сервером PC, необходимо, предварительно указав корректные данные (протокол (HTTP/HTTPS), имя или IP сервера, порт, идентификатор системы), выполнить запрос к БД PCS:

update pc_system set pc_is_external_url = 'http[s]://<IP или DNS-имя>[:PORT]/pc-client-api/' where systemid='<SYSTEMID>';


Для работы старых ключей, обращающихся по эндпоинту /PayControl-interaction-rest/ нужно установить проксирование на эндпоинт /pc-client-api/, любым удобным способом.

Пример для nginx:

        location /PayControl-interaction-rest/ {
                proxy_pass http://o-example.loc:8080/pc-client-api/;
        }

Правки для корректной отправки пушей

update pc_device set app_id ='org.example.app' where device_push_id not like '%####%' and app_id is null and type=1;
!!!Запрос выше для Android при обновлении с 3.6-3.7. Вместо org.example.app нужно вписать app_id вашего приложения из БД PCIS Internal:
select appid from pc_split_pusher_credentials where os='Android';

update pc_device set app_id ='org.example.app' where device_push_id not like '%####%' and app_id is null and type=2;
!!!Запрос выше для iOS при обновлении с 3.6-3.7. Вместо org.example.app нужно вписать app_id вашего приложения из БД PCIS Internal:
select appid from pc_split_pusher_credentials where os='iOS';

update pc_device set app_id = split_part(device_push_id,'####',2) where app_id is NULL;
update pc_device set device_push_id = split_part(device_push_id,'####',1) where app_id is not NULL;

!!! '''Обратите внимание''', что для выполнения запросов со split_part на Oracle нужно сначала выполнить запрос ниже:
create or replace function split_part(pString varchar2, pDelimiter varchar2, pPartNumber integer) return varchar2 deterministic is
  vStart number; 
  vEnd   number;
begin
  if pPartNumber <> 0 and pDelimiter is not null then
    vStart := instr(pDelimiter||pString||pDelimiter, pDelimiter, sign(pPartNumber), abs(pPartNumber));
    vEnd   := instr(pDelimiter||pString||pDelimiter, pDelimiter, sign(pPartNumber), abs(pPartNumber) + 1);
  end if;
  return case         
           when pDelimiter is null and abs(pPartNumber) = 1 then pString
           when pPartNumber > 0 then substr(pString, vStart, vEnd - vStart - length(pDelimiter))                       
           when pPartNumber < 0 then substr(pString, vEnd, vStart - vEnd - length(pDelimiter))          
           else null
         end;
end;
/


Документация по работе с PC 6-й версии

Доступ к сервисам

Адреса конечных точек по умолчанию:

  • PC Server - http://<host>:8080/pc-api/
  • PC Pusher - http://<host>:8082/pc-pusher-api/
  • PC External - http://<host>:8081/pc-client-api/

Health Check

Адреса конечных точек health check:

  • PC Server - http://<host>:8080/pc-api/health_check
  • PC Pusher - http://<host>:8082/pc-pusher-api/health_check
  • PC External - http://<host>:8081/pc-client-api/health_check

Откат обновления в случае сбоя

Остановите сервисы PC.

Восстановите БД PCS и PCIS Internal из бэкапа.

Переключитесь на Java 11.

Запустите wildfly и включите автозапуск.