管理中心
我的
指南钱包服务应用开发卡券接入场景登机牌

登机牌

概述

登机牌即在用户购买机票后所产生的电子登机凭据,用户添加登机牌后可以实时获取到航班动态。

Wallet Kit已提供登机牌接入华为钱包的能力,商户可通过多种方式轻松将卡券集成到华为钱包中。

流程概览

接入所需步骤:

展开

步骤

分类

动作

用途说明

1

开发准备

配置AppGallery Connect

配置申请Wallet Kit相关服务。

2

安全组件申请

获取加密数据所需的秘钥或证书。

3

服务创建

创建Wallet Kit服务。

4

卡券接入

UI设计

开发者可以根据JSON串映射字段来定制界面显示内容。

卡券领取

开发者可以根据指导进行卡券领取操作。

卡券更新

开发者可以根据指导进行卡券更新操作。

处理过期卡券

卡券过期功能指导。

链接到已保存的卡券

链接到已添加的卡券详情。

跨设备同步能力

用户领取卡券后可通过此能力在同一帐号下的多设备中共享此卡券。

起飞提醒通知

航班起飞前提醒用户。

登机口变更通知

航班登机口变更时提醒用户。

起飞时间变更通知

航班起飞时间变更提醒用户。

登机时间变更通知

航班登机时间变更提醒用户。

5

开发后自检

开发后自检

华为提供对应用自动检查的能力。

6

上架申请

上架申请

开发完成后需要在AppGallery Connect中将应用信息补充完整并提交上架申请。

说明

如果想体验快速接入请参考codelab。

  • 服务创建

    创建服务时,服务类型、服务项目及接入方式依次选择:票、云端登机牌、云端接入。

UI设计

展开

编号

名称

JSON串映射字段

规格

说明

1

外框背景色

fields.appendFields[key= backgroundColor]

长度:小于256字节

  1. 6位十六进制色值,以#开头,如#483D8B
  2. 为保证展示效果,建议使用深色

2

卡面背景色

-

-

  1. 固定为白色,非用户输入内容

3

卡面LOGO

fields.commonFields[key= logo]

图片规格:90*90px

大小:小于等于20kb

  1. Value传入图片URI
  2. URI需要为HTTPS地址

4

商户名称

fields.commonFields[key= merchantName]

长度:小于256字节

  1. Value传入默认取值
  2. Value支持多语言,在localizedValue设置字符串Id,并在fields.localized[key="字符串Id"]处设置各个语言的取值

5

起飞时间

fields.timeList.[key= departureTime] or fields.timeList.[key= scheduledDepartureTime]

长度:小于256字节

  1. 优先使用实际起飞时间departureTime,不存在时使用scheduledDepartureTime
  2. 展示格式为HH:mm
  3. Value传入UTC时间,格式为yyyy-MM-ddTHH:mm:ss.SSSZ

6

到达时间

fields.timeList.[key= arrivalTime] or fields.timeList.[key= scheduledArrivalTime]

长度:小于256字节

  1. 优先使用实际到达时间arrivalTime,不存在时使用scheduledArrivalTime
  2. 展示格式为HH:mm
  3. Value传入UTC时间,格式为yyyy-MM-ddTHH:mm:ss.SSSZ

7

出发航站楼

fields.commonFields[key= departureTerminal]

长度:小于256字节

  1. Value支持多语言

8

出发城市

fields.commonFields[key= departureCity]

长度:小于256字节

  1. Value支持多语言

9

到达航站楼

fields.commonFields[key= arrivalTerminal]

长度:小于256字节

  1. Value支持多语言

10

到达城市

fields.commonFields[key= arrivalCity]

长度:小于256字节

  1. Value支持多语言

11

航班号

fields.commonFields[key= flightNumber]

长度:小于256字节

  1. 直接展示

12

登机口

fields.commonFields[key= boardingGate]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

13

乘机人

fields.commonFields[key= passengerName]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

14

起飞日期

fields.timeList.[key= departureTime] or fields.timeList.[key= scheduledDepartureTime]

长度:小于256字节

  1. 获取起飞时间的日期进行展示
  2. 格式化为yyyy/MM/DD格式

