用途:在 Salla 商家后台内嵌入自定义 iframe 页面(嵌入式应用)。流程按顺序执行,每步通过后再进入下一步。
注册页面:调用 salla_embedded_pages(list/create/update/delete)管理嵌入式页面。前置条件为已连接 Salla Partners MCP 且持有 app_id。create 需提供 route(kebab 路径段,≥3 字符)、iframe_url,可选 default。手动方式:Portal → App Details → Embedded Pages → Add page。若工具返回“Salla session expired”,重新执行登录流程。
安装与初始化:npm install @salla.sa/embedded-sdk,从包中导入 embedded(不要依赖 CDN 全局)。每次页面加载调用 await embedded.init({ debug: false }) 建立 postMessage 桥并获取 layout(theme、locale、dir)。宿主需允许被 Salla 框架嵌入(设置 Content-Security-Policy: frame-ancestors https://s.salla.sa,移除 X-Frame-Options),否则面板空白。开发时需隧道映射 localhost 并将 iframe_url 指向隧道。
鉴权(Trust-but-Verify):前端只做“信使”。用 embedded.auth.getToken() 从 iframe URL 取短时令牌,交给自有后端;后端用 POST https://api.salla.dev/exchange-authority/v1/introspect(请求头 S-Source: <YOUR_APP_ID>,请求体 { "token": "..." })校验,读取 data.merchant_id / data.user_id / data.exp,再签发自有会话。后端确认并加载数据后再调用 embedded.ready();失败调用 embedded.destroy() 以免面板卡在加载层。后端返回 401 时调用 embedded.auth.refresh()。embedded.auth.introspect() 仅供开发调试,不可作为主要鉴权方式。身份只能来自 introspection,所有路由与查询需按 merchant_id 限定。
主题与语言:主题、语言、方向取自 init() 返回的 layout,不要手动读查询参数;重新初始化后需重新应用。
SDK 模块:auth(refresh/destroy)、page(setTitle、navigate、redirect、navTo)、nav(setAction/onActionClick/clearAction)、ui(toast、loading、confirm、breadcrumbs)、checkout(插件购买,参见 addon 相关技能)。涉及可见 UI 时需改用 salla-embedded-ui,其原生令牌、No-Chrome、RTL、截图等门槛为强制要求。
发布:嵌入式页面随父应用发布而生效。图片规则:Embedded App Banner(embedded_image)最小 710×260 px,推荐 1420×520,最大 512 KB,在 app_publish 的 features 分区设置;Salla 推广图尺寸需通过 app_publish readiness / salla-docs 确认。
限制与暂未提供:未说明定价、收费或效果数据;部分尺寸与步骤细节需以官方文档为准。