微信开发中的消息验证与消息回复

来源:互联网 发布:人工蜂群算法工具箱 编辑:程序博客网 时间:2024/06/05 08:35

微信开发中的消息验证与消息回复

处理逻辑

  1. 判断微信服务器传来的数据是否含有名为echostr的GET参数
  2. 有则进行服务器消息验证(valid)
  3. 没有则微信推送过来的是一条消息,需要我们处理。
    消息类型分为
    1)事件类型:用户关注/取消关注事件、扫描二维码事件……
    2)被动回复类型:用户发送过来一条文字、图片、语音……
    然后根据需求回复相应的文字、图片、图文….

代码示例

<?phpdefine("TOKEN","###your token###");require_once 'response.class.php';$res=new response();if(!isset($_GET['echostr'])){    responseMsg();}else{    valid();}function valid(){    /* @微信服务器消息验证     *     * 1)将token、timestamp、nonce三个参数进行字典序排序     * 2)将三个参数字符串拼接成一个字符串进行sha1加密     * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信     *     * */    $echoStr=$_GET['echostr'];    $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){        echo $echoStr;        exit();    }}function responseMsg(){    /* @获取微信推送过来的post数据(xml)     *      * 以下旧的提取方式,php高版本已经废弃了     * $postStr=$GLOBALS['HTTP_RAW_POST_DATA'];     *      * */    $postStr=file_get_contents("php://input");    /* @将xml数据转化为obj     *      * */    $postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);    /* @根据接收到的不同消息,进行相应回复     * 1.用户关注事件     * 2.用户发送消息被动回复     *      * */    if(strtolower($postObj->MsgType)=='event'){        if(strtolower($postObj->Event)=='subscribe'){//用户关注事件            $content="欢迎关注XXXX";            responseText($postObj, $content);        }    }else if(strtolower($postObj->MsgType)=='text'){        switch(trim($postObj->Content)){            /*被动回复文本信息*/            case 'test':                $content="this is test!";                responseText($postObj, $content);                break;            case 'time':                $content="现在是北京时间:".date("Y-m-d H:i:s",time());                responseText($postObj, $content);                break;            case 'website':                $content="<a href='http://www.hewie.cn'>乘风破浪</a>";                responseText($postObj, $content);                break;            /*被动回复图文信息*/            case 'news':                $arr=array(                    array(                    'title'=>'我的csdn博客',                    'description'=>'欢迎访问我的csdn博客',                    'picUrl'=>'http://avatar.csdn.net/9/5/4/1_somehow1002.jpg',                    'url'=>'http://blog.csdn.net/somehow1002',                    ),                    array(                    'title'=>'开源中国',                    'description'=>'。。。。。',                    'picUrl'=>'https://www.oschina.net/img/ie/logo_osc.png','',                    'url'=>'https://www.oschina.net/',                    ),                );                responseNews($postObj, $arr);                break;            default:                $content="sorry, I don't understand!";                $res->responseText($postObj, $content);                break;        }    }}function responseText($postObj,$content){    /* @文字消息回复格式     *      * <xml>     * <ToUserName><![CDATA[toUser]]></ToUserName>     * <FromUserName><![CDATA[fromUser]]></FromUserName>     * <CreateTime>12345678</CreateTime>     * <MsgType><![CDATA[text]]></MsgType>     * <Content><![CDATA[你好]]></Content>     * </xml>     *      * */    $fromUserName=$postObj->ToUserName;    $toUserName=$postObj->FromUserName;    $time=time();    $msgType='text';    $template="<xml>                    <ToUserName><![CDATA[%s]]></ToUserName>                    <FromUserName><![CDATA[%s]]></FromUserName>                    <CreateTime>%s</CreateTime>                    <MsgType><![CDATA[%s]]></MsgType>                    <Content><![CDATA[%s]]></Content>                    </xml>";    echo sprintf($template,$toUserName,$fromUserName,$time,$msgType,$content);}function responseNews($postObj,$arr){    /* @图文消息回复格式     * #一个item一则图文消息     *      * <xml>     * <ToUserName><![CDATA[toUser]]></ToUserName>     * <FromUserName><![CDATA[fromUser]]></FromUserName>     * <CreateTime>12345678</CreateTime>     * <MsgType><![CDATA[news]]></MsgType>     * <ArticleCount>2</ArticleCount>     * <Articles>     * <item>     * <Title><![CDATA[title1]]></Title>     * <Description><![CDATA[description1]]></Description>     * <PicUrl><![CDATA[picurl]]></PicUrl>     * <Url><![CDATA[url]]></Url>     * </item>     * <item>     * <Title><![CDATA[title]]></Title>     * <Description><![CDATA[description]]></Description>     * <PicUrl><![CDATA[picurl]]></PicUrl>     * <Url><![CDATA[url]]></Url>     * </item>     * </Articles>     * </xml>     *      * */    $fromUserName=$postObj->ToUserName;    $toUserName=$postObj->FromUserName;    $time=time();    $msgType='text';    $template="<xml>                    <ToUserName><![CDATA[%s]]></ToUserName>                    <FromUserName><![CDATA[%s]]></FromUserName>                    <CreateTime>%s</CreateTime>                    <MsgType><![CDATA[news]]></MsgType>                    <ArticleCount>".count($arr)."</ArticleCount>                    <Articles>";    foreach($arr as $v){        $template.="                    <item>                    <Title><![CDATA[".$v[title]."]]></Title>                    <Description><![CDATA[".$v[description]."]]></Description>                    <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>                    <Url><![CDATA[".$v[url]."]]></Url>                    </item>";    }    $template.="                    </Articles>                    </xml>";    echo sprintf($template,$toUserName,$fromUserName,time());}

参考微信开发手册
原文地址:http://blog.csdn.net/somehow1002/article/details/76919270
个人见解,如有错误之处,欢迎指正。

原创粉丝点击