一、功能简介
1.1 原请求数据中 userOpenId 和 deviceOpenId 的局限
在真机测试或线上用户使用时,请求数据 中 requestData 字段里会携带用户和设备的相关信息:userOpenId 和 deviceOpenId。
它们的加密源数据中包含 技能id,所以即使是同一个用户或设备,在使用不同的技能时,所携带的 userOpenId 和 deviceOpenId 也是不一样的。也就是说:通过 userOpenId 和 deviceOpenId 数据,只能在同一个技能内判断是否是相同的用户或设备。
1.2 如何实现跨应用区分是否是同一个用户或设备?
需要用到 获取用户、设备唯一标识 的功能。此功能是通过 组织 来实现的。可以创建一个组织,并将多个应用挂载到同一个组织下。
用户在使用挂载到组织下的技能时,会额外携带 deviceUnionIds 和 userUnionIds 数据。这两个数据的加密就跟技能id没关系了,只会根据组织id进行加密。同一个用户或设备,在使用挂载到同一个组织下的多个技能时,会携带相同的 deviceUnionId 或 userUnionId 数据。就可以根据这个数据在多个技能间,区分是否是相同的用户或设备。
请求数据中携带的是 deviceUnionIds 和 userUnionIds 数据,可以携带多个 unionId 。因为可以创建多个组织,并且一个技能可以挂载到多个组织下。如果技能在多个组织下,则会携带多个 unionId。
二、功能开通
目前创建组织和挂载技能还没有开放,需要平台的同学帮助创建和挂载。如果需要使用此功能,请在答疑群中联系相关的同学帮您开通此功能。
钉钉答疑群:“AliGenie 开发者答疑交流群”,搜索群号:31630820 加群。或手机钉钉扫描群二维码加群:
您需要提供数据为:组织名称(用来创建组织),至少两个需要挂载的应用信息(单个应用没必要挂载组织)。
- 挂载自定义技能:需要提供技能id(SKILL_ID);
- 挂载小程序应用:需要提供小程序应用的支付宝小程序id(MINIAPP_ID)和 技能id(SKILL_ID,如上);
- 挂载APP应用:需要提供APP应用apk包的packageName(PACKAGE_NAME)和 技能id(SKILL_ID,如上)。
三、功能使用
3.1 自定义技能
当组织创建并挂载好技能后,真机测试和用户使用技能时,请求数据中 requestData 字段里会额外携带 deviceUnionIds 和 userUnionIds 数据。示例数据如下:
{
"sessionId": "b112a091-1523-4d2d-8059-e09461dafd73",
"utterance": "魔都今天天气",
"token": "ozkYw9Y8*******lffDM",
"requestData": {
"userOpenId": "qEwt1DUEBAjUQ7YKZNI6tDy2SctjWCOOTKQyogu1cLE=",
"deviceOpenId": "1iwSj2tFWJMecJu6ys7TsyA9bUCit4vUAKV3xQWK2ymR6FAoxQ9DMg==",
"city": "上海" ,
"deviceUnionIds":"[{\"organizationId\":\"1\",\"unionId\":\"rwvxFQtLrV8cTipiF4C500imNZhO3NZp0IX6HiUPbjISvf8Rvxp6D6vWcXFNlDBppJLQj2cZhVF3OjwUe4sZDw==\"},{\"organizationId\":\"2\",\"unionId\":\"Rx83mhF/yCQbTULmgtPqCFFCJYkQLU3Xmbt2aW9t1nd2DIeeqH9G7VZfuP81EtEz1G87A/bt192s1Sted5bGtQ==\"}]",
"userUnionIds": "[{\"organizationId\":\"1\",\"unionId\":\"rX5uwo/CYh6EHayvuFSydPhxNENKsAVAMgPHDI0ZhlIbuXK6u6skr6/yhNkStwrH\"},{\"organizationId\":\"2\",\"unionId\":\"Ut666l/h3J69dwcN99nLAMfzSpLDo2Ct2LyMF277QpOY=\"}]"
},
"botId": 10,
"domainId": 12345,
"skillId": 23456,
"skillName": "天气小助手",
"intentId": 34567,
"intentName": "weather",
"slotEntities": [
{
"intentParameterId": 45678,
"intentParameterName": "city",
"originalValue": "魔都",
"standardValue": "上海",
"liveTime": 0,
"createTimeStamp": 1564110905331,
"slotName": "city:city",
"slotValue": "魔都"
},
{
"intentParameterId": 56789,
"intentParameterName": "time(公共实体)",
"originalValue": "今天",
"standardValue": "今天",
"liveTime": 0,
"createTimeStamp": 1564110905331,
"slotName": "time(公共实体):sys.time",
"slotValue": "今天"
}
],
"requestId": "20190726111511958-508551760",
"device": {
"deviceOpenId": "1iwSj2tFWJMecJu6ys7TsyA9bUCit4vUAKV3xQWK2ymR6FAoxQ9DMg=="
},
"skillSession": {
"skillSessionId":"8d7501fe-a80a-46cf-a43f-ff8743a7ec66",
"newSession":true
}
}
示例请求数据中,演示的是技能挂载到两个组织下的情况。如果只挂载了一个组织,则 unionId 只有一条。
开发者在获取到 deviceUnionIds 和 userUnionIds 后,需要手动的将 value 值转换成一个 List 集合,然后再从集合中获取每条 unionId 数据。然后根据 organizationId 字段判断这条 unionId 数据属于哪个组织。同一个组织下的多条 unionId 才可以进行判断。
3.2 APP应用
APP应用的回复逻辑是“NLU结果透出”,平台会直接将语音指令返回给设备端,触发apk的语音回调。开发者不需要提供后端服务,那么APP应用获取 deviceUnionIds 和 userUnionIds 数据就不是通过后端服务的请求数据获取了,而是在apk内通过 AGUI SDK 提供的方法获取。
具体获取方式请参考 AGUI SDK 的使用文档,并在apk内使用应用控制台提供的新的语音 SDK。