alipay指南¶
1. 介绍¶
支付宝手表版本提供付款码和乘车码功能,根据芯片差异分为两个版本:
TEE 版本:适用于 52X 系列主控(内置 security)
SE 版本:适用于 56X 系列主控(需外挂 SE 芯片,目前支持宏思电子 HSC32I1 芯片)
2. TEE版本支付宝¶
2.1 适用范围¶
仅支持 52X 系列主控
需在 Bootloader、LCPU、HCPU 开启对应配置
乘车码数据通过 BLE 从手机 APP 获取
可提供配套 APP SDK 与源码
若使用支付宝原生 SDK,需自行对接
2.2 配置说明¶
2.2.1 Bootloader配置¶
开启宏PKG_SIFLI_MBEDTLS_BOOT,配置如下:

2.2.2 LCPU配置¶
依次开启以下配置:
BSP_USING_DMAPM_DEEP_ENABLEUSING_SEC_ENV
配置截图:



注意:DMA 使用 DMA1_Channel8,不可被其他外设占用。
DMA 配置代码:hdma.Instance = DMA1_Channel8; hdma.Init.Request = 0; hdma.Init.Direction = DMA_MEMORY_TO_MEMORY; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma.Init.PeriphInc = DMA_PINC_ENABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.Mode = DMA_NORMAL; hdma.Init.Priority = DMA_PRIORITY_MEDIUM;
2.2.3 HCPU¶
依次开启:
USING_SEC_ENVPKG_ALIPAY_TRANSPORT_CODE
说明:
乘车码依赖付款码,暂不支持付款码单独使用。
company name和product model(均 ≤16 字符)需与支付宝申请的参数一致。需配置
alipay_adaptation.h中的宏(示例):#if defined (PKG_ALIPAY_MODE_TEE) #define ALIPAY_DEVICE_NAME "HAAS-2AX-SIF-55X-" #define ALIPAY_PARA_PK_STR "hj5r4Qos6De" #define ALIPAY_PARA_PS_STR "DxPlqtjTIc5xqlh5" #define ALIPAY_PARA_ID2_PK "7KSJA9nSuuu" #endif
2.3 分区与文件夹¶
分区要求:
需存在名为
secure_data的分区:用于保存支付宝绑定信息。需存在名为
upay_safety的分区:用于保存支付宝的ID2数据(需放置于sys分区,确保恢复出厂设置及OTA升级后数据仍保留)。
文件夹要求:
根目录下需创建名为
alipay_transport的文件夹:用于存储从服务器获取的乘车码脚本文件。
注:以上三个名称(secure_data``upay_safety``alipay_transport)不可修改,若修改需同步调整对应代码。
配置截图:


2.4 接口说明¶
2.4.1 直接调用接口(非耗时操作)¶
适用于非耗时、栈空间占用小的操作。
/**
* 获取是否已经绑定
* 此API在进入支付宝界面时调用,判断支付宝是否已经绑定
* @param [in] void
* @return 返回绑定状态 true:已绑定 false:未绑定
*/
bool ali_pay_get_binding_result(void);
/**
* 获取绑定码
* @param [out] binding_str 存放绑定码的指针
* @param [out] len_binding_str 绑定码数据大小,传入时为binding_str buff大小
* @return UPAY_RV_OK: 获取成功
* UPAY_RV_BINDING_STR_TOO_LONG:数据size超过限制,请减少upay_product_model的长度
*/
upay_rc_t ali_pay_get_binding_string(uint8_t *binding_str, uint32_t *len_binding_str);
/**
* 注册ble接收函数,允许接收绑定数据,在展示绑定码之前调用
*/
void alipay_data_subscribe(void);
/**
* 取消注册ble接收函数,不允许接收绑定数据,绑定成功后调用
*/
void alipay_data_unsubscribe(void);
/**
* 轮询绑定结果
* 此API必须在获取绑定码后并且在绑定过程中才能调用
* @param [in] void
* @return 返回绑定状态 @upay_binding_status_e
*/
upay_binding_status_e ali_pay_get_binding_status(void);
/**
* 从Flash读取存储的logon_ID
* @param [out] id 存放数据的指针
* @param [out] len_id数据大小,最大读取不超过传入这个值的数据大小
* @return UPAY_RV_OK:读取成功
* UPAY_RV_NOT_FOUND:未发现该存储项
*/
upay_rc_t ali_pay_get_logon_ID(uint8_t *id, uint32_t *len_id);
/**
* 从Flash读取存储的nick_name
* @param [out] nick_name 存放数据的指针
* @param [out] len_nick_name数据大小,最大读取不超过传入这个值的数据大小
* @return UPAY_RV_OK:读取成功
* UPAY_RV_NOT_FOUND:未发现该存储项
*/
upay_rc_t ali_pay_get_nick_name(uint8_t *nick_name, uint32_t *len_nick_name);
/**
* 获取帮助码
* @param [out] aidCode 存放码串的缓存
* @param [inout] len_aidCode 输入时为允许存放的最大长度;输出时为实际的长度, 建议长度为256
* @return UPAY_RV_OK: 获取成功
* UPAY_RV_BUF_TOO_SHORT:缓存太小,此时输出的len_aidCode,为所需要的大小
* UPAY_RV_JS_ERROR:json错误,可能是堆空间不够
*/
upay_rc_t ali_pay_get_aid_code(char *paycode, uint32_t *len_paycode);
2.4.2 临时线程调用接口(耗时操作)¶
适用于耗时长、栈空间占用大的操作(临时线程执行完成后,通过消息队列将结果发送至UI线程,期间播放等待动画)。
/**
* 创建获取乘车码临时线程
* @param [in] parameter->type 根据type调用不同函数
* parameter->data 对应函数需要的参数
* @return true : On success
flase : error
*/
bool transport_processing_thread(lv_transport_data_t *parameter);
注意:
在调用transport_processing_thread函数创建临时线程时,需要调用alipay_take_sema获取信号量,当获取失败时,表示临时线程还在执行上一次的操作,需要等待。
参考支付宝线程类型与对应函数说明
2.5 流程图¶
2.5.1 支付宝绑定流程¶

2.5.2 乘车码流程¶

3. SE 版本¶
3.1 硬件要求¶
外挂 SE 芯片 HSC32I1(仅提供该芯片对接)
连接 IIC、电源、地、RST 引脚
代码路径:
sdk\external\alipay-se参考文档:HSC32I1产品规格书
3.2 网络¶
默认使用 PAN 连接获取数据
若需其他方式(如 BLE 代理),请自行对接
solution\components\alipay\hal\network\sample\alipay_net_kal.c
3.3 HCPU 配置¶
只需开启 PKG_ALIPAY_TRANSPORT_CODE,依赖自动开启

3.3.1 PAN 长连接控制¶
开启:PAN 和 BT 其他 profile 自动连接
关闭:需用户自行处理连接/断开

3.3.2 SE 芯片配置¶
配置 IIC(是否共用)及 RST 引脚

company name和product model需向支付宝申请,调用流程与 TEE 版本类似(差异见函数说明)。