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 相关文章推荐
PHP个人网站架设连环讲(三)
Oct 09 PHP
php xml实例 留言本
Mar 20 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
PHP+MySQL删除操作实例
Jan 21 PHP
php强制更新图片缓存的方法
Feb 11 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
php实现通过ftp上传文件
Jun 19 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
Jun 13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
JS继承--原型链继承和类式继承
2013/04/08 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
简单的分页代码js实现
2016/05/17 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python import用法以及与from...import的区别
2015/05/28 Python
Python解析json文件相关知识学习
2016/03/01 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
详解python datetime模块
2020/08/17 Python
英国电子专家:maplin
2019/09/04 全球购物
护理自荐信范文
2013/10/05 职场文书
药物学专业学生的自我评价
2013/10/27 职场文书
学校火灾防控方案
2014/06/09 职场文书
预备党员转正材料
2014/12/19 职场文书
2015选调生工作总结
2015/07/24 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技