前几日作者在掘金上看到了【微信小程序性能优化】这篇文章,当时心想这个团队做的事情和我们方向很相似,仔细一看原来是微信公开课上小程序专场中“小程序性能优化”模块的记录,而其中我们提出的建议(独立分包)也即将发布。借着这个机会,我们也决定把在扫码付小程序中的一些优化实践分享出来。作者:@陈小二@simpxu
美团扫码付小程序是一款面向C端消费者推出的线下收单业务。它寄托在美团小程序下,在实际场景中,用户先使用微信扫一扫扫描商家二维码,接着调起扫码付小程序,进入支付页后输入金额向商家完成商品支付。
我们一直在做一件事情:提升扫码付小程序的支付转化率。这里所提的支付转化率指:整个业务流程中用户成功支付到扫码的占比。支付转化率与扫码付业务来讲,百分比越高,扫码付业务的营业额收入越高,带来的收益是成正比的。
而这部分转化率流失的影响,我们认为包含两个部分:
对于小程序开发者而言,扫码到小程序调起这个环节是黑盒的,我们无法得知此处的细节。而我们在扫码付小程序中尝试和微信的同学做了一次梳理,发现扫码付小程序在外部环节的丢失率较高,查询数据发现其中大部分用户手动点击了右上角的退出。从业务出发,用户使用扫码付可以认为用户是有强需求进行支付,能够造成用户手动点击退出的行为部分原因可能来自于等待时间较长,而在这个环节对时间造成影响更多的是资源准备,即小程序代码下载或者更新的行为。
影响下载和更新时间可能的因素有:
用户网络是我们无法控制的,只能尝试从代码包开始下手。而在当时未使用分包的情况下,我们的主包大小约3M,意味着新用户和无缓存小程序用户均需要在首次使用时等待下载3M左右的包大小,在这种情况下虽然用户享受了小程序离线缓存包的福利,却丢失了大部分新用户的体验。于是我们尝试从包代码大小做了一些优化:
在做了这些事情后,扫码付分包从原先的整包3M缩减到了361k(主包300k+分包61),而外部环节的转化率也提升了3%。虽然转化率提升了,但前置环节的转化率仍然有部分丢失,理论上继续缩减300k的主包能有效提升,但由于业务性质的原因无法再继续缩减,于是我们向微信小程序提出了独立分包的概念:用户在使用独立分包时无需下载主包。通过独立分包加载,程序使用期间下载更新阶段只需要加载61k的分包大小,目前这个功能还在内测阶段,扫码付小程序也在作为第一批的内测用户进行体验,优化效果在之后的实践中我们也会分享出来。
在进入小程序到支付这个环节,属于我们的业务流程。在这个环节中的转化率丢失虽然是我们能掌控的,但我们并无头绪,所以我们做了一些数据监控来寻求方法:
日常监控中,我们也发现了一些问题,例如接口调用超时、接口调用失败,这些问题会导致页面流程终止。针对这些问题,做了一些优化:
自有的接口请求异常
小程序API调用异常
对于这两类异常,在接口超时、调用失败时采取重试。而为了避免在极端情况下服务端流量陡增、峰值倍数增加,页面的可重试次数会在前置获取全局配置时根据“可重试次数”控制,并且每次重试需要在一段时间后用户手动触发。超过重试次数时,则流程终止。
前面我们也提到,对于小程序开发者而言,扫码到小程序调起这个环节是黑盒的,我们开发者无法得知此处的细节,所以说在监控外部环节这方面我们开发者似乎可做的事情屈指可数。但是,不知道细心的同学有没有发现,微信在每次扫码后会给我们在query参数上附带一个scancode_time字段。其实这个字段表示的是用户在使用扫一扫时微信服务端记录的时间,所以基于这个字段的考量,我们做了如下尝试,针对以下两个参数值分别做了实时监控:
但由于我们扫码付小程序的特殊应用场景就是为了保障用户进行快速可靠的支付,既然在外部环节可控度不高,那是不是可以考虑在内部的业务流程方面把监控统计做的细粒度一点,做到能对每一个可能影响到支付的环节有数据可循呢?所以我们针对这个方向,区别于传统的pv、uv统计,对业务上报做了如下分类:
基于上述方案的探索,我们小组基本上做到了对可能影响支付环节的某些业务指标的把控。从而在下一步,可以针对每个潜在的可优化点做进一步思考与考量,作出及时的策略优化与更新。