微信公众平台常用接口-消息交互原理分析
原创下面我们结合上一节的代码来分析一下微信公众平台的消息交互原理。下面的代码基于微信公众平台官方示例代码修改完善而成。
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 = 「
首先我们来看一下代码的结构。
第 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×tamp=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 格式如下所示:
而消息请求不包含 echostr 变量,所以将执行响应消息 responseMsg()方法。
响应消息方法首先接收上述原始 POST 数据(第 47 行)。
然后将数据载入对象中,对象名为 SimpleXMLElement,LIBXML_NOCDATA 表示将 CDATA 合并为文本节点,代码中第 50 行实现此功能。
第 51 行 ~ 第 54 行,取得 XML 类对象的值,并赋给新的变量,注意发送方变为接收方,接收方变为发送方。
第 55 行 ~ 第 62 行,构造要回复的 XML 数据包。
第 63 行,判断发送过来的关键字是不是问号。
第 64 行 ~ 第 65 行,设置回复的消息类型为 text,内容为当前年月日时分秒。
第 66 行 ~ 第 67 行,封装回复的 XML 数据包,并且向微信服务器输出。XML 格式如下所示:
这样用户就会收到回复的消息,效果如图 3-26 所示。
版权保护: 本文由 李斯特 原创,转载请保留链接: https://www.wechatadd.com/artdet/8917
- 上一篇:自动回复当前时间
- 下一篇:微信公众平台常用接口-接收用户普通消息
阅读推荐
更多...- 「销售技巧」开放式问题和封闭式问题 2023-02-28
- 大客户销售,针对善于社交的孔雀型老板,都有哪些点需要注意呢? 2023-05-22
- 怎样留住一声不响要离开的顾客——销售技巧 2023-03-04
- 拒绝诱惑:烧好自己那壶水 2023-10-08
- 商品同质化,如何精准锁定潜在客户 2022-07-16
- 找到并满足用户的潜在痛点,让业绩高速增长! 2023-03-05
- 客户都有好奇心理,获得更多的回头客 2023-04-01
- 数据思维:和客户实现零距离对接,营销流程,从找到目标到互动营销 2023-05-30
- 创业,钱从哪儿来 2023-07-14
- 邮件策略:帮你创造 30% 业绩的邮件营销模式 2023-05-22
- 进行商品分析,激发客户了解欲「销售技巧」 2023-03-04
- 说明书无法赋予产品生命力「销售技巧」 2023-03-02
- 说话「礼」字当头,易赢得客户好感——销售技巧 2023-03-04
- 微视频——低成本营销利器 2023-07-16
- 「业务活动」至上的副作用「销售技巧」 2023-03-02
- QQ群微营销的功能 2023-07-16
- 详情页设计:吸引买家点击和下单 2023-01-24
- 销售绝招: 每个人都是销售 2023-05-20