SelSup Developers

Платформа SelSup · Кіраўнікі

Пашырэнні і інтэграцыі на заказ

Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.

Раздзелы: 11Кіраўніцтва распрацоўшчыкам
→

Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.

Развівальнікі прыкладанняў і партнёры ў галіне тэхналогій

1

Выберыце тып інтэграцыі

  1. 1

    Паслуга знешняга заканчэння

    Лепш за ўсё для ERP, вэб-крамы, WMS, BI і аналагічнай сінхрынізацыі. Токен застаецца на серверы і дадзеныя перамяшчаюцца праз API і вэбхукі.

  2. 2

    Падборка iframe кабінета

    Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.

  3. 3

    SelSup папярэдні модуль

    Патрабавана для глыбокага рынку або інтэграцыі дастаўкі ўдзельнічаюць у агульных працэсах SelSup фону.

i
Пачніце з тонкага вертыкальнага нарезка

Укараньні адзін поўны працоўны паток і яго назіральнасць спачатку. Дадаць маштабны імпарт, UI, і больш тыпаў падзей пасля ўзгаднення стабільны.

2

Архітэктура знешніх прыкладанняў

Захоўвайце токен у кіраўніку сакрэтаў і тэлефануйце SelSup толькі з вашага бэкэнд.

Аддзяліце адаптар SelSup, чаргу працы і мадэль дамена. API змены кантрактаў затым застаюцца ізаляванымі ад астатніх прыкладанняў.

Выкарыстоўвайце паступную скрынку для паступных падзей і выхадную скрытку для выходзячых змяненняў.

Паток дадзеных · Text
SelSup webhook → inbox → domain worker → ERP/WMS
ERP/WMS change → outbox → SelSup API → reconciliation

3

Падборка iframe кабінета

Стварыце звычайную старонку HTML/JavaScript з дапамогай любой сістэмы. SelSup ўбудоўвае яе ў iframe; яна не выконвае ваш код React ўнутры шафы.

Адкрыць Інтэграцыі → Мае пашырэнні → Дадаць пашыренне і выбраць імя, ікону, URL, раздзел меню і пазіцыю. Захаваць прыватны панэль без дазволаў, а затым уключыць толькі дазволы, якія ён неабходна.

4

Модуль інтэграцыі з боку сервера

Інтэграцыя рынку звычайна ахоплівае токены, карты, цэны, акцыі, замовы і абнаўленні статусу фону.

Гэты модуль змяняе асноўны задні план SelSup і прытрымліваецца яго працэсу агляду, тэставання, лакалізацыі і выпуску.

Пераўтварыць здарэнні знешніх API ў стабільныя значэнні ApplicationError і адкліканыя або непапраўныя знешнія токены ў AccessException ў адпаведнасці з правіламі задніх праектаў.

i
Сумяшчальнасць агульных дадзеных

Не дадайце рынкавыя спецыфічныя поля ў агульныя суб'екты. Захоўвайце сырыя кантракты ў інтэграцыйных DTO і адлюстроўвайцеся на мяжы.

5

Выпуск і эксплуатацыя

  1. 1

    Стварэнне тэставага ўліку

    Асобныя тэставыя токены, склады, прадукты і заказы з дадзеных прадукцыі кліента.

  2. 2

    Дадаць назіральнасць

    Адсочваць затрымкі чаргі, памылкі па кодзе, пералік перапрабаванняў і непарыўнасці ў пагадненні.

  3. 3

    План кантрактнай міграцыі

    Падтрымлівайце старыя поля падчас пераходу і размясціце спажыўцоў, перш чым адключыць стары фармат.

  4. 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 на заказ. Поўныя запісы, кантакты, паролі і токены выключаны. Гэта ідэнтынфікатары ўжо адкрытай старонкі, а не даведка аб доступе для вашага бэкэнд.

Кантэкс v1 · JSON
{
  "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"}]
  }
}
Кантэкс адкладкі v1 · JSON
[
  {
    "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 або паведаванні.

Гасцініца / мост пашырэння · JavaScript
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 не азначае, што аперацыя была адкінутая.

Дапушчаныя метады v1 · Text
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
Запыт · JSON
{
  "type": "selsup.extension.api-request",
  "version": 1,
  "requestId": "request-1",
  "method": "tagService.createTag",
  "params": {
    "name": "Demo"
  }
}
Адказ · JSON
{
  "type": "selsup.extension.api-response",
  "version": 1,
  "requestId": "request-1",
  "ok": true,
  "result": {
    "id": 1,
    "name": "Demo"
  }
}
Узор SDK: пасля кантэксту.apiMethods атрымліваецца · JavaScript
// 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 .

Мясцовая дэма · Shell
cd selsup-extension-example
npm test
npm start
# Mock host: http://localhost:4174/
# Panel: http://127.0.0.1:4173/
Назавіцы адказу HTTPS · HTTP
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
ZIP / GitHub-прыгатаванай узоры · URL
https://api.selsup.ru/assets/examples/selsup-extension-example.zip

11

Границы бяспекі

Сандбокс блакуе формы, паўп-папы, загрузкі, верхняя навігацыя і адчувальныя API браўзэра. Паходжанне панэлі паказана вышэй iframe. Пашырэнне ніколі не павінна прасіць пароль SelSup. Яго сайт усё яшчэ можа ўбачыць IP-адпіс наведвальніка і захоўваць або перадаваць дадзеныя, дадзеных, дадзеныя яму.

SelSup сама дазваляе iframe bridge званкі; файлы cookie і токены ніколі не дасягаюць прыкладання. Ваша ўласная заднія бакі ўсё яшчэ мае патрэбу ў сваёй уласнай аўтэнтыфікацыі: кантэкс не даказвае ідэнтычнасці. Захоўваць доўгажывалыя токені SelSup толькі на сэрверы. Поўны заказ/product запісы і ўлавыя блокі карт не падтрымліваюцца.