15

登机时间

fields.timeList.[key= boardingTime]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. 展示格式为HH:mm
  3. Value传入UTC时间,格式为yyyy-MM-ddTHH:mm:ss.SSSZ

16

座位号

fields.commonFields[key= seatNumber]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

17

条形/二维码

fields.barCode.type

fields.barCode.value

长度:小于256字节

  1. type为codabar时,展示条形码,取值为qrCode展示二维码
  2. 取值为fields.barCode.value

18

备注说明

fields.barCode.text

长度:小于256字节

  1. 条形/二维码下内容

19

仓位等级

fields.commonFields[key= flightClass]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

20

登机序号

fields.commonFields[key= boardingSequence]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

21

确认码

fields.appendFields[key= confirmationNumber]

长度:小于256字节

  1. Label字段已固定,商户不可更改

22

预计起飞日期

fields.timeList.[key= scheduledDepartureTime]

长度:小于256字节

  1. 获取起飞时间的日期进行展示
  2. 格式化为yyyy/MM/DD格式

23

预计到达时间

fields.timeList.[key= scheduledArrivalTime]

长度:小于256字节

  1. 展示格式为HH:mm
  2. Value传入UTC时间,格式为yyyy-MM-ddTHH:mm:ss.SSSZ

24

到达登机口

fields.commonFields[key= arrivalGate]

长度:小于256字节

  1. Label字段已固定,商户不可更改
  2. Value支持多语言

25

消息1

fields.messageList[key=key1]

长度:小于256字节

  1. Label支持多语言,必传不可为空
  2. Value支持多语言,必传不可为空
  3. key为用户自定义,此处只举例说明,非固定值

26

跳转列表1

fields.urlList[key=key1]

长度:小于256字节

  1. urlList中可设置商户跳转链接,如H5地址、快应用地址、Shcema地址,多条都可展示,跳转设置请参考UrlList跳转配置。
  2. Label支持多语言,必传不可为空
  3. Value为H5地址,需要为HTTPS地址
  4. key为用户自定义,此处只举例说明,非固定值

27

跳转列表2

fields.urlList[key=key2]

长度:小于256字节

  1. urlList中可设置商户跳转链接,如H5地址、快应用地址、Shcema地址,多条都可展示,跳转设置请参考UrlList跳转配置。
  2. Label支持多语言,必传不可为空
  3. Value为H5地址,需要为HTTPS地址
  4. key为用户自定义,此处只举例说明,非固定值

28

轮播图

fields.imageList

长度:小于256字节

限制:长宽比3:1

  1. 多张图片时,在华为钱包详情页面自动轮播
  2. 跳转地址需要为HTTPS地址

功能实现

卡券领取

Wallet Kit提供两种卡券领取方式,商户开发者可根据接入方式的媒介来选择适合自己的接入方式。

展开

场景

功能

实现方法

步骤

登机牌

通过网页、短信、Email、App应用内领取卡券

网页集成“添加到华为钱包”按钮领取卡券

  1. 开发者将卡券模板推送至华为服务器。
  2. 开发者将实例用密钥加密为JWE数据推送给用户。
说明

模板:用户共有的字段信息,所有用户将共同享有模板信息字段,如logo、merchantName等。

用户特有信息(实例):用户特有的字段信息,如cardNumber。如果实例和模板中有相同字段则实例信息将覆盖模板信息内容。

短信/邮件跳转链接领取卡券

App应用集成Wallet Kit SDK后推送JWE数据到华为服务器

在App应用内集成Schema链接领取卡券

说明

用户可以不登录华为帐号直接拉起华为钱包进行添卡操作。

App应用内、快应用、华为钱包CardStore方式领取卡券

说明

此方式当前仅支持中国大陆区域。

App应用集成Wallet Kit SDK后推送卡券包到华为钱包应用

  1. 开发者通过服务器示例代码生成卡券包。
  2. 待用户点击领取按钮时将卡券包推送给华为钱包应用。

伙伴快应用方式领取卡券

