说明
1、该文档适用于魔方 SaaS 版本、魔方私部 v4.11+ 版本。
2、C端登录态对接,适用的 H5 场景:
3、接口对接使用 GMP 标准的 Webhook 对接,对接前可阅读【外部 v3.12-v4.1】GMP通用Webhook对接 。
整体操作步骤
魔方 H5 支持对接 App、小程序的登录态,需要完成 4 个步骤
在 App/小程序 打开魔方 H5,根据登录状态可分为两个阶段:
阶段一:App/小程序 未登录阶段:H5 会触发打开 App/小程序 的登录页面(如果能确保打开 H5 时,App 已登录,则忽略此阶段)。
阶段二:App/小程序 已登录阶段:H5 会通过 Token 对接的方式,获取到 App/小程序 中登录的用户信息。
具体的数据交互参考下图,需要客户侧提供 3 个方面的支持:
事项 | 说明 | 支持人员 |
|---|---|---|
App能力注入H5 | App 提供获取 Token 的能力、打开登录页面的能力,并通过 JSB 注入到 H5 中 | App 研发人员 |
SDK.js | 编写 js 逻辑对接 JSB,主要提供 2 个方法
| 前端研发人员 |
用户信息接口 | Server 提供通过 Token 获取用户信息的接口 | 后端研发人员 |
其中 2、3 是需要重点关注的,下方文档有详细说明,完成这两步后即完成了登录态的对接。
不同的 App 注入的 JSB 可能不太一样,所以需要 SDK.js 作为中间层抹平这些差异,提供统一的方法供 H5 调用。
小程序无法注入 JSB,可以考虑通过 Url 传递 Token,下方有详细说明。
SDK.js 将在 H5 中直接加载,不会经过编译,请避免写入敏感信息、浏览器无法执行的 JS 语法。
// SDK.js 的 ts 类型说明 interface AccessTokenResult { statusCode: number; // 返回码 0:成功,-1:失败 data: { access_token: string; // 具体的 Token } } interface MagicJSBridge { // 打开 App 登录页 openLogin: () => void // 获取登录 Token // 具体实现是异步获取的话,可以返回 Promise getAccessToken: () => AccessTokenResult | Promise<AccessTokenResult>; }
示例
window.MagicJSBridge = { openLogin() { // 替换成业务自己的弹出登录框/跳转登录页面逻辑 alert('弹出登录框') }, getAccessToken() { // 替换成业务自己的获取 token 逻辑 // 支持返回 Promise return Promise.resolve({ statusCode: 0, data: { access_token: 'your token' } }) }, }
小程序特别说明
小程序嵌入 H5,小程序与 H5 通信比较复杂,可以考虑在打开 H5 时,将 Token 添加在 H5 Url 中,SDK.js 中在 Url 中获取。示例:
window.MagicJSBridge = { getAccessToken() { // Url 类似 http://a.com/xxxxxx?token=xxxxxxx const key = 'token' // 参数名可自定义 const h5url = new URL(location.href) if (h5url.searchParams.has(key)) { const token = h5url.searchParams.get(key); // (重要)清除 Url 中的 Token,避免分享了带 Token 的地址 // 同时,建议 Token 有时效性,避免泄露 Token 后越权登录 h5url.searchParams.delete(key); history.replaceState({}, '', h5url.toString()); // 返回 Token if (token) { return { statusCode: 0, data: { access_token: token } } } } return { statusCode: -1, data: {} } } }
在 活动落地页 -> 应用管理页面,创建/编辑应用时,上传这个 SDK.js。之后在创建 H5 时关联该应用,则会加载、执行这个 SDK。
客户侧 Server 需要提供一个接口,传入Token,返回用户信息,魔方 Server 将调用这个接口。
一些场景的说明:
请求字段
参数名 | 参数类型 | 是否必填 | 参数位置 | 描述 |
|---|---|---|---|---|
access_token | string | 必填 | body | 代表用户登录态的token |
响应字段
参数名 | 参数类型 | 描述 |
|---|---|---|
code | int | 状态码:0表示成功 |
msg | string | 状态信息 |
data | object | C端用户信息 |
data 字段结构
参数名 | 参数类型 | 是否必须 | 描述 |
|---|---|---|---|
uid | string | 必须 | C端用户唯一id标识,用于参与活动、身份识别、发放奖励等 |
username | string | 可选 | C端用户名称,用于活动玩法记录、部分页面组件展示 |
avatar | string | 可选 | C端用户头像,用于部分页面组件展示 |
extra | object | 可选 | 客户端有多个用户id需要保存在活动玩法的参与记录时,可以通过extra进行同步,示例格式如下: |
JSON 示例
// POST 方法请求 // 1. 传入数据 { access_token: 'my token'; // SDK 中 MagicJSBridge.getAccessToken 返回的 access_token } // 2. 返回用户信息 { statusCode: 0; // 0: 成功 其他: 失败 message: ''; data: { uid: '1000001'; // 用户身份 id,最重要 username: '用户1'; // 用户名称(可选字段) avatar?: 'http://a.com/b.png'; // 用户头像(可选字段) extra: { // 可拓展透传其他字段(可选字段) id_list: [{ user_id: '11111', // id 值 id_type: 'did' // id 类型 }] } } }
Webhook 是 GMP 的一个通用化对接能力。
调用外部接口时,可以对请求地址、鉴权方式、HTTP方法、完整的请求参数以及请求响应解析规则进行配置。具有较高的通用性。同时,允许自定义请求处理脚本、自定义响应处理脚本,可自行适配接口的认证机制。
细节可参考【外部 v3.12-v4.1】GMP通用Webhook对接
不同的魔方版本,配置的方法不同,先在页面中查看版本
配置页面路径: 管理中心 -> 集成中心
点击「创建业务」,填写必要信息,模版选择「魔方-C端登录系统对接」
编辑「集成流程」中的「拉取用户信息」节点,填写必要信息
字段 | 说明 | 备注 |
|---|---|---|
接口类型 | 选择「同步调用外部接口」 | |
对接系统 | 作用不大,选择一个即可,没选项时,填写一个再点击「新增系统」 | |
接口状态 | 开启 | |
请求地址 | 填写接口地址 | |
鉴权方式 | 如果接口需要鉴权,则进行新建并选中 | |
QPS上限 | 按需填写,一般为 100 | |
请求方法 | 按需填写,一般为 POST | |
Content-type | 按需填写,一般为 application/json | |
body配置 | 按需填写,需要在接口入参增加固定参数时填写,需要动态参数则填写「自定义请求处理脚本」 | |
自定义请求处理脚本 | 如果接口的入参是标准的,则不需要填写,否则需要重新组装入参,具体参考 【外部 v3.12-v4.1】GMP通用Webhook对接 | |
自定义响应处理脚本 | 接口的响应与标准相差较大时,可进行填写,具体参考 【外部 v3.12-v4.1】GMP通用Webhook对接 | |
成功响应配置 | 按实际情况填写,标准接口如图填写 | |
响应字段配置 | 按实际情况填写,标准接口如图填写 |
配置页面路径: 管理中心 -> 魔方接口 -> C端用户登录态
配置接口
我们提供了一份标准的配置,可以导入后,根据实际情况修改接口路径、字段配置、处理脚本等。
token模式登录接口配置:
[{"InterfaceId":10110,"CustomCallSuite":{"BasicCustomCallConfig":{"TargetUrl":"https://gmp-saas-stage-api.console.volcengine.com/gmpb/magic/openapi/playing/customer/tokenLoginSimulation","Method":1,"BodyConfig":{"ContentType":1,"BodyParams":[{"ParamName":"access_token","ParamType":25,"Value":"$.access_token","IsRequire":false}],"JsonBody":"{\n \"access_token\": \"${access_token}\",\n \"clientSecret\":\"zyh_test\",\n \"gmp_test_uid\":\"123\",\n \"gmp_test_user_name\":\"123\"\n}"},"RespJudgeConfig":{"SuccessRules":[{"HttpStatus":200,"JsonPath":"$.code","Operator":1,"Value":"0","ShouldRetry":false}],"FailRules":[{"JsonPath":"$.code","Operator":2,"Value":"0","ShouldRetry":false}]},"CustomCallType":1,"HttpReqConfig":{"TargetUrl":"https://gmp-saas-stage-api.console.volcengine.com/gmpb/magic/openapi/playing/customer/tokenLoginSimulation","Method":1,"BodyConfig":{"ContentType":1,"BodyParams":[{"ParamName":"access_token","ParamType":25,"Value":"$.access_token","IsRequire":false}],"JsonBody":"{\n \"access_token\": \"${access_token}\",\n \"clientSecret\":\"zyh_test\",\n \"gmp_test_uid\":\"123\",\n \"gmp_test_user_name\":\"123\"\n}"},"RespJudgeConfig":{"SuccessRules":[{"HttpStatus":200,"JsonPath":"$.code","Operator":1,"Value":"0","ShouldRetry":false}],"FailRules":[{"JsonPath":"$.code","Operator":2,"Value":"0","ShouldRetry":false}]}},"RetryForDownStreamErr":false,"MaxRetryCount":3,"TimeoutMs":3000,"QpsLimit":100},"ConcernInfoConfigs":[{"Key":"code","JsonType":2,"JsonPath":"$.code"},{"Key":"message","JsonType":1,"JsonPath":"$.msg"},{"Key":"uid","JsonType":1,"JsonPath":"$.data.uid"},{"Key":"user_name","JsonType":1,"JsonPath":"$.data.username"},{"Key":"avatar","JsonType":1,"JsonPath":"$.data.avatar"},{"Key":"extra","JsonType":1,"JsonPath":"$.data.extra"}]},"Name":"模拟客户token登录接口","Type":1,"ModuleTag":"magic_thirdparty_userinfo","InterfaceType":"magic_login_with_token_cookies","Status":1,"Creator":"saas_test_cdp_2","Updater":"saas_test_cdp_2","CreatedAt":1696981769,"UpdatedAt":1696981782,"Platform":"default","ListDisplayConfig":{"DisplayConfigList":null,"ArrayJsonPath":"","CountJsonPath":""},"SupportBatch":0,"AsyncSwitch":0,"AsyncConfig":{"AsyncIsBatchResp":0,"AsyncMsgIdType":0,"AsyncUpChannelId":0}}]
对接完后,可新建一个活动,通过测试链接访问(即地址路径带 beta 的),点击右下角的 ⚙️,类似浏览器中的 F12,可查看 console 和 network 信息。
预览地址获取方式:
活动列表页找到对应活动 -> 点击编辑进入编辑页 -> 点击右上角的预览 -> 点击获取测试链接
可重点关注 2 个节点
建议检查 console 中是否有 SDK.js 报错信息,是否有 App Webiew 无法执行的 JS 语法,比如 ES6、ES7 语法。
// 错误码对应关系 -14701 // 魔方应用未配置登录 webhook -14702 // webhook调用错误,1. webhook 开关没打开;2. webhook 配置的接口从魔方 Server 无法访问 -14703 // 登录认证服务异常,webhook 配置的接口返回了异常数据 -14704 // token解析失败
魔方 H5 支持对接 App 的分享能力,需要做三部分的工作:
调用链路如下
share 方法的类型
interface ShareParams { // 1. 页面分享信息 link: string; // 当前页面地址 title: string; // 当前页面标题 desc: string; // 当前页面描述 // 2. 当前用户信息 + 活动信息 user: { uid?: string; username?: string; avatar?: string; }; appId: string; // 活动绑定的应用Id activityId: string; // 活动Id // 3. 玩法 + 任务信息 playRuleId?: string; // 玩法Id,分享任务组件才有 taskId?: string; // 任务Id,分享任务组件才有 } interface MagicJSBridge { // 分享 share: (params: ShareParams) => boolean | void; }
代码示例
window.MagicJSBridge = { share(params) { // 替换成业务自己的分享逻辑 console.log('MagicJSBridge.share', params) alert('分享') } }
在活动编辑页面,配置活动分享信息,包括标题、描述、图片,这些信息将会传入 share 方法
分享的卡片样式仅供参考,最终效果取决于分享发起方和分享目标渠道
搭建页面时,使用分享按钮组件,并且分享方式选择「端内分享+海报兜底」,用户点击该按钮,将会唤起 App 分享能力
魔方 H5 支持在浏览器唤起 App,并定位到活动页,需要完成 3 个步骤:
调用链路如下
魔方应用中配置 UA,配置为 App 打开 WebView 时,在 User-Agent 中设置的特殊字符串(需要适配多个 App 时,可填写正则字符串),有2 个途径获取特殊字符串:
以微信为例,可以判断出来,微信的 UA 可配置为 MicroMessenger 。
用于端外访问H5时,自定义跳转端内的地址,可返回2个地址:
方法类型:
interface MagicJSBridge { // 获取跳转App地址 getSchemeAndLink?: () => { // 跳转页面地址 link: string; // App scheme,有值的话会尝试调起,微信内不支持 scheme?: string; } }
代码示例
window.MagicJSBridge = { getSchemeAndLink() { // 替换成业务自己的 getSchemeAndLink 逻辑 return { link: 'https://weixin.qq.com', scheme: 'weixin://' } } }
魔方 H5 支持 2 中维度的埋点定制化:
现有事件属性可参考 魔方toB埋点事件-属性(对外版),如果需要增加属性,通过以下步骤增加
默认埋点属性中,source 字段是为投放渠道预留的字段,需要的话可直接使用,不需要再增加属性
设置方法
实现效果
一般而言,数分系统不会接收任意属性,需要在后台配置。以 Finder v4.9.0 为例:(需要采购 Finder)
在 数据管理 ->元数据管理 -> 事件属性 -> 新建用户属性 中新建属性。
新建为 公共属性,或者 关联上魔方事件(需要在哪个事件中增加属性,则关联哪个,可多选)
三方系统也是类似操作,确保属性上报后,系统会进行接收存储。
魔方提供 2 种方式增加属性
修改 应用管理 的 SDK.js,实现 getFinderEventData,进行定制化上报数据。
window.MagicJSBridge = { // ... getFinderEventData(originData) { // 增加属性 originData.custom_prop_a = 'some value' // 同时,支持修改原有属性 originData.old_prop_a = 'some value' // 需要注意,如果使用 Finder 上报 + 修改公共属性的话,需要额外设置 window.collectEvent('config', {evtParams: {common_prop_a: 'some value'}}) // 公共属性包括:activityId, productUId, applicationId, app_id, project_id, // language, osType, logCode, source, activityVersion, magicVersion, location, channel, h5url return originData } // ... }
通过 URL 传到 event_params 参数增加属性,需要对参数值进行 JSON 序列化 + Base64 处理。
// 以浏览器中的 JS 环境为例 // 1. 需要增加的属性 const props = { custom_prop_a: 'some value' } // 2. JSON 序列化 const json = JSON.stringify(props) // {"custom_prop_a":"some value"} // 3. Base64处理 const value = btoa(json) // eyJjdXN0b21fcHJvcF9hIjoic29tZSB2YWx1ZSJ9 // 4. 拼接 H5 URL const url = 'https://a.com/magic/eco/runtime/release/6673f62ce9e36400202fdffd?event_params=' + value
修改 应用管理 的 SDK.js,实现 sendLog,将魔方埋点数据上报到三方系统。
// 1. 将三方系统的上报 SDK 代码粘贴进来 window.MagicJSBridge = { // ... // 2. 实现 sendLog 方法 // 页面的埋点数据,将调用这个方法上报 sendLog(data) { console.log('事件名', data.event) console.log('事件数据', data.params) // 3. 这里调用三方 SDK 的上报方法 } // ... }
页面分享的卡片展示效果,最终由分享的源平台 + 分享的目标平台决定的,魔方系统无法决定。
对于微信的分享卡片展示效果:
场景
在微信中扫码、点击链接打开魔方H5,点击页面按钮关闭H5
实现
在按钮中「编辑交互动作」,配置如下
window.WeixinJSBridge && window.WeixinJSBridge.call('closeWindow')
<view> <!-- url 为 H5 的地址 --> <web-view src="{{url}}" /> </view>
可在 H5 使用 weixin sdk 进行自关闭,以点击按钮关闭为例。
在按钮中「编辑交互动作」进行配置
const $s = document.createElement('script') $s.setAttribute('src', 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js') window.oldDefine = window.define window.define = null document.head.appendChild($s) setTimeout(() => { window.define = window.oldDefine }, 1000)
// 关闭 H5 wx.miniProgram.navigateBack({ success: (res) => { console.log('success', res) }, fail: (err) => { console.log('fail', err) } }) // 跳转到其他页面 wx.miniProgram.navigateTo({ // 小程序页面路径 url: '/pages/index/index', success: (res) => { console.log('success', res) }, fail: (err) => { console.log('fail', err) } })
更多功能参考微信的sdk文档 https://developers.weixin.qq.com/miniprogram/en/dev/api/route/wx.switchTab.html
场景
H5 中点击按钮,跳转到微信小程序制定页面
实现
在按钮中「编辑交互动作」,配置如下
跳转链接说明
跳转链接为小程序明文 scheme,相关文档
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html
格式 weixin://dl/business/?appid=*APPID*&path=*PATH*&query=*QUERY*&env_version=ENV_VERSION 示例 weixin://dl/business/?appid=wxbee437cfe27aec05&path=pages/index/index
需要注意,跳转的 path 需要配置加白,才能跳转成功
字段 | 描述 | 示例 |
|---|---|---|
应用名称 | 名称展示场景
| 抖音 |
用户SDK | 实现 H5 与 App 的对接,包括登录页、登录态、分享能力、端外拉起App、数据埋点定制 | douyin.sdk.js |
关联接口配置 | 进行魔方服务器与客户服务器对接,实现登录信息获取 | 抖音登录OpenApi接口 |
关联finder应用 | finder数据上报时,关联该应用 | finderapp001 |
User Agent | App 创建 WebView 时设置的 UA,用于 H5 判断当前打开的容器,是端内还是端外 | douyin,默认为 mozilla |
端外跳转链接 | H5 在端外打开时,用户参与玩法时(比如点击抽奖),会调到该页面,可以在该页面实现拉起App/引导下载App | https://douyin.com/download |
端外跳app回调参数名 | 用于广农信自定义端外跳转链接的格式,不建议使用,建议使用 SDK 对接 | |
活动下线后的跳转链接 | 活动下线后,用户访问活动,将跳转到该地址。如不设置,将在原活动页面展示下线图片 | https://douyin.com/offline |
指定用户id类型 | finder上报时,用户登录 uid 对应 cdp 图谱中的字段名称 | finder_uid |
应用图标 | 仅在应用列表展示 |
魔方 H5 通过该 SDK,对接 App 的各项能力
window.MagicJSBridge = { openLogin() { // 替换成业务自己的弹出登录框/跳转登录页面逻辑 alert('弹出登录框') }, share(params) { // 替换成业务自己的分享逻辑 console.log('MagicJSBridge.share', params) alert('分享') }, getAccessToken() { // 替换成业务自己的获取 token 逻辑 // 支持返回 Promise return Promise.resolve({ statusCode: 0, data: { access_token: 'your token' } }) }, getSchemeAndLink() { // 替换成业务自己的 getSchemeAndLink 逻辑 return { link: 'https://weixin.qq.com', scheme: 'weixin://' } }, getFinderInitOptions(options) { // 修改 finder 初始化参数,使用火山的 finder 埋点系统才有效 options.disable_auto_pv = true return options }, getFinderEventData(eventData) { // 修改 finder 埋点数据,使用火山的 finder 埋点系统才有效 eventData.aaa = 1 return eventData } // 页面的埋点数据,将调用这个方法上报 sendLog(data) { console.log('事件名', data.event) console.log('事件数据', data.params) // 这里调用三方 SDK 的上报方法 } }