Один аккаунт для магазинов
SDK позволяет покупателям входить в магазин с аккаунтом, используемым в приложении. Документация описывает методы, доступные в поддерживаемых магазинах.
В центральном окне можно войти или создать аккаунт. Пока его интерфейс доступен на французском и английском языках, хотя документация переведена на двенадцать языков.
Добавление входа
В поддерживаемом магазине клиент window.rankappConnect уже загружен и настроен. Используйте три метода: login(), getSession() и logout(). Дополнительная установка не нужна. Полный пример лишь добавляет кнопки и доступные сообщения состояния.
Вызывайте login() непосредственно при клике. Промис возвращает {status: "success", session}, {status: "cancelled"} или {status: "redirecting"}. При ошибке промис отклоняется со стабильным кодом. На мобильных устройствах и при блокировке окна используется перенаправление. returnTo должен оставаться в вашем магазине.
const connect = window.rankappConnect;
function onSignInClick() {
return connect.login({ returnTo: '/account' });
}
function readSession() {
return connect.getSession();
}
function onSignOutClick() {
return connect.logout();
}Показать полный пример с кнопками и сообщениями
<button type="button" id="connect-login">Войти через RankAPP</button>
<button type="button" id="connect-logout" hidden>Выйти</button>
<p id="connect-status" role="status" aria-live="polite"></p>
<script>
const connect = window.rankappConnect;
const login = document.querySelector('#connect-login');
const logout = document.querySelector('#connect-logout');
const status = document.querySelector('#connect-status');
const copy = {
"cancelled": "Вход отменён. Можно попробовать снова.",
"redirecting": "Переход к странице входа…",
"login": "Войти через RankAPP",
"logout": "Выйти",
"signedOut": "Вы не вошли в аккаунт.",
"signedIn": "Вы вошли: ",
"error": "Вход недоступен. Повторите попытку.",
"pending": "Выполняется вход…"
};
function render(session) {
status.textContent = session.authenticated
? copy.signedIn + session.user.username : copy.signedOut;
logout.hidden = !session.authenticated;
}
function failure() {
status.textContent = copy.error;
}
function busy(value) {
login.disabled = logout.disabled = value;
}
login.addEventListener('click', async () => {
busy(true);
status.textContent = copy.pending;
let redirecting = false;
try {
const result = await connect.login({ returnTo: '/account' });
if (result.status === 'success') render(result.session);
else if (result.status === 'cancelled') status.textContent = copy.cancelled;
else {
redirecting = true;
status.textContent = copy.redirecting;
}
} catch (error) { failure(); }
finally { if (!redirecting) busy(false); }
});
logout.addEventListener('click', async () => {
busy(true);
try { render(await connect.logout()); }
catch (error) { failure(); }
finally { busy(false); }
});
busy(true);
connect.getSession().then(render).catch(failure)
.finally(() => busy(false));
</script>Отображение сеанса
getSession() запрашивает сервер: {authenticated: false} означает отсутствие сеанса. Сеанс содержит user (userId, username, avatarUrl, language), а в управляемых магазинах — orders. Вызывайте метод при загрузке и после перенаправления; не определяйте личность по параметрам URL.
Сбои сервиса остаются ошибками: STOREFRONT_SESSION_ERROR не означает выход из аккаунта. Покажите сообщение с предложением повторить попытку. login() отличает отмену от ошибки; logout() завершает только сеанс магазина.
Идентификация и cookies
SDK требует HTTPS для всех сайтов и конечных точек, включая локальную разработку. Используйте локальный HTTPS-сервер с сертификатом, которому доверяет браузер. HTTP никогда не принимается для аутентификации.
Пароль вводится на auth.rankapp.io, а не на сайте продавца. Одноразовый код и PKCE S256 связывают окно с исходным запросом. Обмен кода и хранение токенов выполняются на сервере; сообщение о завершении из всплывающего окна не содержит токенов.
Cookies сеанса используют HttpOnly, Secure и SameSite=Lax. Каждый cookie ограничен собственным хостом, без общего атрибута Domain. Центральный сеанс и сеансы отдельных магазинов независимы. Вызов logout() завершает сеанс магазина, но не обязательно центральный сеанс.
Сервер магазина
Эта документация описывает SDK 1.1.0. В совместимом магазине используйте только настроенный клиент window.rankappConnect. Сервер управляет входом, сеансом и выходом, а клиент выполняет необходимые подписанные запросы. Настраивать конечные точки или адаптеры на странице не нужно.
Проверка в предпросмотре
Предпросмотр поддерживает настоящие аккаунты, чтобы проверять вход и выход глазами покупателя. Доступ к закрытому черновику требует отдельного разрешения: открытие предпросмотра не выполняет автоматический вход покупателя. Платежи в этом режиме отключены.
Проверьте успешный вход, отмену, закрытие окна, возврат на телефоне и повторный вход после выхода. В рабочем режиме магазин должен быть опубликован и доступен. Успешная аутентификация не подтверждает оплату; результат платежа необходимо обрабатывать отдельно от состояния входа.
Подготовка внешней интеграции
Регистрация интеграций для независимых внешних сайтов пока не открыта. Сначала необходимы регистрация клиентов, проверка адресов возврата и определение предоставляемых прав доступа.
Не придумывайте совместимые client_id, адрес выдачи токенов или настройки OIDC. Текущий контракт относится к поддерживаемым магазинам и их адаптеру. Не передавайте пароли и токены в JavaScript продавца, всегда проверяйте сеанс на сервере и предусмотрите сообщения об отмене и временных сбоях.