在华为钱包CardStore领取卡券

  • 网页、短信、Email、App应用内领取卡券

    开发场景介绍中定义的模板和用户特有信息实例是以会员卡为示例进行介绍,如商户需推送登机牌请按照下方给出的示例重新定义模板及用户特有信息实例。

    推送模板信息至华为服务器

    说明

    接口定义请参考登机牌模板请求示例。

    HwWalletObject字段定义请参考服务器API。

    领取流程可参见添加卡券章节,因为添加卡券章节是已会员卡的数据作为示例提供,如需推送登机牌请参考下方提供的模型类和接口定义重新修改后推送。

    收起
    自动换行
    深色代码主题
    复制
    1. HwWalletObject hwWalletObject = new HwWalletObject();
    2. hwWalletObject.setOrganizationName("xxx");
    3. // 模板标识,唯一值
    4. hwWalletObject.setPassStyleIdentifier("flight001");
    5. // 注册时的服务号
    6. hwWalletObject.setPassTypeIdentifier("hwpass.flight.merchant");
    7. Fields fields = new Fields();
    8. fields.setCountryCode("CN");
    9. List<ValueObject> commonFields = new ArrayList<>();
    10. ValueObject flightNumber = new ValueObject();
    11. flightNumber.setKey("flightNumber");
    12. flightNumber.setValue("MU2887");
    13. commonFields.add(flightNumber);
    14. ValueObject departureTerminal = new ValueObject();
    15. departureTerminal.setKey("departureTerminal");
    16. departureTerminal.setValue("T2");
    17. commonFields.add(departureTerminal);
    18. // 商户LOGO URI
    19. ValueObject logo = new ValueObject();
    20. logo.setKey("logo");
    21. logo.setValue("https://www.xxx.com/.../logo.png");
    22. commonFields.add(logo);
    23. // 商户名称,含多语言样例,例如此处设置字符串id为merchantNameI18N,用于在Localized中获取对应语言取值进行展示
    24. ValueObject merchantName = new ValueObject();
    25. merchantName.setKey("merchantName");
    26. merchantName.setValue("Some merchant name");
    27. merchantName.setLocalizedValue("merchantNameI18N");
    28. commonFields.add(merchantName);
    29. ValueObject boardingGate = new ValueObject();
    30. boardingGate.setKey("boardingGate");
    31. boardingGate.setValue("45");
    32. commonFields.add(boardingGate);
    33. ValueObject departureCity = new ValueObject();
    34. departureCity.setKey("departureCity");
    35. departureCity.setValue("Some merchant name");
    36. commonFields.add(departureCity);
    37. ValueObject arrivalTerminal = new ValueObject();
    38. arrivalTerminal.setKey("arrivalTerminal");
    39. arrivalTerminal.setValue("T3");
    40. commonFields.add(arrivalTerminal);
    41. ValueObject arrivalCity = new ValueObject();
    42. arrivalCity.setKey("arrivalCity");
    43. arrivalCity.setValue("shenzhen");
    44. commonFields.add(arrivalCity);
    45. fields.setCommonFields(commonFields);
    46. // 背景颜色
    47. List<ValueObject> appendFields = new ArrayList<>();
    48. ValueObject backgroundColor = new ValueObject();
    49. backgroundColor.setKey("backgroundColor");
    50. backgroundColor.setValue("#1C2635");
    51. appendFields.add(backgroundColor);
    52. fields.setAppendFields(appendFields);
    53. // 推广图片
    54. List<ValueObject> imageList = new ArrayList<>();
    55. ValueObject imagePic = new ValueObject();
    56. imagePic.setValue("https://www.xxx.com/.../banner.png");
    57. imageList.add(imagePic);
    58. fields.setImageList(imageList);
    59. List<ValueObject> timeList = new ArrayList<>();
    60. ValueObject time = new ValueObject();
    61. time.setKey("departureTime");
    62. time.setValue("2020-05-09T10:30:00.010Z");
    63. timeList.add(time);
    64. fields.setTimeList(timeList);
    65. List<Localized> localizedList = new ArrayList<>();
    66. // 商户中文名称,例如中文语言时,通过上面指定的字符串Id merchantNameI18N匹配到此Value用于展示
    67. Localized merchantNameChinese = new Localized();
    68. merchantNameChinese.setKey("merchantNameI18N");
    69. merchantNameChinese.setLanguage("zh-CN");
    70. merchantNameChinese.setValue("Merchant name in Chinese");
    71. localizedList.add(merchantNameChinese);
    72. fields.setLocalized(localizedList);
    73. hwWalletObject.setFields(fields);

    通过如下POST接口推送到华为服务器

    收起
    自动换行
    深色代码主题
    复制
    1. POST
    2. https://{walletkit_server_url}/hmspass/v1/flight/model

    定义用户特有信息的实例

    接口定义请参考登机牌实例请求示例。

    收起
    自动换行
    深色代码主题
    复制
    1. HwWalletObject hwWalletObject = new HwWalletObject();
    2. // 实例唯一标识,在模板下唯一
    3. hwWalletObject.setSerialNumber("854687156");
    4. // 模板标识,唯一
    5. hwWalletObject.setPassStyleIdentifier("Loyalty001");
    6. hwWalletObject.setOrganizationPassId("1231");
    7. // 注册时的服务号
    8. hwWalletObject.setPassTypeIdentifier("hwpass.loyalty.merchant");
    9. Fields fields = new Fields();
    10. // 状态,有效期内的卡券才能推送到华为服务器
    11. Status status = new Status();
    12. status.setState("active");
    13. status.setEffectTime("2019-11-11T00:00:00.000Z");
    14. status.setExpireTime("2029-11-10T23:59:59.999Z");
    15. fields.setStatus(status);
    16. // 条形码/二维码
    17. BarCode barCode = new BarCode();
    18. barCode.setText("Refresh every ten minutes");
    19. // setType的值为codabar或qrCode
    20. barCode.setType("codabar");
    21. barCode.setValue("829383819844342342");
    22. fields.setBarCode(barCode);
    23. List<ValueObject> commonFields = new ArrayList<>();
    24. ValueObject seatNumber = new ValueObject();
    25. seatNumber.setKey("seatNumber");
    26. seatNumber.setValue("12A");
    27. commonFields.add(seatNumber);
    28. ValueObject passengerName = new ValueObject();
    29. passengerName.setKey("passengerName");
    30. passengerName.setValue("Wang Xiao");
    31. commonFields.add(passengerName);
    32. ValueObject boardingSequence = new ValueObject();
    33. boardingSequence.setKey("boardingSequence");
    34. boardingSequence.setValue("1");
    35. commonFields.add(boardingSequence);
    36. ValueObject boardingSequence = new ValueObject();
    37. boardingSequence.setKey("flightClass");
    38. boardingSequence.setValue("First Class");
    39. commonFields.add(boardingSequence);
    40. // 商户名称,含多语言样例,例如此处设置字符串id为merchantNameI18N,用于在Localized中获取对应语言取值进行展示
    41. ValueObject merchantName = new ValueObject();
    42. merchantName.setKey("merchantName");
    43. merchantName.setValue("Some merchant name");
    44. merchantName.setLocalizedValue("merchantNameI18N");
    45. commonFields.add(merchantName);
    46. fields.setCommonFields(commonFields);
    47. List<ValueObject> appendFields = new ArrayList<>();
    48. ValueObject confirmationNumber = new ValueObject();
    49. confirmationNumber.setKey("confirmationNumber");
    50. confirmationNumber.setValue("#ITK919"); // 背景颜色
    51. appendFields.add(confirmationNumber);
    52. fields.setAppendFields(appendFields);
    53. hwWalletObject.setFields(fields);

