在浏览某个云课堂的时候,发现了一个直播提醒的功能。在点击开启提醒
后,发现它走了以下流程: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
唤起小程序时必须传递参数