[开发记录][微信]开发者模式验证与基本回复功能

最基本的微信后台需要实现两个功能,第一,通过开发者模式的验证,第二,对用户发来的消息进行回复。

一,开发者模式的验证时容易出的错

1.TOKEN定义,与微信验证是保持一致。如下所示:

define(“TOKEN”, “weixin”);

微信公众平台开发者中心配置项

2.验证函数valid()中需要在回复时设置header,有些网上给出的代码没有设置,导致出错。

二,对用户发来的消息进行回复

微信用户发来的信息有很多类型,主要是两大类,普通型和事件型。

普通型
1 文本消息
2 图片消息
3 语音消息
4 视频消息
5 小视频消息
6 地理位置消息
7 链接消息

事件型
1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送

以上各种消息发来的格式可以参看
http://mp.weixin.qq.com/wiki/17/fc9a27730e07b9126144d9c96eaf51f9.html
http://mp.weixin.qq.com/wiki/14/f79bdec63116f376113937e173652ba2.html

以下代码中,responseMsg()中提取了发来的消息中的MsgType字段,此字段对应用户发来消息的类型,根据类型的不同对其进行处理和回复。

<?php

define("TOKEN", "weixin");//设置token,微信开发者模式验证的时候要保持一致,此处是weixin

$wechatObj = new wechatCallbackapiTest();

if (isset($_GET['echostr'])) {//开发者模式验证
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();//后台回复
}

class wechatCallbackapiTest
{
    //验证
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            header('content-type:text');//有些网上给出的代码没有header设置,导致验证失败
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }    

        //响应消息
    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 "event"://事件
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text"://文本
                    $result = $this->receiveText($postObj);
                    break;
                default:
                    $result = "new type";
                    break;
            }

            echo $result;
        }else {
            echo "";
            exit;
        }
    }

     //接收事件消息
    private function receiveEvent($object)
    {
        $content = "";
        switch ($object->Event)
        {
            case "subscribe"://关注事件
            $content = "欢迎关注";
                break;
            case "unsubscribe"://取消关注
                $content = "取消关注";
                break;
            default:
                $content = "receive a new event: ".$object->Event;
                break;
        }
        if (is_array($content)){
            $result = $this->transmitNews($object, $content);
        }else{
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }


     //接收文本消息
    private function receiveText($object)    
    {  
        $keyword = trim($object->Content);
        switch ($keyword){
            case "测试":
                $result = $this->transmitText($object, "你输入了测试");          
                break;                    
            default:                      
                $result = $this->transmitText($object, "你没有输入测试");          
                break;                                   
        }
        return $result;
    }

      //回复文本消息
    private function transmitText($postObj, $content)
    {

            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $time = time();
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        <FuncFlag>0</FuncFlag>
                        </xml>";
                $msgType = "text";
                $result= sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);

        return  $result;
    }   
}
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值