本文作者:心月

微信公众号开发——二维码扫码关注事件推送

心月IT博客 2019-10-04
摘要:用户扫描带场景值二维码时,可能推送以下两种事件:如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者;如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

用户未关注时,进行关注后的事件推送

推送XML数据包示例:

<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数据包示例:

<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>


在来看看不是通过扫码关注的推送事件

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[FromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[subscribe]]></Event>
</xml>

    通过对比扫码关注和非扫码关注的xml数据推送包可以发现,扫码和非扫码关注的区别在于,扫码关注多了一个 EventKey ,所以我们可以通过判断是否有 EventKey 来判断用户是通过扫码关注的公众号还是不是通过扫码关注的。

    临外,对于已关注的用户,在扫码时,event 是 scan ,同时还携带了 EventKey,而通过 EventKey 可以识别出用户是通过扫码哪个二维码进来的。


下面来看看实现代码:

    private $appid = 'xxx';    //测试账号appid
    private $appsecret = 'xxx';//测试账号appsecret

    public function index()

    {

    	$timestamp = input('get.timestamp');

		$nonce = input('get.nonce');

		$token = 'xxx';//工作平台token

		$signature = input('get.signature');

		$array = array($timestamp, $nonce, $token);

		sort($array);

		$stmstr = implode('', $array);

		$stmstr = sha1($stmstr);

		$echostr = input('get.echostr');

		if($stmstr == $signature && $echostr){

			echo $echostr;

			exit;

		} else {

			$this->rMsg();

		}

    } 



    //发送响应消息

	private function rMsg()

	{
		$postArr = file_get_contents("php://input");

		$postObj = simplexml_load_string($postArr);


		$type = strtolower($postObj->MsgType);


		$cnt = $this->GRCnt($postObj, $type);


		$this->SRCnt($postObj, $cnt);

	}



	//获取回复内容

	private function GRCnt($postObj, $type)

	{
		switch ($type) {

			//关注事件回复内容
			case 'event':
                                //判断是否已关注
				if (strtolower($postObj->Event) == 'subscribe') {
                                        //通过判断 EventKey 来判断用户是否通过扫描关注
					if ($postObj->EventKey) {
						$content = "欢迎扫码关注心月IT博客";
					}else{
						$content  = '欢迎来到心月IT博客微信公众号
回复关键词可获取相关文章信息';
					}

				}elseif (strtolower($postObj->Event) == 'scan') {
				        //关注后的扫码事件
				        //通过判断 EventKey 来判断用户是从哪里来的
					$sceneID = $postObj->EventKey;
					switch ($sceneID) {
						case '2000':
							$content = "临时二维码入口进入";
							break;
						case '3000':
							$content = "永久二维码入口进入";
							break;	
						
						default:
							break;
					}

				}
				
				break;

			default:

				return;

		}


		if (!isset($content)) return;

		return $content;

	}



	//回复消息
	private function SRCnt($postObj,$cnt)

	{
		$content = $cnt;
		$template = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Content><![CDATA[%s]]></Contnet>
				</xml>";
		$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
		echo $info;
		exit();
	}

效果预览:

公众号扫码关注事件推送效果

        如此一来,我们就可以根据用户从不同的入口进入/关注公众号 而推送不同的容,不必在对所有的用户都推送相同的内容了。

文章版权及转载声明:

作者:心月 本文地址:http://www.xinyueseo.com/other/366.html发布于 2019-10-21
文章转载或复制请以超链接形式并注明出处心月IT博客

分享到:
赞(

发表评论

快捷输入:

    评论列表 (有 0 条评论,人围观)参与讨论