• 技术文章 >微信小程序 >微信开发

    PHP微信开发之微信消息自动回复遇到的问题

    高洛峰高洛峰2017-03-21 16:10:04原创918
    这篇文章是小编给大家介绍的微信消息自动回复下所遇到的坑的相关内容,在日常项目开发中经常遇到,非常具有参考借鉴价值,感兴趣的小伙伴一起学习吧

    微信回复原理:

    当普通微信用户向公众账号发送消息时,微信服务器首先收到用户发送的消息;

    然后将用户信息和消息打包成XML格式的数据包,再将这个XML数据包通过POST方法提交到开发者设置的URL上。

    疑问一:为何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST过来的数据,而非$_POST数组

    回答:

    POST只能保存标准的数据类型,对于XML、SOAP或Application/Octet-steam之类的内容则无法解析。

    而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一样的,如果POST过来的数据PHP能够识别,则可以用$GLOBALS["HTTP_RAW_POST_DATA"]来接收。

    疑问二:simplexml_load_file()各参数和返回值是什么?

    回答:

    参数含义

    string:需要处理的XML字符串

    class:用来指定新对象,通常设置为"SimpleXMLElement",生成一个简单XML元素的类。

    options:指定附加的Libxml参数,通常设置为常量LIBXML_NOCDATA,表示把CDATA设置为文本节点。

    ns:一般省略

    is_prefix:一般省略

    函数执行完成后返回SimpleXMLElement类的一个对象。

    功能:公众号只接受文字消息,且做出相应的文字回复。

    <span style="font-family:Courier New;font-size:14px;"><?php 
    define("TOKEN","weixin"); 
    $weixinObj = new Wechat(); 
    $weixinObj->valid(); 
    class Wechat{ 
    public function valid(){ 
    $echoStr = $_GET['echostr']; 
    //如果是第一次接入 
    if($this->checkSignature() && $echoStr ){ 
    echo $echoStr; 
    exit; 
    }else{ 
    $this->responseMsg(); 
    } 
    } 
    //校验方法 
    private function checkSignature(){ 
    $signature = $_GET['signature']; 
    $timestamp = $_GET['timestamp']; 
    $nonce = $_GET['nonce']; 
    $token = TOKEN; 
    $tmpArr = array($token, $timestamp, $nonce); 
    sort($tmpArr); 
    $tmpStr = implode($tmpArr); 
    $tmpStr = sha1($tmpStr); 
    if($tmpStr == $signature){ 
    return true; 
    }else{ 
    return false; 
    } 
    } 
    /* 普通文本消息 
    <xml> 
    <ToUserName><![CDATA[toUser]]></ToUserName> 
    <FromUserName><![CDATA[fromUser]]></FromUserName> 
    <CreateTime>1348831860</CreateTime> 
    <MsgType><![CDATA[text]]></MsgType> 
    <Content><![CDATA[this is a test]]></Content> 
    </xml> 
    */ 
    public function responseMsg(){ 
    //获取微信服务器POST请求中的数据 
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
    if( !empty($postStr) ){ 
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $fromUser = $postObj->FromUserName; 
    $toUser = $postObj->ToUserName; 
    $keyword = trim($postObj->Content); 
    $time = time(); 
    $template = "<xml> 
    <ToUserName><![CDATA[%s]]></ToUserName> 
    <FromUserName><![CDATA[%s]]></FromUserName> 
    <CreateTime>%s</CreateTime> 
    <MsgType><![CDATA[%s]]></MsgType> 
    <Content><![CDATA[%s]]></Content> 
    </xml>"; 
    if( strtolower($postObj->MsgType)!='text' ){ 
    $msgType = "text"; 
    $content = "我只接受文本消息"; 
    }else{ 
    $msgType = "text"; 
    if( !empty($keyword) ){ 
    $content = "您发送的消息是:".$postObj->Content; 
    }else{ 
    $content = "请输入关键字";//消息为空 
    } 
    } 
    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 
    echo $info; 
    }else{ 
    echo ""; 
    exit; 
    } 
    } 
    }</span>

    功能:公众号只接受图片消息,且做出相应的文字回复。

    <span style="font-family:Courier New;font-size:14px;"><?php 
    define("TOKEN","weixin"); 
    $weixinObj = new Wechat(); 
    $weixinObj->valid(); 
    class Wechat{ 
    public function valid(){ 
    $echoStr = $_GET['echostr']; 
    //如果是第一次接入 
    if($this->checkSignature() && $echoStr ){ 
    echo $echoStr; 
    exit; 
    }else{ 
    $this->responseMsg(); 
    } 
    } 
    //校验方法 
    private function checkSignature(){ 
    $signature = $_GET['signature']; 
    $timestamp = $_GET['timestamp']; 
    $nonce = $_GET['nonce']; 
    $token = TOKEN; 
    $tmpArr = array($token, $timestamp, $nonce); 
    sort($tmpArr); 
    $tmpStr = implode($tmpArr); 
    $tmpStr = sha1($tmpStr); 
    if($tmpStr == $signature){ 
    return true; 
    }else{ 
    return false; 
    } 
    } 
    /* 接收图片消息格式 
    <xml> 
    <ToUserName><![CDATA[toUser]]></ToUserName> 
    <FromUserName><![CDATA[fromUser]]></FromUserName> 
    <CreateTime>1348831860</CreateTime> 
    <MsgType><![CDATA[image]]></MsgType> 
    <PicUrl><![CDATA[this is a url]]></PicUrl> 
    <MediaId><![CDATA[media_id]]></MediaId> 
    <MsgId>1234567890123456</MsgId> 
    </xml> 
    */ 
    public function responseMsg(){ 
    //获取微信服务器POST请求中的数据 
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
    if( !empty($postStr) ){ 
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $fromUser = $postObj->FromUserName; 
    $toUser = $postObj->ToUserName; 
    $time = time(); 
    $msgType= $postObj->MsgType; 
    $picUrl = $postObj->PicUrl; 
    $mediaId = $postObj->MediaId; 
    $template = "<xml> 
    <ToUserName><![CDATA[%s]]></ToUserName> 
    <FromUserName><![CDATA[%s]]></FromUserName> 
    <CreateTime>%s</CreateTime> 
    <MsgType><![CDATA[%s]]></MsgType> 
    <Content><![CDATA[%s]]></Content> 
    </xml>"; 
    if( strtolower($msgType)!='image' ){ 
    $msgType = "text"; 
    $content = "我只接受图片消息"; 
    }else{ 
    $msgType = "text"; 
    if( !empty( $picUrl ) ){ 
    $content = "图片链接为:".$picUrl."\n"; 
    $content .= "媒体id:".$mediaId; 
    }else{ 
    $content = "请发送图片";//消息为空 
    } 
    } 
    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 
    echo $info; 
    }else{ 
    echo ""; 
    exit; 
    } 
    } 
    }</span>

    以上是小编给大家分享的微信消息自动回复下所遇到的坑的相关知识,希望对大家有所帮助!

    以上就是PHP微信开发之微信消息自动回复遇到的问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php微信公众号开发前的问题 下一篇:python3开发微信企业号发送图文方法
    千万级数据并发解决方案

    相关文章推荐

    • 微信公众开发使用消息接的方法• 微信支付开发全网发布• NodeJs开发微信公众号微信事件交互实例代码• 微信开发—带参数二维码的使用 • C#开发微信门户及应用(1)--开始使用微信接口
    1/1

    PHP中文网