php微信公众平台示例代码分析(二)


Posted in PHP onDecember 06, 2016

一、摘要

微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。

二、获取代码

微信官网:http://xiazai.3water.com/201612/yuanma/phpwxsample(3water.com).rar

三、分析代码

完整代码如下:

<?php
/**
 * wechat php test
 */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
 public function valid()
 {
  $echoStr = $_GET["echostr"];

  //valid signature , option
  if($this->checkSignature()){
   echo $echoStr;
   exit;
  }
 }

 public function responseMsg()
 {
  //get post data, May be due to the different environments
  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  //extract 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(!empty( $keyword ))
    {
     $msgType = "text";
     $contentStr = "Welcome to wechat world!";
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
     echo $resultStr;
    }else{
     echo "Input something...";
    }

  }else {
   echo "";
   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;
  }
 }
}

?>

3.1 整体分析

原始示例代码大致分为四个部分:

定义TOKEN
声明一个类 wechatCallbackapiTest
创建类wechatCallbackapiTest 的一个实例对象 $wechatObj
调用类的 valid() 方法。

3.2 详细分析

3.2.1 定义TOKEN

define("TOKEN", "weixin");

define 是用来给常量赋值的函数,这句话的意思是赋予“TOKEN”这个常量值为“weixin”。

TOKEN 是用来进行交互安全认证的,开发者可以随意定义,要和公众平台里设置的一样。

3.2.2 声明一个类

class wechatCallbackapiTest{

}

声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)。

a. public function valid()

用于申请 成为开发者 时向微信发送验证信息。

b. public function responseMsg()

处理并回复用户发送过来的消息,也是用的最多的一个函数,几乎所有的功能都在这里实现。

responseMsg 函数详解:

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
接收微信公众平台发送过来的用户消息,该消息数据结构为XML,不是php默认的识别数据类型,因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,同时赋值给了$postStr

if (!empty($postStr))
判断$postStr是否为空,如果不为空(接收到了数据),就继续执行下面的语句;如果为空,则跳转到与之相对应的else语句。

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postObj中。这个严谨的写法后面还得加个判断是否载入成功的条件语句,不过不写也没事。

$fromUsername = $postObj->FromUserName;
将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量

$toUsername = $postObj->ToUserName;
将对象$postObj中的公众账号的ID赋值给$toUsername变量

$keyword = trim($postObj->Content);
trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词

$time = time();
time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

$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(!empty( $keyword ))

判断$keyword是否为空,不为空则继续执行下面的语句;如果为空,则跳转到与之相对应的else语句,即 echo "Input something...";

$msgType = "text";

消息类型是文本类型

$contentStr = "Welcome to wechat world!";

回复的消息内容

$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

使用sprintf() 函数将格式化的数据写入到变量中去;
$fromUsername, $toUsername, $time, $msgType, $contentStr 分别顺序替换模板里“%s”位置,也即是“$resultStr”这个变量最后实际为:

<xml>
<ToUserName><![CDATA[$toUsername]]></ToUserName>
<FromUserName><![CDATA[$fromUsername]]></FromUserName>
<CreateTime>$time</CreateTime>
<MsgType><![CDATA[$msgType]]></MsgType>
<Content><![CDATA[$contentStr]]></Content>
<FuncFlag>0</FuncFlag>  //位0x0001被标志时,星标刚收到的消息。
</xml>

echo $resultStr;     //把回复的消息输出

c. private function checkSignature()

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请求原样返回echostr参数内容,则接入生效,否则接入失败。

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
3.2.3 创建实例对象

$wechatObj = new wechatCallbackapiTest();

3.2.4 调用类方法验证

$wechatObj->valid();

调用类的valid()方法执行接口验证,接口设置成功后将其注释掉。

四、总结

以上是对微信官方示例代码的一个分析,有解释不对的地方,还请高手指出。另外,该代码只是官方给出的简单示例代码,如果要做复杂的开发,还是要求开发者按照严谨的开发模式改写该段代码,会在后续教程中娓娓道来。

五、参考

微信官方公众平台API文档:http://mp.weixin.qq.com/wiki/index.php

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
PHP新手上路(九)
Oct 09 PHP
PHP面向对象编程快速入门
Dec 14 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
Oct 16 PHP
Laravel中Kafka的使用详解
Mar 24 PHP
php微信公众平台开发(一) 配置接口
Dec 06 #PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 #PHP
php简单实现文件或图片强制下载的方法
Dec 06 #PHP
php+ajax无刷新上传图片的实现方法
Dec 06 #PHP
php解析base64数据生成图片的方法
Dec 06 #PHP
php rsa 加密,解密,签名,验签详解
Dec 06 #PHP
php中namespace及use用法分析
Dec 06 #PHP
You might like
php URL编码解码函数代码
2009/03/10 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
js如何找出字符串中的最长回文串
2018/06/04 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
python/golang 删除链表中的元素
2020/09/14 Python
PHP面试题-$message和$$message的区别
2015/12/08 面试题
简单说说tomcat的配置
2013/05/28 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
优秀护士演讲稿
2014/04/30 职场文书
社保委托书怎么写
2014/08/02 职场文书
手术室护士个人总结
2015/02/13 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
Python 实现定积分与二重定积分的操作
2021/05/26 Python
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
Python天气语音播报小助手
2021/09/25 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python