alipay使用指南

1. 介绍

支付宝手表版本提供付款码和乘车码功能,根据芯片差异分为两个版本:

  • TEE 版本:适用于 52X 系列主控(内置 security)

  • SE 版本:适用于 56X 系列主控(需外挂 SE 芯片,目前支持宏思电子 HSC32I1 芯片)

2. TEE版本支付宝

2.1 适用范围

仅适用于52X系列主控,需在bootloader、LCPU及HCPU中开启相关配置。
通过BLE获取乘车码数据,需配套手机APP(可提供SDK及源码,与系统适配;若使用支付宝原生SDK需自行对接)。

2.2 配置说明

2.2.1 Bootloader配置

开启宏PKG_SIFLI_MBEDTLS_BOOT,配置如下:
bootloader配置

2.2.2 LCPU配置

依次开启以下配置:

  • BSP_USING_DMA

  • PM_DEEP_ENABLE

  • USING_SEC_ENV

配置截图:
启用DMA
启用深度模式
启用安全环境

注意

  • DMA使用DMA1的channel8,不可被其他外设占用

  • DMA配置代码:

    hdma.Instance                 = DMA1_Channel8;
    hdma.Init.Request             = 0;                     // 内存到内存模式下无效,设为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. TEE 版本配置与使用

TEE版本目前只适用于52X系列的主控,需要在bootloader、LCPU及HCPU打开相关配置.
TEE版本是使用的ble获取乘车码数据,手机需要一个APP与手表端进行通信去获取乘车码数据。
此APP我们可提供SDK及源码,此APP的SDK与我们的代码是适配了的可正常获取乘车码。
如果使用付宝原生SDK需要用户自行对接。

bootloader配置

在bootloader中需要打开宏PKG_SIFLI_MBEDTLS_BOOT相关配置如下。

lcpu配置

lcpu需要依次打开如下配置;BSP_USING_DMAPM_DEEP_ENABLEUSING_SEC_ENV



其中MDA是使用的DMA1的channel8,需要注意此channel不能被其他外设使用,否则会导致使用异常,还不好查原因。

    hdma.Instance                 = DMA1_Channel8;
    hdma.Init.Request             = 0;                     //Request id is useless while memory to memory, just set to 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.4 HCPU配置(TEE版本)

hcpu需要依次打开如下配置:

  • USING_SEC_ENV

  • PKG_ALIPAY_TRANSPORT_CODE

配置截图:


说明

  • 乘车码依赖于付款码,TEE版本目前暂不支持付款码单独使用。

  • 配置项要求:

    • company name:公司名简称(不要超过16个字符)

    • 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.5 分区及文件夹要求(TEE版本)

  1. 分区要求

    • 需存在名为secure_data的分区:用于保存支付宝绑定信息。

    • 需存在名为upay_safety的分区:用于保存支付宝的ID2数据(需放置于sys分区,确保恢复出厂设置及OTA升级后数据仍保留)。

  2. 文件夹要求

    • 根目录下需创建名为alipay_transport的文件夹:用于存储从服务器获取的乘车码脚本文件。

:以上三个名称(secure_data``upay_safety``alipay_transport)不可修改,若修改需同步调整对应代码。

配置截图:

2.6 接口说明(TEE版本)

支付宝接口分为两种调用方式:

  • 直接调用:适用于非耗时、栈空间占用小的操作。

  • 临时线程调用:适用于耗时长、栈空间占用大的操作(临时线程执行完成后,通过消息队列将结果发送至UI线程,期间播放等待动画)。

2.6.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.6.2 临时线程调用接口说明

/**
 * 创建获取乘车码临时线程
 * @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.7 绑定流程图(TEE版本)

2.8 乘车码流程图(TEE版本)

3. SE版本alipay

se版本需要外挂一个SE芯片,目前仅提供宏思电子的HSC32I1芯片的对接,其他厂商请自行对接。

  • 硬件连接:需连接芯片的IIC、电源、地及RST引脚。

  • 代码路径:sdk\external\alipay-se目录下

  • 参考文档:HSC32I1产品规格书

se版本默认使用PAN连接网络获取数据,若需使用其他方式(如ble代理),请自行对接solution\components\alipay\hal\network\sample\alipay_net_kal.c文件。

3.1 hcpu配置(SE版本)

se版本只需打开HCPU的PKG_ALIPAY_TRANSPORT_CODE配置,其他依赖会自动开启:

3.1.1 PAN长连接控制

  • 若打开PAN长连接功能:PAN和BT的其他profile会一起自动连接。

  • 若不启用:需用户自行处理连接和断开操作。

3.1.2 SE芯片配置

需配置SE芯片使用的IIC(及是否与其他IIC共用)、RST连接引脚:

说明
company name(公司名简称,≤16字符)和product model(产品型号,≤16字符)需与TEE版本一样,向支付宝申请。
调用流程与TEE版本大致相同,不同之处在函数说明中有标注。

4. 支付宝提供的文档