在瀏覽某個雲課堂的時候,發現了一個直播提醒的功能。在點擊開啓提醒
後,發現它走了以下流程:html
開啓提醒
,彈出一個公衆號二維碼雲課堂的PC端的開啓提醒很簡單,只須要掃描二維碼便可,可是在 app
開啓提醒就稍微複雜了點。
雖然不容易,但通過一番折騰後,終於走通了整個直播提醒的功能。 現分享給須要的朋友。前端
如下是 app
直播提醒功能:json
據我所知,目前關注公衆號有兩種方式:小程序
這兩種都屬於關注事件,但第二種在用戶關注公衆號後,會將帶場景值的掃描事件推送給開發者。咱們利用這個場景值,可帶額外的參數傳遞給應用服務器,開發者可根據這些參數來判斷用戶是否已開啓提醒。
因此,咱們用生成帶參數的二維碼來完成掃碼關注。api
生成帶參數的二維碼地址服務器
下面咱們來建立臨時二維碼:微信
access token
$client = new \GuzzleHttp\Client(['verify' => false]); $header['content-type'] = 'application/json; charset=UTF-8'; $param = [ 'appid' => 'appId', // 公衆號的 appid 'secret' => 'appSecret', // 公衆號的 secret 'grant_type' => 'client_credential' ]; $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query($param); $result = file_get_contents($url); $result = \GuzzleHttp\json_decode($result, true); if (isset($result['errcode']) && $result['errcode'] <> 0) { throw new WeChatException('獲取 access_token 失敗', 500); } $accessToken = $result['access_token'];
2.根據 access_token
獲取 ticket
app
// app傳遞的數據 $data = [ 'live_id' => 10, // 直播 ID 'user_id' => 5 // 用戶 ID,未登陸可傳遞 0 ]; // post 數據格式 $tmp = [ 'expire_seconds' => 5 * 60, 'action_name' => 'QR_STR_SCENE', 'action_info' => [ 'scene' => [ 'scene_str' => http_build_query($data) ] ] ]; $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . $accessToken; $json = \GuzzleHttp\json_encode($data, 256); $ticket = $this->post($url, $json, ['headers' => $headers])['ticket';
3.根據 ticket
生成二維碼圖片post
拿到 ticket
後,訪問下面的連接,打開的是一個公衆號二維碼圖片。雲課堂的 PC 端便是用這種方式ui
$qCodeUrl = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=urlencode('.$ticket.')';
在 app
中,當點擊 開啓提醒
時,由於要跳轉到小程序客服,因此咱們須要將公衆號與小程序進行關聯。
關聯步驟:登陸公衆號 -> 小程序 -> 管理小程序 -> 添加
關聯完成後,就能夠在 app
中喚起小程序了。
這個步驟須要 app
開發者和前端開發者協同開發app
跳轉到小程序時,一樣要傳遞直播 ID
和 用戶 ID
。
客服消息地址
相似公衆號推送消息,小程序一樣也能夠推送該消息。
當用戶想微信服務器發送小程序卡片時,
判斷 當msgtype
的值爲 miniprogrampage
時,發送回覆消息
1.獲取 Access toten
小程序獲取 access token
和公衆號獲取 access token
基本相同,不一樣的是 appid
和secret
分別要換成小程序的 appid
和 secret
$client = new \GuzzleHttp\Client(['verify' => false]); $header['content-type'] = 'application/json; charset=UTF-8'; $param = [ 'appid' => 'appId', // 小程序的 appid 'secret' => 'appSecret', // 小程序的 secret 'grant_type' => 'client_credential' ]; $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query($param); $result = file_get_contents($url); $result = \GuzzleHttp\json_decode($result, true); if (isset($result['errcode']) && $result['errcode'] <> 0) { throw new WeChatException('獲取 access_token 失敗', 500); } $accessToken = $result['access_token'];
咱們在第二步中已經生成了公衆號二維碼,能夠直接拿來用
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" . $accessToken; $tmp = [ 'touser' => 'OPENID', // 用戶發送卡片時會有個 FromUserName 字段,即 openid 'msgtype' => "link", 'link' => [ 'title' => '直播提醒', "description" => "點擊識別二維碼", 'url' => $qrCodeUrl, // 帶參數的二維碼地址 'thumb_url' => '小程序跳轉地址' ] ]; $client = new \GuzzleHttp\Client(['verify' => false]); $header['content-type'] = 'application/json; charset=UTF-8'; $response = $client->request('POST', $url, [ 'headers' => $header, 'body' => \GuzzleHttp\json_encode($data, 256), ]); return \GuzzleHttp\json_decode((string)$response->getBody(), true);
因爲推送二維碼圖片時,須要Media_id
,比較麻煩,因此在小程序中,我將公衆號二維碼地址作成了圖文消息發送給用戶,
用戶點擊圖文消息後,會顯示二維碼,用戶識別二維碼後,便可關注公衆號
關注公衆號,要作個提示消息,告訴用戶已經 開啓提醒成功。
恰好生成帶參數的二維碼能夠幫助咱們。
掃描帶參數二維碼事件有兩種狀況:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> <EventKey><![CDATA[qrscene_123123]]></EventKey> <Ticket><![CDATA[TICKET]]></Ticket> </xml>
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[SCAN]]></Event> <EventKey><![CDATA[SCENE_VALUE]]></EventKey> <Ticket><![CDATA[TICKET]]></Ticket> </xml>
第一種狀況,咱們能夠根據 EventKey
來判斷是不是掃描帶參數的二維碼;
第二種狀況,咱們能夠根據 Event
來判斷是不是掃描帶參數的二維碼;
因此,當出現以上兩種狀況時,咱們就能夠斷定,用戶開啓了直播提醒。記錄用戶的 openid
, 以便給用戶推送提醒消息
略
以上既是 app
開啓直播提醒的流程。
須要注意的點:
app
喚起小程序時必須傳遞參數