智能应用开放平台

一、功能简介

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。