一、功能简介

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 加群。或手机钉钉扫描群二维码加群:

image.png

您需要提供数据为:组织名称(用来创建组织),至少两个需要挂载的应用信息(单个应用没必要挂载组织)。

  • 挂载自定义技能:需要提供技能id(SKILL_ID);

image.png

  • 挂载小程序应用:需要提供小程序应用的支付宝小程序id(MINIAPP_ID)和 技能id(SKILL_ID,如上);

image.png

  • 挂载APP应用:需要提供APP应用apk包的packageName(PACKAGE_NAME)和 技能id(SKILL_ID,如上)。

image.png

三、功能使用

3.1 自定义技能

当组织创建并挂载好技能后,真机测试和用户使用技能时,请求数据中 requestData 字段里会额外携带 deviceUnionIds 和 userUnionIds 数据。示例数据如下:

  1. {
  2. "sessionId": "b112a091-1523-4d2d-8059-e09461dafd73",
  3. "utterance": "魔都今天天气",
  4. "token": "ozkYw9Y8*******lffDM",
  5. "requestData": {
  6. "userOpenId": "qEwt1DUEBAjUQ7YKZNI6tDy2SctjWCOOTKQyogu1cLE=",
  7. "deviceOpenId": "1iwSj2tFWJMecJu6ys7TsyA9bUCit4vUAKV3xQWK2ymR6FAoxQ9DMg==",
  8. "city": "上海" ,
  9. "deviceUnionIds":"[{\"organizationId\":\"1\",\"unionId\":\"rwvxFQtLrV8cTipiF4C500imNZhO3NZp0IX6HiUPbjISvf8Rvxp6D6vWcXFNlDBppJLQj2cZhVF3OjwUe4sZDw==\"},{\"organizationId\":\"2\",\"unionId\":\"Rx83mhF/yCQbTULmgtPqCFFCJYkQLU3Xmbt2aW9t1nd2DIeeqH9G7VZfuP81EtEz1G87A/bt192s1Sted5bGtQ==\"}]",
  10. "userUnionIds": "[{\"organizationId\":\"1\",\"unionId\":\"rX5uwo/CYh6EHayvuFSydPhxNENKsAVAMgPHDI0ZhlIbuXK6u6skr6/yhNkStwrH\"},{\"organizationId\":\"2\",\"unionId\":\"Ut666l/h3J69dwcN99nLAMfzSpLDo2Ct2LyMF277QpOY=\"}]"
  11. },
  12. "botId": 10,
  13. "domainId": 12345,
  14. "skillId": 23456,
  15. "skillName": "天气小助手",
  16. "intentId": 34567,
  17. "intentName": "weather",
  18. "slotEntities": [
  19. {
  20. "intentParameterId": 45678,
  21. "intentParameterName": "city",
  22. "originalValue": "魔都",
  23. "standardValue": "上海",
  24. "liveTime": 0,
  25. "createTimeStamp": 1564110905331,
  26. "slotName": "city:city",
  27. "slotValue": "魔都"
  28. },
  29. {
  30. "intentParameterId": 56789,
  31. "intentParameterName": "time(公共实体)",
  32. "originalValue": "今天",
  33. "standardValue": "今天",
  34. "liveTime": 0,
  35. "createTimeStamp": 1564110905331,
  36. "slotName": "time(公共实体):sys.time",
  37. "slotValue": "今天"
  38. }
  39. ],
  40. "requestId": "20190726111511958-508551760",
  41. "device": {
  42. "deviceOpenId": "1iwSj2tFWJMecJu6ys7TsyA9bUCit4vUAKV3xQWK2ymR6FAoxQ9DMg=="
  43. },
  44. "skillSession": {
  45. "skillSessionId":"8d7501fe-a80a-46cf-a43f-ff8743a7ec66",
  46. "newSession":true
  47. }
  48. }

示例请求数据中,演示的是技能挂载到两个组织下的情况。如果只挂载了一个组织,则 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。