php微信公众平台开发类实例


Posted in PHP onApril 01, 2015

本文实例讲述了php微信公众平台开发类。分享给大家供大家参考。具体分析如下:

ThinkWechat.php类文件如下:

<?php
class Wechat {
 /**
 * 微信推送过来的数据或响应数据
 * @var array
 */
 private $data = array();
 /**
 * 构造方法,用于实例化微信SDK
 * @param string $token 微信开放平台设置的TOKEN
 */
 public function __construct($token) {
 $this->auth($token) || exit;
 if(!empty($_GET['echostr'])){
  exit($_GET['echostr']);
 } else {
  try
  {
  $xml = file_get_contents("php://input");
  $xml = new SimpleXMLElement($xml);
  $xml || exit;
  foreach ($xml as $key => $value) {
   $this->data[$key] = strval($value);
  }
  }catch(Exception $e){
  }
 }
 }
 /**
 * 获取微信推送的数据
 * @return array 转换为数组后的数据
 */
 public function request(){
 return $this->data;
 }
 /**
 * * 响应微信发送的信息(自动回复)
 * @param string $to 接收用户名
 * @param string $from 发送者用户名
 * @param array $content 回复信息,文本信息为string类型
 * @param string $type 消息类型
 * @param string $flag 是否新标刚接受到的信息
 * @return string  XML字符串
 */
 public function response($content, $type = 'text', $flag = 0){
 /* 基础数据 */
 $this->data = array(
  'ToUserName' => $this->data['FromUserName'],
  'FromUserName' => $this->data['ToUserName'],
  'CreateTime' => time(),
  'MsgType' => $type,
 );
 /* 添加类型数据 */
 $this->$type($content);
 /* 添加状态 */
 $this->data['FuncFlag'] = $flag;
 /* 转换数据为XML */
 $xml = new SimpleXMLElement('<xml></xml>');
 $this->data2xml($xml, $this->data);
 exit($xml->asXML());
 }
 /**
 * 回复文本信息
 * @param string $content 要回复的信息
 */
 private function text($content){
 $this->data['Content'] = $content;
 }
 /**
 * 回复音乐信息
 * @param string $content 要回复的音乐
 */
 private function music($music){
 list(
  $music['Title'], 
  $music['Description'], 
  $music['MusicUrl'], 
  $music['HQMusicUrl']
 ) = $music;
 $this->data['Music'] = $music;
 }
 /**
 * 回复图文信息
 * @param string $news 要回复的图文内容
 */
 private function news($news){
 $articles = array();
 foreach ($news as $key => $value) {
  list(
  $articles[$key]['Title'],
  $articles[$key]['Description'],
  $articles[$key]['PicUrl'],
  $articles[$key]['Url']
  ) = $value;
  if($key >= 9) { break; } //最多只允许10调新闻
 }
 $this->data['ArticleCount'] = count($articles);
 $this->data['Articles'] = $articles;
 }
 /**
 * 数据XML编码
 * @param object $xml XML对象
 * @param mixed $data 数据
 * @param string $item 数字索引时的节点名称
 * @return string
 */
 private function data2xml($xml, $data, $item = 'item') {
 foreach ($data as $key => $value) {
  /* 指定默认的数字key */
  is_numeric($key) && $key = $item;
  /* 添加子元素 */
  if(is_array($value) || is_object($value)){
  $child = $xml->addChild($key);
  $this->data2xml($child, $value, $item);
  } else {
  if(is_numeric($value)){
   $child = $xml->addChild($key, $value);
  } else {
   $child = $xml->addChild($key);
   $node = dom_import_simplexml($child);
   $node->appendChild($node->ownerDocument->createCDATASection($value));
  }
  }
 }
 }
 /**
 * 对数据进行签名认证,确保是微信发送的数据
 * @param string $token 微信开放平台设置的TOKEN
 * @return boolean true-签名正确,false-签名错误
 */
 private function auth($token){
 if(empty($_GET['signature'])) return;
 /* 获取数据 */
 $data = array($_GET['timestamp'], $_GET['nonce'], $token);
 $sign = $_GET['signature'];
 /* 对数据进行字典排序 */
 sort($data,SORT_STRING);
 /* 生成签名 */
 $signature = sha1(implode($data));
 return $signature === $sign;
 }
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
用 php 编写的日历
Oct 09 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
php常用表单验证类用法实例
Jun 18 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 PHP
php+js实现裁剪任意形状图片
Oct 31 PHP
thinkphp5框架扩展redis类方法示例
May 06 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
PHP生成指定随机字符串的简单实现方法
Apr 01 #PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
Apr 01 #PHP
php快速查找数据库中恶意代码的方法
Apr 01 #PHP
php将12小时制转换成24小时制的方法
Mar 31 #PHP
php给一组指定关键词添加span标签的方法
Mar 31 #PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 #PHP
php输出全球各个时区列表的方法
Mar 31 #PHP
You might like
多人战的战术与战略
2020/03/04 星际争霸
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
Python socket编程实例详解
2015/05/27 Python
python3编码问题汇总
2016/09/06 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
浅析python参数的知识点
2018/12/10 Python
python实现共轭梯度法
2019/07/03 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
反腐倡廉警示教育活动总结
2014/05/05 职场文书
党员自我评价范文2015
2015/03/03 职场文书
大学生求职意向书
2015/05/11 职场文书
迎新年主持词
2015/07/06 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
Nginx实现会话保持的两种方式
2022/03/18 Servers