卡券更新

  • 网页、短信、Email、App应用内方式更新卡券

    请参见“调用华为服务器接口更新卡券”章节来实现卡券更新操作。

    更新登机牌模板接口地址如下,请更换示例代码中的接口地址。

    收起
    自动换行
    深色代码主题
    复制
    1. https://xxx/hmspass/v1/flight/model/{modelId}

    更新登机牌用户特有信息的实例(Instance)接口地址如下,请更换示例代码中的接口地址。

    收起
    自动换行
    深色代码主题
    复制
    1. https://xxx/hmspass/v1/flight/instance/{instanceId}
  • App应用内、快应用、华为钱包CardStore方式领取卡券

    如果需要更新卡券请参考“商户服务器实现接口更新卡券”方式来实现卡券更新操作。

    说明

    此方式当前仅支持中国大陆区域。

处理过期卡券

在钱包应用的卡券详情页下如果卡券已过期则会自动标记一个过期的Icon。如果卡券满足过期或无效中的一个条件,系统就会将其移至“过期卡券”部分。

在HwWalletObject.fields.status.expireTime过期后的 24 小时内,卡券会随时移至“过期卡券”。

HwWalletObject.fields.status.state字段标记为expired、inactive或completed。

链接到已保存的卡券

用户保存某张卡券后,钱包提供二种方式查看卡券。

  • 浏览器方式查看卡券
    收起
    自动换行
    深色代码主题
    复制
    1. https://{walletkit_website_url}/walletkit/consumer/pass/instance?issuerId=xxx&instanceId=xxxx

    请求地址中的{walletkit_website_url}变量需要开发者根据服务器所属区域自行选择,列表如下:

    展开

    地区

    域名

    China

    walletpass-drcn.cloud.huawei.com

    Russia

    walletpass-drru.cloud.huawei.com

    Asia, Africa, and Latin America

    walletpass-dra.cloud.huawei.com

    Europe

    walletpass-dre.cloud.huawei.com

    说明
    • 如果用户手机安装了华为钱包应用,且当前方式使用Intent加载时会弹出选择框给用户,用户可选择用钱包或者浏览器加载此链接。
    • instanceId:卡券实例Id。
    • issuerId:对应华为开发者联盟网站上AppId,请参见下图。

  • 跳转钱包详情查看卡券(需要安装钱包才可访问)
    收起
    自动换行
    深色代码主题
    复制
    1. wallet://com.huawei.wallet/walletkit/consumer/pass/instance?issuerId=xxx&instanceId=xxxx

