服務號消息提醒

在瀏覽某個雲課堂的時候,發現了一個直播提醒的功能。在點擊開啓提醒後,發現它走了以下流程:html

  1. 點擊開啓提醒,彈出一個公衆號二維碼
  2. 微信掃描二維碼,進入小程序客服(app流程)
  3. 點擊發送右小角的小程序卡片(app流程)
  4. 服務器返回公衆號二維碼圖片(app流程)
  5. 點擊圖片識別二維碼,關注公衆號

雲課堂的PC端的開啓提醒很簡單,只須要掃描二維碼便可,可是在 app 開啓提醒就稍微複雜了點。
雖然不容易,但通過一番折騰後,終於走通了整個直播提醒的功能。 現分享給須要的朋友。前端

如下是 app 直播提醒功能:json

生成待帶參數的二維碼

據我所知,目前關注公衆號有兩種方式:小程序

  1. 掃描或識別公衆號後臺生成的二維碼
  2. 掃描或識別帶參數的二維碼

這兩種都屬於關注事件,但第二種在用戶關注公衆號後,會將帶場景值的掃描事件推送給開發者。咱們利用這個場景值,可帶額外的參數傳遞給應用服務器,開發者可根據這些參數來判斷用戶是否已開啓提醒。
因此,咱們用生成帶參數的二維碼來完成掃碼關注。api

生成帶參數的二維碼地址服務器

下面咱們來建立臨時二維碼:微信

  1. 獲取 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 獲取 ticketapp

// 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 基本相同,不一樣的是 appidsecret分別要換成小程序的 appidsecret

$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'];
  1. 發送圖文消息

咱們在第二步中已經生成了公衆號二維碼,能夠直接拿來用

$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,比較麻煩,因此在小程序中,我將公衆號二維碼地址作成了圖文消息發送給用戶,
用戶點擊圖文消息後,會顯示二維碼,用戶識別二維碼後,便可關注公衆號

保存提醒信息

關注公衆號,要作個提示消息,告訴用戶已經 開啓提醒成功
恰好生成帶參數的二維碼能夠幫助咱們。

掃描帶參數二維碼事件有兩種狀況:

  1. 用戶未關注時,進行關注後事件消息:
<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>
  1. 用戶已關注時的事件消息:
<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 開啓直播提醒的流程。
須要注意的點:

  1. 公衆號必須是服務號
  2. 公衆號必須關聯小程序
  3. app 喚起小程序時必須傳遞參數
相關文章
相關標籤/搜索