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 | 类型 | 含义 | 是否必填 | 备注 |
|---|---|---|---|---|
| isvName | String | 厂商名称 | 是 | |
| deviceModel | String | 设备机型 | 是 | |
| deviceSN | String | 设备SN | 是 | |
| glassSupportNetwork | boolean | 眼镜是否支持联网 | 是 | |
| phoneSysType | String | 用户手机型号 | 否 | |
| glassPayConfig | String | glassSDK的配置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 | 类型 | 含义 | 是否必填 | 备注 |
|---|---|---|---|---|
| isvName | String | 厂商名称 | 是 | 传”meizu” |
| deviceModel | String | 设备机型 | 是 | |
| deviceSN | String | 设备SN | 是 | |
| glassSupportNetwork | boolean | 眼镜是否支持联网 | 是 | |
| phoneSysType | String | 用户手机型号 | 否 | |
| glassPayConfig | String | glassSDK的配置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 | 类型 | 含义 | 是否必填 | 备注 |
|---|---|---|---|---|
| returnUrl | String | 绑定完成后的回跳地址 | 否 | 优先级高于callback中的getReturnUrl |
onGetBindExtInfo extInfo1返回参数:
| 参数key | 类型 | 含义 | 返回时机 | 备注 |
|---|---|---|---|---|
| AlipayAppDownloadUrl | String | 支付宝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_MODE | bool | 是否启用演示模式 | 否 | 仅对单笔看码付有效 |
| disableTransparent | bool | 是否打开扫码预览 | 否 | |
| PAY_INIT_ASR | String | 唤起语文本传入 | 否 | sdk收到后放入initCloudEnv请求中,返回extInfo里面加个PAY_INIT_ASR_INTENTION; 设备通信用initIntentData |
3.9 command
发送指令,比如用户点击眼镜的返回按键、摘下眼镜等时机调用;
入参:(详见GlasspayConfig.java中定义)
| 参数key | 类型 | 含义 | 是否必填 | 备注 |
|---|---|---|---|---|
| commandCode | int | 指令编码 | 是 | 01:表示按键命令 |
| keyCode | int | 具体按键值 | 否 | |
| source | String | 命令来源 | 否 | 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 | 手机端解绑 | 重新绑定设备 |
| 4000 | 1、系统繁忙,请稍后再试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("支付结果未知,请和商家确认", "联系商户确认支付结果"),