AI眼镜-接入文档

更新时间:

一、方案介绍

「看一下支付」,是面向下一代个人智能设备的支付方式,看一下、说一声就能完成支付,解放双手高效更便捷。

未来也会结合支付宝的底层数据和核身能力,为眼镜厂商提供更多的支付宝端内服务,丰富AI眼镜的智能生态。

C端眼镜交互

二、接入准备

厂商关键词配置

场景厂商唤醒关键词示例
缴话费交话费、充话费、缴话费、手机充值、电话充值金额结合型(用户意图明确)+ 【动词】+【话费/元】:充50话费、交100元、充200块话费帮我充值、帮我交话费、帮我手机充值50元、帮我交50元话费、我要充50元话费
停车缴费XX 停车缴费、XX停车费、给【XX车牌号】交下停车费、停车费怎么交?乐奇,停车缴费、帮我停车缴费、启动停车缴费小爱同学,停车缴费、给我交停车费交一下停车费、付停车费、给这辆车交下停车费浙A28372交停车费
点咖啡点一杯、来一杯、我要点、点杯、来杯** +** 咖啡名(奥瑞白、杨枝甘露、鲜萃、美式、拿铁、咖啡)/瑞幸新增:推荐一杯好喝的、推荐一杯、推荐新品帮我点杯咖啡、帮我点一杯瑞幸咖啡、点一杯瑞幸咖啡、来一杯瑞幸咖啡、来一杯咖啡、我要点咖啡、点杯咖啡、请帮我点⼀杯柠C美式、来一杯 XXXX 咖啡、点一杯XXXX咖啡、来杯精萃澳瑞白、点一杯生椰杨枝甘露、点杯鲜萃轻轻茉莉
看一下支付扫码支付、扫码支付XX元支付XX元、支付宝支付看一下支付、看一下支付XX元、帮我支付、帮我支付XX元、句式:XX +支付、支付+xx元扫码支付、扫码支付10元、支付10元、看一下支付10元、我要支付、我要支付10元
看一下货柜1、扫码、扫二维码、扫描、扫条形码+ 开门、开柜、取货、开启2、货柜、支付宝+开门、开柜、取货、开启扫码开门、支付宝开门、货柜开门

整体架构

  • 支付宝眼镜端和手机端统一成一个SDK(眼镜SDK)对外输出,整合安全、核身、AI交互等能力;
    • 提供意图识别、语音交互、视觉交互等AI能力;
    • 核心模块包含音视频采集、端侧AI、音视频编码等;
    • 依赖多模态ClientSDK传输数据;
  • 支付宝眼镜端sdk和手支付宝机端apk建立信令通道,不依赖于厂商中转;
  • 建立数据通道,用户音视频数据传输;
  • AI服务 与 安全/核身/眼镜等服务 云端打通,避免频繁端云交互;

技术框架

三、技术接入

1、眼镜APK

安装到眼镜端,主要处理支付宝业务逻辑和发起支付

需要Android敏感权限,需要厂商默认授予

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
权限描述调用方备注
FOREGROUND_SERVICE、POST_NOTIFICATIONS应用运行前台服务,防止被杀,并通知用户眼镜端眼镜端glassApp使用,手机端无
READ_PRIVILEGED_PHONE_STATE, READ_PHONE_STATE访问手机状态信息眼镜端如获取deviceId
WRITE_SECURE_SETTINGS写安全配置眼镜端
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, MANAGE_EXTERNAL_STORAGE读写sdcard权限眼镜端、手机端
CAMERA访问相机权限,扫码使用眼镜端
ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE访问网络状态手机端或有网眼镜
QUERY_ALL_PACKAGES查询包信息,配合query包名使用眼镜端眼镜端glassApp用
BLUETOOTH扫描蓝牙设备眼镜端
ACCESS_THREAT_DETECTION访问设备的威胁检测服务眼镜端
VIBRATE控制设备的振动器手机端

2、眼镜端SDK

厂商系统集成眼镜端SDK,作为中间件串联手机端和眼镜Apk,主要用以眼镜系统侧与眼镜APK的AIDL通信,主要接口类:AlipayGlassV3Sdk

