• 微信公众平台消息接口开发(26)从Hello2BizUser文本到subscribe事件


    微信公众平台 微信公众平台开发模式 消息接口 企业微信公众平台 Hello2BizUser subscribe 订阅事件 
    作者:方倍工作室 
    原文:http://www.cnblogs.com/txw1958/archive/2013/04/01/weixin-if26-subscribe.html

    微信公众平台由于接口升级,将产生以下变更。新用户订阅,将由之前推送一条“Hello2BizUser”文本,变化为推送一条“subscribe”的事件。最近碰到好几个朋友询问新用户订阅事件后代码要怎么改,现在将详细过程讲解如下:

    一、Hello2BizUser旧事件的处理

    在老的关注事件中,用户关注微信公众平台账号后,系统会帮用户发送一条Hello2BizUser的文本给公众账号,公众账号后台开发模式下通过判断Hello2BizUser这个词来实现发送欢迎词。

    代码样例如下:

    if ($keyword == "Hello2BizUser"){
        $contentStr = "欢迎关注方倍工作室,这其实是老的欢迎词,你收不到了";
        $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
        return $resultStr;
    }

    做出基础接口上的修改,影响会是所有人。一般不会轻易做这样的改动。

    为什么微信要修改这一事件了,这个方法的弊端在于,如果用户没有判断这一事件,那么就不会有欢迎词,本来这也没什么关系,不出现欢迎词也不影响什么。但很多人的程序代码里面,所有流程直接就是判断关键词。比如我们曾看到过一家医院的微信账号,用户发送挂号的号码,就显示前面有多少人排列,但后台程序没有做区分,把Hello2BizUser也当成挂号单发送过去,返回没有找到Hello2BizUser这一挂号,不知道前面有多少人,搞得用户莫名奇妙。还有就是用户如果主动发送一个Hello2BizUser过去,那么得到的也是和欢迎词一样的内容,虽然很少有用户会去发这个东西。

    另一方面,将用户关注做成事件,更有利于统计功能的实现。利用这个事件,我们就更能容易的判断出关注人数和退订人数,而原来的Hello2BizUser文本推送判断是有可能不准确的,因为用户可以手工发送,形成虚假关注统计。

    二、“subscribe”订阅事件判断

    subscribe是一种新的事件,我们先需要做事件类型做判断,我们在官方样例中增加对这一事件的判断,修改如下:

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    $RX_TYPE = trim($postObj->MsgType);
    
    switch ($RX_TYPE)
    {
        case "text":
            $resultStr = $this->receiveText($postObj);
            break;
        case "event":
            $resultStr = $this->receiveEvent($postObj);
            break;
        default:
            $resultStr = "unknow msg type: ".$RX_TYPE;
            break;
    }

    然后在事件接收处理函数中再判断订阅事件 :

    private function receiveEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
            case "subscribe":
                $contentStr = "您好,欢迎关注方倍工作室。新感觉,新体验!";
                break;
        }
        $resultStr = $this->transmitText($object, $contentStr);
        return $resultStr;
    }

    这样就完成了“subscribe”的订阅事件下的处理。

    二、完整代码

    <?php
    define("TOKEN", "方倍工作室");
    $wechatObj = new wechatCallbackapiTest();
    $wechatObj->responseMsg();
    
    class wechatCallbackapiTest
    {
        public function responseMsg()
        {
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            if (!empty($postStr)){
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $RX_TYPE = trim($postObj->MsgType);
    
                switch ($RX_TYPE)
                {
                    case "text":
                        $resultStr = $this->receiveText($postObj);
                        break;
                    case "event":
                        $resultStr = $this->receiveEvent($postObj);
                        break;
                    default:
                        $resultStr = "unknow msg type: ".$RX_TYPE;
                        break;
                }
                echo $resultStr;
            }else {
                echo "";
                exit;
            }
        }
    
        private function receiveText($object)
        {
            $funcFlag = 0;
            $keyword = trim($object->Content);
            $resultStr = "";
            $cityArray = array();
            $contentStr = "";
            $needArray = false;
            $illegal = false;
            $saytome = false;
            
            if ($keyword == "Hello2BizUser"){
                $contentStr = "欢迎关注方倍工作室,这其实是老的欢迎词,你关注时收不到了";
                $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
                return $resultStr;
            }else {
            
            }
        }
    
        private function receiveEvent($object)
        {
            $contentStr = "";
            switch ($object->Event)
            {
                case "subscribe":
                    $contentStr = "您好,欢迎关注方倍工作室。新感觉,新体验!";
                    break;
            }
            $resultStr = $this->transmitText($object, $contentStr);
            return $resultStr;
        }
        
        private function transmitText($object, $content, $flag = 0)
        {
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>%d</FuncFlag>
    </xml>";
            $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
            return $resultStr;
        }
    }
    
    ?>

     

  • 相关阅读:
    《开源框架那点事儿23》:采用TinyDB组件方式开发
    《开源框架那些事儿22》:UI框架设计实战
    《开源框架那些事儿21》:巧借力与借巧力
    logstash 添加nginx日志
    ossfs 使用挂在到ecs -centos 6.8
    Django JWT Token RestfulAPI用户认证
    install scrapy
    Django 1.9 + celery + django-celry 实现定时任务
    celery
    ansible常用模块用法
  • 原文地址:https://www.cnblogs.com/pondbay/p/3486468.html
Copyright © 2020-2023  润新知