微信公众平台常用接口-消息交互原理分析
原创下面我们结合上一节的代码来分析一下微信公众平台的消息交互原理。下面的代码基于微信公众平台官方示例代码修改完善而成。
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-03-24
- 成功销售如何.B销售业态的市场营销 2023-03-23
- 社交媒体的强大力量,实现您的梦想和目标,获得成功和财富 2023-04-01
- 创业过程中体会企业经营 2024-02-12
- 真正的销售始于售后——你的财富在老客户那里 2023-03-08
- 成交后客户的信任依然很重要——销售技巧 2023-03-04
- 团队激励:激励销售团队的 29 个方法 2023-05-22
- 微信公众平台常用接口-关注事件消息 2023-07-11
- 如何让更多顾客持续复购,做好这 6 件事,轻松赢得顾客的心 2023-05-22
- 设立目标:你知道你想去的地方吗?[销售秘籍建议收藏] 2023-05-22
- 不说不该说的话——销售技巧 2023-03-04
- 医疗投资:行业重构与创新驱动 2023-09-11
- 效率支柱:流程,轻松提高销售业绩 2023-04-01
- [微信创业]微信创业的盈利模式,口碑营销 2023-07-12
- 小奖品:加强粉丝黏性 2023-07-13
- 快速吸粉——公众号自身平台的营销方法,实战举例:图书征稿大赛之前的准备工作 2023-05-30
- 组建团队,产品打磨(上) 2023-07-13
- (淘宝seo排名优化的方法之)打造高点击率主图,吸引买家主动下单 2023-01-24