AlipayGlassV3Sdk.getInstance(this).initSDK(extParams, new GlassSDKCallback() {
    //开启录音,开启后需要在手机端回传音频数据到 receiveDenoiseAudio
    @Override
    public void onStartRecording(String token) {
        //startRecordAudio(true);
    }

    //停止录音,停止后手机端不在回调
    @Override
    public void onStopRecording() {
        //startRecordAudio(false);
    }

    @Override
    public String onStartPlayback(String ttsData) {
        return null;
    }

    //在这里发送蓝牙数据
    @Override
    public int sendDeviceLinkAsync(String data) {
        return 0;
    }

    @Override
    public boolean onWearDetection() {
        return true;
    }

    @Override
    public void onErrorEvent(String code, String message) {
        //错误回调
    }

    @Override
    public void onViIntentResult(String bizType, String dataJson, Map<String, Object> extInfo) {
        //意图回调
    }
});
AlipayGlassV3Sdk.getInstance(this).onGateDataReceived(message);

初始化SDK,进程启动在眼镜App建立连接时调用,会将参数传递给眼睛初始化glassApp,支持重复调用;

入参:(入参key详见GlasspayConfig.java中定义)

参数key类型含义是否必填备注
isvNameString厂商名称
deviceModelString设备机型
deviceSNString设备SN
glassSupportNetworkboolean眼镜是否支持联网
phoneSysTypeString用户手机型号
glassPayConfigStringglassSDK的配置json

收到手机端消息回传给SDK

3、手机端SDK

Android端,主要接口类:AlipayGlassV2SDK

iOS端,主要接口类:AlipayGlassSDK.h

3.1 初始化

private AwaitTaskManager awaitTaskManager = new AwaitTaskManager();

AlipayGlassV3Sdk.getInstance(this).initSDK(extParams, new GlassSDKCallback() {

    @Override
    public void onStartRecording(String token) {}

    @Override
    public void onStopRecording() {}

    //播放TTS
    @Override
    public String onStartPlayback(String ttsData) {
        return null;
    }

    @Override
    public DeviceResponseData sendDeviceLink(DeviceRequireData data) {
        return null;
    }

    //发送数据到蓝牙通道
    @Override
    public int sendDeviceLinkAsync(String data) {
        return 0;
    }

    @Override
    public boolean onWearDetection() {
        return true;
    }

    @Override
    public void onErrorEvent(String code, String message) {
        // ● onErrorEvent:
        //   ○ Q1010/1011:sdk调用initCloudEnv失败,或者wss建联失败;收到此错误码仅需播音提示用户。
        //   ○ Q9990:glassSDK已释放退出
    }

    @Override
    public void onViIntentResult(String bizType, String dataJson, Map<String, Object> extInfo) {}
});
参数key类型含义是否必填备注
isvNameString厂商名称传”meizu”
deviceModelString设备机型
deviceSNString设备SN
glassSupportNetworkboolean眼镜是否支持联网
phoneSysTypeString用户手机型号
glassPayConfigStringglassSDK的配置json

3.2 getBindStatus

获取眼镜的绑定状态;在手机端展示绑定状态 或者每次发起支付前调用;若未绑定,提示用户去厂商App中进行绑定;

  • needCloudStatus=true, 查询云端状态,一般填true;
  • needCloudStatus=false, 查询本地缓存状态;

3.3 startBinding

AlipayGlassV2Sdk.startBinding(map, new BindingCallBack() {
    @Override
    public void onGetBindingSchemeSuccess(String bindingScheme, String token) {
        //收到支付宝绑定页面,跳转scheme
    }

    @Override
    public void onBindingSuccess() {
        //绑定完成
    }

    @Override
    public void onBindingFailed(String errorCode) {
        //绑定失败
    }

    @Override
    public String getReturnUrl() {
        return "";//可忽略,在入参map中传入
    }

    @Override
    public Map<String, Object> onGetBindExtInfo(Map<String, Object> extInfo1, String extInfo2) {
        return Collections.emptyMap();
    }
});

开始绑定,用户点击手机上的【开始绑定】按钮时调用;

入参:(详见GlasspayConfig.java中定义)

参数key类型含义是否必填备注
returnUrlString绑定完成后的回跳地址优先级高于callback中的getReturnUrl

onGetBindExtInfo extInfo1返回参数:

参数key类型含义返回时机备注
AlipayAppDownloadUrlString支付宝App下载地址返回bindingschema时绑定时,若用户手机未安装支付宝,则提示其下载安装

3.4 receiveDenoiseAudio

