这篇文章是a系列的第四篇系列报道了优步的移动工程团队如何开发最新版本的司机应用程序,代号为Carbon,这是我们拼车业务的核心组成部分。在其他新功能中,这款应用可以让我们的300多万司机搭档找到乘客,获得方向,并跟踪他们的收入。2017年,我们开始结合司机合作伙伴的反馈设计新应用程序,并于2018年9月开始投入生产。
作为一家全球性公司,优步努力使其服务在其运营的任何地方都可以使用。这项工作包括了解地区习俗并使我们的技术适应这些习俗。实现这一目标的关键是让客户以对他们最有意义的方式支付,无论是信用卡、借记卡,还是特定地区的支付方式,如现金。
在许多提供优步拼车服务和优步外卖服务的市场,信用卡和借记卡并不常见,也不是支付方式的选择。然而,在2016年之前,这种数字方式是主要支持的支付方式,这使得喜欢或只能使用现金支付的用户很难利用我们的服务。我们首先解决了这个限制接受现金支付在孟买,只有一小部分人有信用卡。由于客户欢迎这种新的支付方式,我们在印度、拉丁美洲和非洲扩大了乘车现金支付。
然而,直到2017年9月,我们才开始接受Uber Eats外卖订单的现金支付,这项服务再次起源于孟买。推迟两年的原因是为了解决Uber Eats三方市场的支付复杂性,三方市场由餐馆合作伙伴、外卖合作伙伴和食客组成。
克服这一挑战涉及到操作变化和新技术的混合。特别是,我们的新司机应用(代号为碳)为我们提供了新的功能,帮助我们扩展现金经济。通过这些创新,我们能够将Uber Eats带给全球更多的客户。
收集现金的挑战
在我们支持现金支付拼车服务的城市,司机的合作伙伴以现金支付给他们的钱,并从数字支付出行的收益中自动向优步支付这些出行的费用。在这种情况下,我们的智能调度系统保证司机的合作伙伴获得足够的数字支付的行程,以支付之前欠优步的现金旅行费用。司机从即时付款中受益,而优步允许乘客用现金支付,这在一些人无法使用信用卡的地区是一个重要的功能。
在Uber Eats的三方市场中,外卖合作伙伴从食客那里收到的大部分现金都属于餐厅合作伙伴。此外,在信用卡或借记卡使用率较低的市场,不可能派遣足够多的数字支付货物来抵消未收取的现金。我们需要一种可持续的方式,在食客和餐厅合作伙伴之间转移现金支付,而不是让我们的外卖合作伙伴回到他们刚来的餐馆,给他们支付订单的现金。
我们首先尝试使用第三方现金收款服务,利用便利店等参与地点以及传统的银行存款和转账。我们发现这种方法的问题是,这些服务并不是在所有Uber Eats的城市都能提供,这限制了我们支持现金支付的地方,并且要求我们的送货合作伙伴在传统的送货旅行体验之外停下来。
我们理想的现金回收机制需要在所有当前和未来的优步外卖市场中发挥作用,并为配送合作伙伴提供便利。此外,由于许多支持现金支付的市场的网络连接不可靠,现金兑换业务需要能够完全离线运行。
我们的新方法
产品建议是新颖的:利用我们的餐厅合作伙伴作为现金投放地点的分布式网络。在之前的旅行中有未付现金余额的配送伙伴将被派往参与的餐厅,以现金支付订单,与食客的付款方式无关。为了避免在取货过程中产生不必要的摩擦,付款金额将等于订单金额,因为收到的金额不同可能会给餐厅收银员造成混乱。餐馆将保留所有的现金收入,并从即时支付中受益。优步将从随后的数字订单中扣除其配送预约费用。
这种机制运行良好,因为它可以扩展到现在和未来的优步外卖市场,并通过将现金支付与每次出行整合在一起,使现金支付成为送货体验的常规部分。我们的下一个挑战是确保餐厅欠款的收集可以离线运行。幸运的是,我们在新的司机应用中建立了离线支持,以覆盖许多用例,例如当司机在网络覆盖有限的地区结束旅行时。这个功能与我们对现金支付的要求非常吻合。
利用乐观模式
在优步运营的许多新兴市场,可靠的网络连接并不是保证。我们之前的司机应用程序在整个旅程中都需要网络连接,这可能会给我们的司机和送货伙伴带来令人难以置信的沮丧体验。例如,司机在送完客户后,可能必须开车到一个有网络连接的地区,才能在应用程序上结束行程。对于送货合作伙伴来说,这个问题可能更严重,因为地下和建筑内的取货和送货会进一步干扰网络连接。
我们重新设计的司机应用程序的许多新功能是乐观的方式,它允许功能在不需要网络连接的情况下运行和进展。启用后,无论网络请求是否成功,应用状态都会立即更新并保持响应。失败的请求将被记录、缓存,并在连接恢复时重新尝试。无论实际的网络延迟如何,应用程序都能快速响应,让用户与之正常交互。使用乐观模式,行程可以立即在低连接或无连接区域开始和结束。对于Uber Eats,外卖合作伙伴可以在没有网络连接的情况下完成整个餐厅的现金收款流程。
餐厅欠款催收功能
为了使餐厅能够无缝地从送货合作伙伴那里收取欠款,我们需要更新新的Android和iOS驱动程序应用程序以及我们的餐厅仪表板应用程序反应本地,以及新的后端功能。我们建立了一个新的微服务来支持餐馆的现金流和它的客户,它的职责如下:
- 确定餐厅现金支付的旅行资格。
- 计算建议支付的现金金额。
- 使用状态机维护正在进行的餐厅现金支付行程的状态。
- 格式和提供显示数据的移动客户端,以及我们的餐厅应用程序。
根据这个范例,现金掉落有几种可能的状态,如下图1所示:
在发货时,配送伙伴默认选择完成现金投放,因为主动选择之后可能需要网络连接。在旅程的这个初始点,如图2所示,我们可以放心地假设交付合作伙伴具有连接性,否则,他们将不会收到分派。我们向下发送完成流程所需的所有信息,以便后续步骤不需要网络连接,并通知餐厅潜在的现金交易,如图3所示。由于乐观模式将把失败的网络请求写入磁盘,交付合作伙伴可以选择不进行现金支付并继续通过交付流程。一旦恢复连接,后端将被通知暂时跳过支付的决定。
该服务支持交付合作伙伴设定他们能够支付的金额,如果交付合作伙伴手头没有所有要求的现金,或者希望为将来的交付更改现金,这一点很有用。但是,我们还没有启用这一功能,因为我们需要更多地考虑接受与订单总额不同的现金支付的餐厅体验。在目前的实践中,如果交付合作伙伴选择完成现金支付,他们将进入支付交换状态,现金金额将自动设置为订单金额。
那么我们如何在线下进行现金支付交换呢?要求餐厅和送餐合作伙伴都承认现金支付的发生,让各方都放心,也是最能抵御潜在欺诈的方式。由于我们无法依靠网络请求在确认后向双方提供即时通知,因此我们使用四位数字代码交换。
我们提供司机应用程序和餐厅应用程序所需的所有信息,以完成调度流程。餐厅得到一个随机生成的代码,如下面的图4所示,并指示交付合作伙伴在交换点请求该代码。
相反,我们向移动客户端发送SHA256加盐哈希将此代码与交付合作伙伴随后从餐厅收到该代码时输入的客户端散列代码进行比较。在成功输入代码之后,交付合作伙伴可以继续通过流程并开始旅程的下一阶段。散列值的相等性检查完全脱机进行。为了防止欺诈,执行速率限制和最大尝试次数。此外,以现金支付的选择权如果没有完成,将在一段合理的时间后到期。如果发现交易不一致,优步将进一步调查,并可能禁止任何不良行为者进入该平台。
在成功输入代码后(如图5所示),一个预先填充的确认屏幕将同时显示给交付合作伙伴和餐厅。如果再次发生网络故障,乐观模式会将失败的请求写入磁盘,并在连接恢复后重新尝试。然后,外卖合作伙伴将被记入付款金额,餐厅合作伙伴的余额将根据未来的数字收入进行调整,从而完成现金支付。
继续使用现金支付
虽然最初的目的是为碳的核心旅行流,乐观模式使一套全新的功能成为可能。在设计新功能时,优步的工程和设计团队不再受网络连接要求的限制。由于支付现金需要多方的高度信任,因此仅仅依靠餐厅来核实欠款催收交易是行不通的。然而,要求交付合作伙伴具有网络连接可能会使合作伙伴陷入验证流程中,从而阻碍旅行的进展。乐观模式提供了完美的解决方案,它允许完全脱机地进行移交操作,并在稍后重新建立网络连接时通知后端事务。
认识到离线支持的价值,其他为Carbon做出贡献的团队正在利用乐观模式,而Uber的移动网络平台团队则扩展了框架的功能。在Carbon上的这些努力,正在将优步曾经依赖网络的应用程序转变为一款对优步运营的所有市场都有响应的应用程序,而不考虑连接情况。
优步司机应用程序系列文章索引
- 为什么我们决定重写优步司机应用程序
- 在肋骨设计Uber的新司机应用程序
- 优步的新司机应用如何克服网络延迟
- Uber Eats扩大现金支付规模
- 如何在不危及整个业务的情况下发布一款重写的应用
- 建立一个可扩展的和可靠的地图接口的司机
- 工程优步信标:匹配24位RGB颜色的乘客和司机
- 为驱动程序偏好构建一个安全、可扩展和服务器驱动的平台
- 在优步的新司机应用程序中建立实时收益跟踪器
- 活动/服务作为一种依赖:重新思考Uber新司机应用中的Android架构
对开发每天被数百万人使用的移动应用程序感兴趣吗?考虑加入我们的团队安卓或iOS开发人员!
订阅我们的时事通讯以跟上优步工程的最新创新。






