前幾日作者在掘金上看到了【微信小程序性能優化】這篇文章,當時心想這個團隊做的事情和我們方向很相似,仔細一看原來是微信公開課上小程序專場中“小程序性能優化”模塊的記錄,而其中我們提出的建議(獨立分包)也即將發布。借著這個機會,我們也決定把在掃碼付小程序中的一些優化實踐分享出來。作者:@陳小二@simpxu
美團掃碼付小程序是一款面向C端消費者推出的線下收單業務。它寄托在美團小程序下,在實際場景中,用戶先使用微信掃一掃掃描商家二維碼,接著調起掃碼付小程序,進入支付頁后輸入金額向商家完成商品支付。
我們一直在做一件事情:提升掃碼付小程序的支付轉化率。這里所提的支付轉化率指:整個業務流程中用戶成功支付到掃碼的占比。支付轉化率與掃碼付業務來講,百分比越高,掃碼付業務的營業額收入越高,帶來的收益是成正比的。
而這部分轉化率流失的影響,我們認為包含兩個部分:
對于小程序開發者而言,掃碼到小程序調起這個環節是黑盒的,我們無法得知此處的細節。而我們在掃碼付小程序中嘗試和微信的同學做了一次梳理,發現掃碼付小程序在外部環節的丟失率較高,查詢數據發現其中大部分用戶手動點擊了右上角的退出。從業務出發,用戶使用掃碼付可以認為用戶是有強需求進行支付,能夠造成用戶手動點擊退出的行為部分原因可能來自于等待時間較長,而在這個環節對時間造成影響更多的是資源準備,即小程序代碼下載或者更新的行為。
影響下載和更新時間可能的因素有:
用戶網絡是我們無法控制的,只能嘗試從代碼包開始下手。而在當時未使用分包的情況下,我們的主包大小約3M,意味著新用戶和無緩存小程序用戶均需要在首次使用時等待下載3M左右的包大小,在這種情況下雖然用戶享受了小程序離線緩存包的福利,卻丟失了大部分新用戶的體驗。于是我們嘗試從包代碼大小做了一些優化:
在做了這些事情后,掃碼付分包從原先的整包3M縮減到了361k(主包300k+分包61),而外部環節的轉化率也提升了3%。雖然轉化率提升了,但前置環節的轉化率仍然有部分丟失,理論上繼續縮減300k的主包能有效提升,但由于業務性質的原因無法再繼續縮減,于是我們向微信小程序提出了獨立分包的概念:用戶在使用獨立分包時無需下載主包。通過獨立分包加載,程序使用期間下載更新階段只需要加載61k的分包大小,目前這個功能還在內測階段,掃碼付小程序也在作為第一批的內測用戶進行體驗,優化效果在之后的實踐中我們也會分享出來。
在進入小程序到支付這個環節,屬于我們的業務流程。在這個環節中的轉化率丟失雖然是我們能掌控的,但我們并無頭緒,所以我們做了一些數據監控來尋求方法:
日常監控中,我們也發現了一些問題,例如接口調用超時、接口調用失敗,這些問題會導致頁面流程終止。針對這些問題,做了一些優化:
自有的接口請求異常
小程序API調用異常
對于這兩類異常,在接口超時、調用失敗時采取重試。而為了避免在極端情況下服務端流量陡增、峰值倍數增加,頁面的可重試次數會在前置獲取全局配置時根據“可重試次數”控制,并且每次重試需要在一段時間后用戶手動觸發。超過重試次數時,則流程終止。
前面我們也提到,對于小程序開發者而言,掃碼到小程序調起這個環節是黑盒的,我們開發者無法得知此處的細節,所以說在監控外部環節這方面我們開發者似乎可做的事情屈指可數。但是,不知道細心的同學有沒有發現,微信在每次掃碼后會給我們在query參數上附帶一個scancode_time字段。其實這個字段表示的是用戶在使用掃一掃時微信服務端記錄的時間,所以基于這個字段的考量,我們做了如下嘗試,針對以下兩個參數值分別做了實時監控:
但由于我們掃碼付小程序的特殊應用場景就是為了保障用戶進行快速可靠的支付,既然在外部環節可控度不高,那是不是可以考慮在內部的業務流程方面把監控統計做的細粒度一點,做到能對每一個可能影響到支付的環節有數據可循呢?所以我們針對這個方向,區別于傳統的pv、uv統計,對業務上報做了如下分類:
基于上述方案的探索,我們小組基本上做到了對可能影響支付環節的某些業務指標的把控。從而在下一步,可以針對每個潛在的可優化點做進一步思考與考量,作出及時的策略優化與更新。