你所在的位置:微信群>互联网推广>正文

微信公众平台常用接口-消息交互原理分析

原创
发布时间: 2023-07-11 10:57:38 热度: 211 作者: 李斯特 来源: 微信加 本文共 4709 字 阅读需要 16 分钟
下面我们结合上一节的代码来分析一下微信公众平台的消息交互原理。下面的代码基于微信公众平台官方示例代码修改完善而成。

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

1 <?php 2 /* 3         方倍工作室 http://www.fangbei.org/ 4         CopyRight 2013 www.doucube.com  All Rights Reserved 5 */ 6 7 define(「TOKEN」, 「weixin」); 8 $wechatObj = new wechatCallbackapiTest(); 9  if (isset($_GET[『echostr』])) { 10     $wechatObj->valid(); 11 }else{ 12     $wechatObj->responseMsg(); 13 } 14 15 class wechatCallbackapiTest 16 { 17       public function valid() 18       { 19             $echoStr = $_GET[「echostr」]; 20             if($this->checkSignature()){ 21                  echo $echoStr; 22                  exit; 23             } 24       } 25 26       private function checkSignature() 27       { 28            $signature = $_GET[「signature」]; 29            $timestamp = $_GET[「timestamp」]; 30            $nonce = $_GET[「nonce」]; 31 32            $token = TOKEN; 33            $tmpArr = array($token, $timestamp, $nonce); 34            sort($tmpArr); 35            $tmpStr = implode( $tmpArr ); 36            $tmpStr = sha1( $tmpStr ); 37 38            if(  $tmpStr == $signature ){ 39                 return true; 40            }else{ 41                 return false; 42            } 43       } 44 45        public function responseMsg() 46        { 47              $postStr = $GLOBALS[「HTTP_RAW_POST_DATA」]; 48 49               if (!empty($postStr)){ 50                   $postObj = simplexml_load_string($postStr, 『SimpleXMLElement』, LIBXML_NOCDATA); 51                   $fromUsername = $postObj->FromUserName; 52                   $toUsername = $postObj->ToUserName; 53                   $keyword = trim($postObj->Content); 54                   $time = time(); 55                   $textTpl = 「 56                                     <![CDATA[%s]]> 57                                     <![CDATA[%s]]> 58                                     %s 59                                     <![CDATA[%s]]> 60                                     <![CDATA[%s]]> 61                                     0 62                                     」; 63                   if($keyword == 「?」 || $keyword == 「?」) 64                   { 65                       $msgType = 「text」; 66                       $content = date(「Y-m-d H:i:s」,time()); 67                       $result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content); 68                       echo $result; 69                   } 70              }else{ 71                   echo 「」; 72                   exit; 73              } 74        } 75 } 76 ?>

首先我们来看一下代码的结构。

第 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

上述请求参数说明如表 3-1 所示。

表 3-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 格式如下所示:

                 1392043637                  5978781895719912033

而消息请求不包含 echostr 变量,所以将执行响应消息 responseMsg()方法。

响应消息方法首先接收上述原始 POST 数据(第 47 行)。

然后将数据载入对象中,对象名为 SimpleXMLElement,LIBXML_NOCDATA 表示将 CDATA 合并为文本节点,代码中第 50 行实现此功能。

第 51 行 ~ 第 54 行,取得 XML 类对象的值,并赋给新的变量,注意发送方变为接收方,接收方变为发送方。

第 55 行 ~ 第 62 行,构造要回复的 XML 数据包。

第 63 行,判断发送过来的关键字是不是问号。

第 64 行 ~ 第 65 行,设置回复的消息类型为 text,内容为当前年月日时分秒。

第 66 行 ~ 第 67 行,封装回复的 XML 数据包,并且向微信服务器输出。XML 格式如下所示:

                 1392043638            

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

版权保护: 本文由 李斯特 原创,转载请保留链接: https://www.wechatadd.com/artdet/8917