SelSup platformasi · Yoʻlboshchilar
kengaytmalar va maxsus integratsiyalar
Har qanday tizimdan foydalanib odatdagi HTML/JavaScript sahifasini yarating. SelSup uni iframega o'rnatadi; u sizning React kodingizni kabinet ichida bajarmaydi.
Har qanday tizimdan foydalanib odatdagi HTML/JavaScript sahifasini yarating. SelSup uni iframega o'rnatadi; u sizning React kodingizni kabinet ichida bajarmaydi.
Dastur ishlab chiquvchilar va texnologiya sheriklari1
Integratsiya turi tanlang
- 1
Tashqi orqa tomoni xizmati
ERP, veb-do'kon, WMS, BI va shunga o'xshash sinxronlashtirish uchun eng yaxshi. Token serveringizda qoladi va ma'lumotlar API va vebhoqlar orqali harakatlanadi.
- 2
Kabinet iframe paneli
Har qanday tizimdan foydalanib odatdagi HTML/JavaScript sahifasini yarating. SelSup uni iframega o'rnatadi; u sizning React kodingizni kabinet ichida bajarmaydi.
- 3
SelSup orqa qismini
SelSup-ning umumiy orqaga chiqish jarayonlarida ishtirok etish uchun chuqur bozor yoki etkazib berish integratsiyasi uchun zarur.
Avval bitta to'liq ish oqimini va uning kuzatilishi mumkinligini amalga oshirish.
2
Tashqi dasturlar arxitekturasi
Tokeni sirlar menejerida saqlang va SelSup-ni faqat sizning orqa tomondan chaqiring. brauzer dasturingiz API bilan gaplashishi va SelSup tokenini hech qachon olmasligi kerak.
SelSup adapteri, ish navbatlari va domen modeli ajratish. API shartnomasi o'zgarishlari keyinchalik ilova qolganidan ajratib qolish.
O'zgarishlar uchun kirish qutisi va chiqish qutisi ishlatilsin. Ikkala jurnal ham takrorlash va auditni qo'llab-quvvatlashi kerak.
SelSup webhook → inbox → domain worker → ERP/WMS
ERP/WMS change → outbox → SelSup API → reconciliation
API bilan bog'liq oxirgi nuqtalar
GET/api/product/findKamon oʻqish namunasiniGET/api/order/findOʻsish sinxronizatsiyasi misoli
3
Kabinet iframe paneli
Har qanday tizimdan foydalanib odatdagi HTML/JavaScript sahifasini yarating. SelSup uni iframega o'rnatadi; u sizning React kodingizni kabinet ichida bajarmaydi.
Panelni kabinet bilan cookie domenini bo'shatib bo'lmagan alohida HTTPS saytida joylashtiring. Ochiq integratsiyalar → Mening kengaytmalar → kengaytmani qo'shing va ism, nishoncha, URL, menyu bo'limi va pozitsiyani tanlang. Ruqsatsiz xususiy panelni saqlash, so'ngra faqat kerakli ruxsatlarni qo'llash. Do'kon nashr qilish SelSup tekshiruvi talab qiladi.
4
Server tarafidagi integratsiya moduli
Bozor integratsiyasi odatda tokenlar, kartalar, narxlar, aktsiyalar, buyurtmalar va fon holati yangilanishlarini o'z ichiga oladi.
Ushbu modul SelSup asosiy orqa qismini o'zgartiradi va uning qayta ko'rib chiqish, sinov, mahalliylashtirish va chiqarilish jarayonini davom ettiradi.
API tashqi xatolarini barqaror ApplicationError qiymatlariga va bekor qilingan yoki haqiqiy bo'lmagan tashqi tokenlarni Backend loyihalari qoidalariga muvofiq AccessException-ga aylantirish.
Bajarga oid maydonlarni umumiy entitetlarga qo'shmang. Integratsiya DTOlarida xom shartnomalarni saqlang va ularni chegaralarda xarita qiling.
5
Bo'shash va ishlash
- 1
Sinov hisobini yaratish
Mijozlarning ishlab chiqarish ma'lumotlaridan test tokenlari, omborlar, mahsulotlar va buyurtmalar ajratish.
- 2
Koʻrib chiqish imkoniyatini qoʻshish
Qatlamning kechiktirilishini, kod bo'yicha xatolarni, qayta urinishlarni hisoblashni va kelishishning ziddiyatlarini kuzatish.
- 3
Shartnomalar migratsiyasini rejalashtirish
O'zgarish paytida eski maydonlarni qo'llab-quvvatlash va eski formatni o'chirib tashlashdan oldin iste'molchilarni joylashtiring.
- 4
Hujjatlar uzilish
Foydalanuvchilar tokenni bekor qilishni, veb-qutni olib tashlashni va ma'lumotlarni yo'qotmasdan sinxronizatsiya qilishni to'xtatishni bilishlari kerak.
6
Mahsulot va buyurtma tablari
Menyu sahifasini (MENU_PAGE), mahsulot kartasi tabini (PRODUCT_TAB) yoki buyurtma tabini tanlash. Menyu bo'limi va pozitsiyasi faqat MENU_PAGE uchun qo'llaniladi. Tablar uchun ID bilan saqlangan entitet kerak.
7
Konteks va ruxsatnomalar
Faqat berilgan kontekst maydonlari qo'shilmoqda. USER user.id va user.locale; KLIENT client.id; ORGANIZATION mavjud tashkilotning nomi va nomi taqdim etadi. PRODUCT mahsulot kartasida product.modelIdni alohida beradi; ORDER buyurtma uchun order.idni beradi. To'liq rekordlar, kontaktlar, parollar va tokenlar istisno qilinadi. Bular allaqachon ochilgan sahifaning identifikatorlari, sizning orqa tomondan kirish uchun dalil emas.
{
"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
xabar xabarlari v1 xabarlar
Ta'minlangan holatni tekshirish. voqea.origin, event.source === window.parent, xabar turi, versiyasi va tuzilishini tekshirish. Yangilashtirish uchun aloqa va so'rov-ma'noda tayyor yuborish. SelSup kirishni qayta tekshiradi va tez-tez so'rovilarni birlashtiradi. Hech qachon URL, panel localStorage yoki xabarlarda belgini o'tkazmang.
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 ko'prikidan o'tadi
Muallif kengaytma sozlamalarida talab qilingan usullarni e'lon qiladi. Har bir o'rnatish mijozi ushbu deklaratsiyadan usullarni aniq beradi. API kirish andozalari mavjud o'rnaklar ham o'z ichiga olmaydi. So'ralgan ro'yxatni o'zgartirish boshqa qayta ko'rib chiqish talab etiladi; o'rnatib qo'yilgan nusxalari hech qachon avtomatik ravishda yangi ruxsatnomalarni olmaydilar.
Xost faqat SelSupFront xizmatlari orqali quyidagi usullarni joriy xodimlarning ruxsatnomalari bilan chaqiradi. mavjud serverga kirish nazoratlari hali ham amalda. ClientService va authService to'liq taqiqlangan; ushbu ro'yxatdan tashqari barcha usullar ham rad etiladi. Ilovalar URL, sarlavhalar, tokenlar yoki ixtiyoriy Axios konfiguratsiyasini taqdim eta olmaydi. Server joriy o'rnatishni va uning grantlarini API so'rovida tekshiradi.
API grantlari kontekst ruxsatnomalariga bog'liq emas. context.apiMethods berilgan usullarni ro'yxatga oladi. Grant faqat joriy tabdagi entitet emas, balki xodimning kirish imkoniyati doirasida kabinet bo'ylab usulga amal qiladi. Natijalar faqat hujjatlashtirilgan maydonlarni, hech qachon Axios ob'ektlari yoki ma'lumotlarini o'z ichiga oladi.
Bir parvoz so'rovi va soniyaga eng ko'pida bir boshlash. So'nggi 256 ta so'rov IDlari nusxalardan himoyalangan. Uy egalari xatolari: ACCESS_DENIED, INVALID_REQUEST, RATE_LIMITED, EDUPLICATE_REQUEST, eREQUEST_FAILED. SDK xatolari NOT_CONNECTED, DISCONNECTED va TIMEOUT (20 soniya) ni ham o'z ichiga oladi. Hech qachon mutatsiyalarni avtomatik ravishda qayta urmang: error, vaqt o'tkazib yuborish yoki iframe yopish operatsiyani ortga qaytarilganligini anglatmaydi.
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
Namunaviy dastur va xosting
Namuna GitHub-ning mustaqil omborga nusxa olish mumkin. Node.js 22+, npm test va npm start testlar va API kalitlari yoki haqiqiy ma'lumotsiz mahalliy mock kabinet bilan. Config.js-ni konfiguratsiya qiling va HTTPS-ga 5 ta statik fayllarni joylashtiring. Quyidagi arxivni yuklab oling va uning tarkibini GitHub omboringizga nusxa oling.
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
Xavfsizlik chegaralari
Sandbox shakllarni, ko'tarilgan oynalarni, yuklab olishlarni, eng yuqori navigatsiya va sezgir brauzer API-larini bloklaydi. Panel kelib chiqishi iframe ustida ko'rsatiladi. kengaytma hech qachon SelSup parol so'rashi kerak emas. Sayti hali ham tashrif buyuruvchi IP-ni ko'rish va unga berilgan ma'lumotlarni saqlab qolish yoki uzatish mumkin. Tekshirish tashqi URL-da xizmat ko'rsatilgan kodni muzlatib bo'lmaydi. Faqat zarur ruxsatlarni berish.
SelSup o'zi iframe bridge qo'ng'iroqlarini ruxsat beradi; kukilar va tokenlar hech qachon ilovaga etib bormaydi. Sizning o'zingizning orqa tomoni hali ham o'z tasdiqlanishiga muhtoj: kontekst kimligini isbotlamaydi. Faqat uzoq umr ko'ringan SelSup tokenlarini serveringizda saqlang. To'liq buyurtma/product yozuvlari va ichki karta bloklariga qo'llab-quvvatlanmaydi.