一、功能简介
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。