跨设备同步能力

当前能力只开放给通过“App应用内、快应用、华为钱包CardStore方式”添加的卡券。

通过卡券包添加时卡片是以端到端的形式将卡券保存到华为钱包,华为服务器没有保存用户推送的卡券,所以无法做到帐号间共享。如果商户需要实现帐号间共享卡券能力则需要实现Wallet Kit提供的托管能力。

  1. 在开发者联盟开放跨设备同步能力。

    在“服务创建”章节配置应用数据时可以选择是否开放跨设备同步能力,此时商户如果想实现此功能则需要开通此服务。

  2. 实现下载卡券包接口。

    商户打开跨设备同步能力后,当商户推送卡券到华为钱包时,华为钱包会将卡券部分信息托管至华为服务器(只上传下载卡券的部分信息)。当用户在当前帐号下的其他设备登录时,华为钱包应用会去商户服务器下载已领取过的卡券包,商户服务器需实现“商户服务器实现接口更新卡券”步骤供华为钱包调用下载卡券包。

起飞提醒通知

华为钱包针对登机牌提供有起飞前提醒,商户为卡券设置PassObject.fields.timeList.scheduledDepartureTime.value后华为钱包会在起飞前4小时提醒用户。

提醒会在00:00-06:00分静默,如果通知是在此时段内则会在静默时间前30分钟提醒。

登机口变更通知

华为钱包针对登机牌提供有登机口变更提醒,商户为卡券设置PassObject.fields.commonFiled.boardingGate.value后华为钱包会在登机口变更时立即提醒用户。

提醒会在00:00-06:00分静默,如果通知是在此时段内则会在静默时间前30分钟提醒。

起飞时间变更通知

华为钱包针对登机牌提供有起飞时间变更提醒,商户为卡券设置PassObject.fields.timeList.departureTime.value后华为钱包会在起飞时间变更时立即提醒用户。

提醒会在00:00-06:00分静默,如果通知是在此时段内则会在静默时间前30分钟提醒。

登机时间变更通知

华为钱包针对登机牌提供有登机时间变更提醒,商户为卡券设置PassObject.fields.timeList.boardingTime.value后华为钱包会在登机时间变更时立即提醒用户。

提醒会在00:00-06:00分静默,如果通知是在此时段内则会在静默时间前30分钟提醒。