365体育备用网址报道3.3.4消息交互原理分析_365体育备用网址官网资讯

下面我们结合上一节的代码来分析一下微信公众平台的消息交互原理。下面的代码基于微信公众平台官方示例代码修改完善而成。


<?PHP
header('Content-type:text');
define("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()){
            echo $echoStr;
            exit;
        }
    }
 
    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;
        }
    }
 
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 
        if (!empty($postStr)){
            $postObj = simpleXML_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $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>";
            if($keyword == "?" || $keyword == "?")
            {
                $msgType = "text";
                $content = date("Y-m-d H:i:s",time());
                $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
                echo $result;
            }
        }else{
            echo "";
            exit;
        }
    }
}

首先我们来看一下代码的结构。   第2行~第5行是注释部分。   第7行使用define()函数定义常量,常量名称为TOKEN,常量的值为weixin,这个值就是在启用开拓模式时填写的Token。   第15行~第75行定义了一个类wechatCallbackapiTest,并在类中定义了3个方法valid(),checkSignature(),responseMsg()。 第8行~第13行为程序执行语句。第8行实例化了一个类对象。在第9行中,推断是否有GET要求是否有echostr变量,如果有则执行valid()方法,否则执行responseMsg()方法。 然后分析微信消息交互流程如下。   在提交URL和Token申请验证的时刻,微信服务器将发送GET要求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),GET要求类似如下:

signature=6e35c6f3d3279338781047dbffd09426b9ecdee3&echostr=5979420653038092664&timestamp=1392001400&nonce=1392192345

上述要求参数说明如表2-1所示:

表2-1要求校验参数说明

这个GET要求是包含echostr变量的,所以执行valid()方法,在该方法中,又调用了校验签名方法checkSignature()方法。如果签名校验为真,则原样输出变量$echoStr的值。
加密/校验流程如下:
  1). 将token、timestamp、nonce三个参数进行字典序排序,第33行~第34行。
  2). 将三个参数字符串拼接成一个字符串进行sha1加密,第35行~第36行。
  3). 开拓者获得加密后的字符串可与signature对角,标识该要求来源于微信,第38行~第42行。
  而在发送问号的时刻,微信服务器将也会带上前面三个参数(signature、timestamp、nonce)访问开拓者设置的URL,同时也还会消息的XML数据包将POST到URL上。XML格式类似如下:

<xml>
    <ToUserName><![CDATA[gh_ba6050bc0be7]]></ToUserName>
    <FromUserName><![CDATA[oDeOAjgSJUX10wvImSRMSwmyQAyA]]></FromUserName>
    <CreateTime>1392043637</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[?]]></Content>
    <MsgId>5978781895719912033</MsgId>
</xml>

而消息要求不包含echostr变量,所以将执行响应消息responseMsg()方法。
  响应消息方法首先接收上述原始POST数据,第47行。
  然后将数据载入对象中,对象名为SimpleXMLElement,LIBXML_NOCDATA 表示将CDATA合并为文本节点,代码中第50行实现此功能。
  第51行~第54行,取得XML类对象的值,并赋给新的变量,注意发送方变为接收方,接收方变为发送方。
  第55行~第62行,构造要回复的XML数据包。
  第63行,推断发送过来的关键字是不是问号。
  第64行~第65行,设置回复的消息类型为text,内容为当前年月日时分秒。
  第66行~第67行,封装回复的XML数据包,并且向微信服务器输出。XML格式如下所示:

<xml>
    <ToUserName><![CDATA[oDeOAjgSJUX10wvImSRMSwmyQAyA]]></ToUserName>
    <FromUserName><![CDATA[gh_ba6050bc0be7]]></FromUserName>
    <CreateTime>1392043638</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[2014-01-05 11:43:23]]></Content>
</xml>

这样用户就会收到回复的消息,效果就如上面的图3-26所示。

------分隔线----------------------------

公布评论 (170人察看0条评论)
请自觉遵守互联网相关的政策法规,严禁公布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换千亿qy966
最新评论