可结算交易

如果您与 Google 签订的合同按交易指定结算,则您的应用必须调用 NavigationTransactionRecorder.pickup()NavigationTransactionRecorder.dropoff() 来标记每笔交易的开始和结束,以便 Google 可以跟踪和记录可结算交易。请参阅本页面中的实现指南,以确定如何将可结算交易分配给行程和送货服务。

获取 NavigationTransactionRecorder 对象

为了使用 pickup()dropoff() 方法,您必须先通过调用 NavigationApi.getTransactionRecorder 创建一个 NavigationTransactionRecorder 实例,如以下示例所示:

NavigationTransactionRecorder transactionRecorder = NavigationApi.getTransactionRecorder(application);

开始与pickup()进行交易

当司机接驾乘客或收集要送货的物品时,您的应用必须调用 NavigationTransactionRecorder.pickup()。您应该在驾驶员与您的应用互动以登记上车点时发起此调用。请勿将此调用作为 onArrival() 回调的一部分进行。

以下示例代码假定司机在接乘客或外卖商品时点按应用界面上的按钮:

Button b = (Button) findViewById(R.id.btn_pickup);
b.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    transactionRecorder.pickup(
        null /* waypoint */,
        Arrays.asList("MY_TRANSACTION_ID"));
  }
});

将以下参数传递给 pickup() 方法:

  • 发生上车点的 Waypoint;如果上车点不属于现有导航会话,则为 null
  • 适用于此自提商品的一个或多个交易 ID。交易 ID 是任意字符串,用于唯一标识可计费交易。如需详细了解交易 ID,请参阅下文。

结束与dropoff()的交易

当司机让乘客下车或交付物品时,您的应用必须调用 NavigationTransactionRecorder.dropoff()。您应在驾驶员与您的应用互动以注册下车点时启动此调用。请勿将此调用作为 onArrival() 回调的一部分进行。

以下示例代码假定司机在下车或送餐时点按应用界面上的按钮:

Waypoint waypoint = mNavigator.getCurrentRouteSegment().getDestinationWaypoint();

Button b = (Button) findViewById(R.id.btn_dropoff);
b.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    transactionRecorder.dropoff(
        waypoint,
        Arrays.asList("MY_TRANSACTION_ID"));
  }
});

将以下参数传递给 dropoff() 方法:

  • 发生下车点的 Waypoint,如果下车点不属于现有导航会话,则为 null
  • 适用于此流失情况的一个或多个交易 ID。交易 ID 是任意字符串,用于唯一标识可计费交易。如需详细了解交易 ID,请参阅下文。

使用您自己的交易 ID 或生成一个交易 ID

交易 ID 提供了一种将行程与来自 Google 的结算交易相关联的方式。事务 ID 是任意字符串,最大长度为 64 个字符。该 ID 在各个交易中必须是唯一的。

您最好提供自己的事务 ID:您的系统已在使用并存储的事务 ID。

或者,您也可以通过调用 NavigationTransactionRecorder.generateTransactionId() 生成唯一的随机交易 ID。存储生成的 ID,以备贵组织需要此 ID 来协调行程交易时使用。

Navigation 交易记录器实现指南

请按照以下准则确定如何将可结算交易分配给行程和送货服务。

通用准则:

  • 每当使用 Navigation SDK for Android 时,您都必须报告可计费交易(包括使用道路贴靠位置信息提供程序),即使应用在特定行程中并未在前台运行也是如此。如果您想停止报告可计费交易,请调用 stopGuidance() 来停用导航,然后使用 stopRequestingLocationUpdates() 关闭道路贴靠位置。
  • 即使司机同时进行叫车和送货,也必须将行程和送货作为单独的交易注册。
  • 您必须在事件发生时立即记录上车点和下车点事件。

约车交易准则:

  • 不涉及乘客的导航会话(例如,驾车前往上车点或将司机指引到热门地点供日后接客)不计为可计费交易。
  • 一名乘客的上车和下车操作计为一项计费交易。
  • 按团体结算的乘客的一次行程计为一次可结算交易。更详细地讲:如果司机在一个地点接上两名或更多乘客,然后在另一个地点将其下车,然后您以小组形式向他们收费,则计为单笔交易。使用相关交易 ID 仅调用 pickup() 一次,并且仅调用 dropoff() 一次。
  • 两位单独结算的乘客共享行程将计为两笔计费交易,即使乘客在同一地点上车和下车也是如此。当司机接驾乘客时,使用两个交易 ID(每笔交易一个)调用 pickup();当司机下车时,使用两个交易 ID 调用 dropoff()
  • 视需要停靠不视为单独的可结算交易。 例如中断取咖啡的旅程,或让未单独付费的同伴乘客下车。请勿像往常一样针对此类中途停留调用 dropoff()
  • 如果贵组织对部分行程进行间接计费,而不是在行程时计费,则您必须将这些行程视为按每次行程收费。例如,您的组织可能会提供无限制行程的按月订阅模式。对于这些行程,请致电 pickup()dropoff()
  • 如果贵组织提供的巴士服务会在固定的一组站点接送乘客,但不跟踪每个站点的上下车人员,则您必须获得单独的产品许可。这些类型的总线服务不在按交易结算的范围内。
  • 如果贵组织提供的车辆租赁服务允许乘客在很长一段时间内无限次经停(均按一笔费用结算),则您必须获得单独的产品许可。这些服务不在按交易结算的结算范围内。

交付交易准则:

  • 不涉及配送商品的导航会话(例如,开车前往商店自提要配送的商品)不计为可结算交易。
  • 从一个营业地点取件和下车订单计为一笔可结算交易。一个订单可以包含多个实物,例如两袋杂货。在司机取货时调用 pickup(),在司机取货时调用 dropoff()
  • 当驾驶员在同一订单中从多个地点(例如,商店或餐馆)自提商品时,每个地点都算作一笔单独的可结算交易。为每个营业地点使用不同的交易 ID。
  • 当司机从同一位置取走多个客户订单的商品时,每个订单都计为一笔单独的可结算交易。对每个订单使用不同的交易 ID。
  • 当两位司机在同一客户订单中分别取货和还货时,每位司机的送货都计为一笔单独的可结算交易,即使两位司机都来自同一商店位置,也是如此。为每个驱动程序使用不同的事务 ID。