接受降噪音频传入,格式要求:pcm,单声道,16000采样率,16位深(AV_SAMPLE_FMT_S16);

  • 绑定阶段:当进入支付宝小程序读文案界面时,会回调onStartRecord,此时打开麦克风,上传音频;
  • 支付阶段:识别支付意图时,调用scanpay接口,同时将用户这句话也调用receiveDenoiseAudio传入;
唤起语上传

唤起语料厂商先做缓存,当识别到支付意愿调用scanpay接口时,同时把唤起语音进行上传;在扩展字段中填写

extParams.put(“flowNode”, “AROUSE”);

3.5 unbind

解绑支付宝账号

3.6 sendDeviceLinkAsync

通过蓝牙通道发送数据

3.7 onGateDataReceived

蓝牙通道收到数据后回传给SDK即可

3.8 scanpay

调用开始扫码支付;当识别到用户支付意图时,调用;调用前请先检查绑定状态。

入参:(详见GlasspayConfig.java中定义)

参数key类型含义是否必填备注
USE_DEMO_MODEbool是否启用演示模式仅对单笔看码付有效
disableTransparentbool是否打开扫码预览
PAY_INIT_ASR String唤起语文本传入sdk收到后放入initCloudEnv请求中,返回extInfo里面加个PAY_INIT_ASR_INTENTION; 设备通信用initIntentData

3.9 command

发送指令,比如用户点击眼镜的返回按键、摘下眼镜等时机调用;

入参:(详见GlasspayConfig.java中定义)

参数key类型含义是否必填备注
commandCodeint指令编码0
1:表示按键命令
keyCodeint具体按键值
sourceString命令来源GlassAppDisconnect

当摘掉眼镜时,退出支付流程

params.put(GlasspayConfig.KEY_COMMAND_CODE, GlasspayConfig.CommandCode.EXIT);
params.put("source", "GlassAppDisconnect");
AlipayGlassV2Sdk.command(params);

错误码

错误码错误描述解决方案
1001扫码超时检查二维码是否破损并重试
1002摄像头异常重启设备,检查摄像头是否正常
1003网络异常检查网络是否正常
1004系统繁忙1、绑定失败重试超过100次;2、码路由信息解析异常
1005用户取消扫码用户主动关闭,无需处理
1006 暂不支持扫描的码更换支持的支付宝收款码、经营码等
1007手机端解绑重新绑定设备
40001、系统繁忙,请稍后再试2、手机端解绑3、付款功能关闭4、支付超出限额根据errorMessage具体处理
8000支付结果未知,请与商家确认联系商户确认支付结果
9000支付成功无需处理
//客户端本地错误码:1000~1999,
Q1001("扫码超时", "检查二维码是否破损并重试"),
Q1002("摄像头异常", "重启设备,检查摄像头是否正常"),
Q1003("网络异常", "检查网络是否正常"),
Q1004("系统繁忙", "绑定失败重试超过100次/码路由信息解析异常"),
Q1005("用户取消扫码", "用户主动关闭,无需处理"),
Q1006("无效二维码,请扫描支付宝收款码", "更换支持的支付宝收款码、经营码等"),
Q1007("请在手机app中绑定支付宝账号", "重新绑定设备"),
Q1010("支付失败", "wss建联失败或者initCloud返回null"),
Q1011("绑定失败", "wss建联失败或者initCloud返回null"),
Q1012("支付APP已断开", "眼镜端glassApp已断开,手机端sdk进行释放重置,请稍后再重试"),

//服务端错误码:4000~4999:ret_def.h, 基础上+4000;--https://yuque.antfin.com/pqpil5/kiedbk/hlhuf5xw4o83gs70
Q4000("系统繁忙,请稍后再试", "通用错误提示"),
Q4058("支付账号已解绑,请重新绑定", "PAY_RESULT_ALREADY_UNBIND"),
Q4059("请在手机端打开付款功能", "PAY_RESULT_PAYMENT_CLOSED"),
Q4060("支付超出限额,请用手机支付宝付款", "PAY_RESULT_EXCEED_LIMIT"),
Q4061("无效二维码,请扫描支付宝收款码", "PAY_RESULT_UNSUPPORT_CODE"),
Q4062("资金不⾜,⽀付失败", "PAY_RESULT_BALANCE_NOT_ENOUGH"),
Q4093("支付异常,请在手机端支付", "PAY_RESULT_FAIL"),

Q8000("支付结果未知,请和商家确认", "联系商户确认支付结果"),

接入前需要准备好的资源