如何實現小程式的無限推送
文章有點標題黨,單純的從技術上來實現無限推送暫時是不可能的。
為什麼不可能?
"推送" 在小程式官方的叫法是模板訊息。先來看看官方對他的下發條件說明:
1. 支付
當用戶在小程式內完成過支付行為,可允許開發者向用戶在7天內推送有限條數的模板訊息(1次支付可下發3條,多次支付下發條數獨立,互相不影響)
2. 提交表單
當用戶在小程式內發生過提交表單行為且該表單宣告為要發模板訊息的,開發者需要向用戶提供服務時,可允許開發者向用戶在7天內推送有限條數的模板訊息(1次提交表單可下發1條,多次提交下發條數獨立,相互不影響)
第一種“支付”的情況本人沒試過,“提交表單”來實現模板訊息的推送需要滿足兩個條件:
- 使用者必須有表單提交行為,一次表單提交產生一次的推送機會。多使用者之間相互獨立。
- 推送機會的有效期有7天。超過則失效。
有這兩個限制在就沒辦法通過技術手段來實現無限推送。我們只能通過其他非技術方案來實現。
先決條件
我們在專案中採用的方案是通過關聯的公眾號傳送推送訊息,如果使用者連公眾號都沒關注,那就只能通過簡訊的方法通知使用者。因此這個方案需要一些先決條件:
- 需要開發平臺、小程式、公眾號3個賬號,並將小程式和公眾號關聯到開放平臺賬號下。
- 在運營上和小程式上需要做些改變,要引導使用者關注公眾號。
- 使用者註冊後關聯手機號
如果實際情況與上述條件不符,那麼該方案並不適合您,可以不用往下看了。下面是該方案的詳細說明。
為什麼要通過公眾號來推送?
最重要的一點是公眾號推送沒有7日內活躍的限制,也就是說即使使用者超過7天內沒登入也能推送。
其次在體驗上,小程式跟公眾號結合的比較緊密,使用者可以點選公眾號的推送內容直接跳到小程式的指定頁面。這點在官方的文件上我們也能找到依據:
可能需要注意的是,所有的小程式推送都會顯示在“服務通知”裡面(如下圖),而公眾號推送會單獨顯示在公眾號裡面。在展現上會有些區別。
推送流程
說明:
首先需要做些基礎性工作,包括:
- 使用者首次使用小程式時需要獲取使用者基本資訊,以及OpenID(這裡的OpenID是指小程式裡的,公眾號也會OpenID,兩個值不一樣)、UnionID。儲存到後臺的資料庫中,為方便後續描述,暫且叫做“小程式使用者表”。
- 小程式里加入表單提交,在使用者進行提交時會自動生成一個formID,提交後後臺除了業務邏輯外,還要將formID儲存起來,以便後續推送使用。
接下來就可以推送了。步驟如下:
1、後臺需要推送給使用者A,那麼先查詢使用者A對應的未過期的formID,如果找到直接通過小程式推送;如果找不到,或formID已經過期,則繼續後續步驟,通過公眾號推送。
2、到“小程式使用者表”裡取得使用者A的UnionID。
3、接下來便希望,拿著UnionID取得使用者A在公眾號裡的OpenID(注意,這裡不是小程式的OpenID)。但很遺憾公眾號並沒有提供UnionID反查OpenID的介面。我們只能曲線救國。後臺先建立一個“公眾號使用者表”。需要UnioniD反查OpenID時,先到該表中查,如果查到了則直接呼叫公眾號的推送介面,詳情:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277。如果查不到,則繼續步驟4。
4、“公眾號使用者表”查不到的情況,先將公眾號的使用者同步到使用者表中,獲取介面:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840(注意這個介面是分頁獲取的)。同步完成後,如果使用者A(通過小程式使用者表的UnionID來識別)存在,取得OpenID,就可以呼叫公眾號的推送介面完成推送;但也有可能不存在,繼續步驟5。
5、如果使用者A還沒關注公眾號,那麼在步驟4中還是查不到使用者A在公眾號的OpenID。這樣情況下,只能採用簡訊推送。可以直接第三方的服務,比如阿里雲等,當然這會產生費用。
流程大致如此,表結構和程式碼如果有需要再做補充。該方案並不十分完美,會有一些先決條件,但還是希望能分享出來,供大家討論。如果您有更好的方案,歡迎留言。