Платформа SelSup · Кіраўнікі
Пашырэнні і інтэграцыі на заказ
Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.
Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.
Развівальнікі прыкладанняў і партнёры ў галіне тэхналогій1
Выберыце тып інтэграцыі
- 1
Паслуга знешняга заканчэння
Лепш за ўсё для ERP, вэб-крамы, WMS, BI і аналагічнай сінхрынізацыі. Токен застаецца на серверы і дадзеныя перамяшчаюцца праз API і вэбхукі.
- 2
Падборка iframe кабінета
Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.
- 3
SelSup папярэдні модуль
Патрабавана для глыбокага рынку або інтэграцыі дастаўкі ўдзельнічаюць у агульных працэсах SelSup фону.
Укараньні адзін поўны працоўны паток і яго назіральнасць спачатку. Дадаць маштабны імпарт, UI, і больш тыпаў падзей пасля ўзгаднення стабільны.
2
Архітэктура знешніх прыкладанняў
Захоўвайце токен у кіраўніку сакрэтаў і тэлефануйце SelSup толькі з вашага бэкэнд.
Аддзяліце адаптар SelSup, чаргу працы і мадэль дамена. API змены кантрактаў затым застаюцца ізаляванымі ад астатніх прыкладанняў.
Выкарыстоўвайце паступную скрынку для паступных падзей і выхадную скрытку для выходзячых змяненняў.
SelSup webhook → inbox → domain worker → ERP/WMS
ERP/WMS change → outbox → SelSup API → reconciliation
Сродкі API канечныя пункты
GET/api/product/findПрыклад чытання слоўнікаGET/api/order/findПрыклад інкрэментальнай сінхронізацыі
3
Падборка iframe кабінета
Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.
Адкрыць Інтэграцыі → Мае пашырэнні → Дадаць пашыренне і выбраць імя, ікону, URL, раздзел меню і пазіцыю. Захаваць прыватны панэль без дазволаў, а затым уключыць толькі дазволы, якія ён неабходна.
4
Модуль інтэграцыі з боку сервера
Інтэграцыя рынку звычайна ахоплівае токены, карты, цэны, акцыі, замовы і абнаўленні статусу фону.
Гэты модуль змяняе асноўны задні план SelSup і прытрымліваецца яго працэсу агляду, тэставання, лакалізацыі і выпуску.
Пераўтварыць здарэнні знешніх API ў стабільныя значэнні ApplicationError і адкліканыя або непапраўныя знешнія токены ў AccessException ў адпаведнасці з правіламі задніх праектаў.
Не дадайце рынкавыя спецыфічныя поля ў агульныя суб'екты. Захоўвайце сырыя кантракты ў інтэграцыйных DTO і адлюстроўвайцеся на мяжы.
5
Выпуск і эксплуатацыя
- 1
Стварэнне тэставага ўліку
Асобныя тэставыя токены, склады, прадукты і заказы з дадзеных прадукцыі кліента.
- 2
Дадаць назіральнасць
Адсочваць затрымкі чаргі, памылкі па кодзе, пералік перапрабаванняў і непарыўнасці ў пагадненні.
- 3
План кантрактнай міграцыі
Падтрымлівайце старыя поля падчас пераходу і размясціце спажыўцоў, перш чым адключыць стары фармат.
- 4
Адключэнне дакументаў
Карыстальнікі павінны ведаць, як адмяніць токен, выдаліць вэб-хаук і спыніць сінхрынізацыю, не губляючы дадзеных.
6
Тэгі: прадукт і заказ
Выберыце старонку меню (MENU_PAGE), адметку карткі прадукту (PRODUCT_TAB) або адметкі заказ (ORDER_TAB). раздзел меню і пазіцыя прымяняюцца толькі для MENU_PAGE. Адметкі патрабуюць захаванай суб'екцыі з ID.
7
Кантэкс і дазволы
Уключаецца толькі дадзенае кантэкстныя поля. USER прадстаўляе user.id і user.locale; КЛІЕНТ прадставіць client.id; ORGANIZATION прадставіць даступны ідэнтыфікатар арганізацыі і імя. PRODUCT асобна дае product.modelId на карце прадукту; ORDER дае order.id на заказ. Поўныя запісы, кантакты, паролі і токены выключаны. Гэта ідэнтынфікатары ўжо адкрытай старонкі, а не даведка аб доступе для вашага бэкэнд.
{
"type": "selsup.extension.context",
"version": 1,
"context": {
"version": 1,
"extensionId": "example-extension-id",
"placement": "MENU_PAGE",
"user": {"id": 101, "locale": "ru"},
"client": {"id": 202},
"organizations": [{"id": 303, "name": "Demo"}]
}
}
[
{
"version": 1,
"extensionId": "example",
"placement": "PRODUCT_TAB",
"apiMethods": [],
"product": {
"modelId": 404
}
},
{
"version": 1,
"extensionId": "example",
"placement": "ORDER_TAB",
"apiMethods": [],
"order": {
"id": 505
}
}
]
8
паведамленне v1 паведач
Праверце дакладны event.origin, event.source === window.parent, тып паведамлення, версія і структура. Паслаць гатовы на падключэнне і запыт-кантэкс для абнаўлення. SelSup перапрацоўвае доступ і злучае частая запыты. Ніколі не перадаваць токены ў URL-адрасах, панэлі localStorage або паведаванні.
const allowedOrigins = new Set(['https://your-cabinet.example.com']);
window.addEventListener('message', (event) => {
if (event.source !== window.parent || !allowedOrigins.has(event.origin)) return;
const message = event.data;
if (!message || message.type !== 'selsup.extension.context' || message.version !== 1) return;
const context = message.context;
if (!context || context.version !== 1 || !['MENU_PAGE', 'PRODUCT_TAB', 'ORDER_TAB'].includes(context.placement)) return;
// The complete sample also validates fields and strips unknown properties.
document.querySelector('#context').textContent = JSON.stringify(context, null, 2);
});
for (const origin of allowedOrigins) {
window.parent.postMessage({type: 'selsup.extension.ready', version: 1}, origin);
}
// Refresh after connecting: use the validated origin, never "*".
window.parent.postMessage({type: 'selsup.extension.request-context', version: 1},
'https://your-cabinet.example.com');
9
API праз мост iframe
Аўтар заявіць патрабаваныя метады ў наладках пашырэння. Кожны ўстаноўчы кліент выразна дае метады з гэтай дэкларацыі. API доступ па умове ні да якіх, уключаючы існуючыя ўстановы. Змена запытанага спісу патрабуе другога перагляду; усталяваныя копіі ніколі не атрымліваюць новыя дазволы аўтаматычна.
Хост кліча толькі наступныя метады праз паслугі SelSupFront з дазволамі цяперашняга супрацоўніка. Існуючыя кантролі доступу да сервера па-ранейшаму дзейнічаюць. кліент-Сэрвіс і аўт-Сервіс цалкам забароненыя; усе метады па-за гэтым спісам таксама адмоўленыя. Прыклады не могуць прадастаўляць URL-адказы, загаловак, токены або адвольную канфігурацыю Axios. Сервер праверкуе бягучую ўстаноўку і яе дазволы на рэальным запыце API.
API гранты незалежны ад кантэкст дазволаў. context.apiMethods пералічваюцца дадзеныя метады. Гранты прымяняюцца да метаду па ўсім кабінеце ў межах доступу супрацоўніка, а не толькі суб'екты ў бягучай відэазапісе. Вынікі ўтрымліваюць толькі дакументаваныя поля, ніколі аб'ектаў Axios або крэдыенцый.
Адзін запыт у палёце і як мага больш за адзін старт у секунду. Апошнія 256 ID запыту абароненыя ад дублятаў. Гасцейскія памылкі: ACCESS_DENIED, INVALID_REQUEST, RATE_LIMITED, EDUPLICATE_REQUEST, eREQUEST_FAILED. памылка SDK таксама ўключае ў сябе NOT_CONNECTED, DISCONNECTED і TIMEOUT (20 секунд). Ніколі не спрабуй аўтаматычна пераўтвараць: error, часу або закрыццё iframe не азначае, што аперацыя была адкінутая.
tagService.findTags {query?, page?, limit?} => {rows: [{id, name}]}
tagService.createTag {name} => {id, name}
tagService.updateTag {id, name} => {id, name}
tagService.deleteTag {id} => null
productService.updateFavourite {id, favourite} => null
id: positive safe integer; updateFavourite.id = product.modelId
favourite: boolean
name: 1..100 characters (trimmed); query: 0..100 characters
page: 1..10000, default 1; limit: 1..100, default 30
{
"type": "selsup.extension.api-request",
"version": 1,
"requestId": "request-1",
"method": "tagService.createTag",
"params": {
"name": "Demo"
}
}
{
"type": "selsup.extension.api-response",
"version": 1,
"requestId": "request-1",
"ok": true,
"result": {
"id": 1,
"name": "Demo"
}
}
// connection = connectExtension(...) from selsup-extension.js
// Run from a button click after receiving context.apiMethods.
const tag = await connection.callApi('tagService.createTag', {name: 'Demo'});
console.log(tag.id, tag.name);
10
Узоры прыкладання і хостынгу
Выбар можа быць капіяваны ў самастойны рэпазітры GitHub. З Node.js 22+, npm тэст і npm пачаць запусціць тэсты і мясцовы максімальны кабінет без клавішаў API або рэальных дадзеных. Канфігуруй config.js і размясціць пяць статычных файлаў на хостынг HTTPS. Скарыстайце архіў, звязаны ніжэй і капіяваць яго змест у свой рэпазытрыю GitHub .
cd selsup-extension-example
npm test
npm start
# Mock host: http://localhost:4174/
# Panel: http://127.0.0.1:4173/
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; connect-src 'none'; form-action 'none'; base-uri 'none'; frame-ancestors https://your-cabinet.example.com
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
https://api.selsup.ru/assets/examples/selsup-extension-example.zip
11
Границы бяспекі
Сандбокс блакуе формы, паўп-папы, загрузкі, верхняя навігацыя і адчувальныя API браўзэра. Паходжанне панэлі паказана вышэй iframe. Пашырэнне ніколі не павінна прасіць пароль SelSup. Яго сайт усё яшчэ можа ўбачыць IP-адпіс наведвальніка і захоўваць або перадаваць дадзеныя, дадзеных, дадзеныя яму.
SelSup сама дазваляе iframe bridge званкі; файлы cookie і токены ніколі не дасягаюць прыкладання. Ваша ўласная заднія бакі ўсё яшчэ мае патрэбу ў сваёй уласнай аўтэнтыфікацыі: кантэкс не даказвае ідэнтычнасці. Захоўваць доўгажывалыя токені SelSup толькі на сэрверы. Поўны заказ/product запісы і ўлавыя блокі карт не падтрымліваюцца.