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
新闻分类录入、显示系统
Oct 09 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
Chrome Web App开发小结
Sep 04 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
Smarty模板变量调节器用法分析
May 23 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
php设计模式之装饰模式应用案例详解
Jun 17 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
php基础知识:类与对象(5) static
2006/12/13 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
动态加载script文件的两种方法
2013/08/15 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Pyramid添加Middleware的方法实例
2013/11/27 Python
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
点球小游戏python脚本
2018/05/22 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
tensorflow 查看梯度方式
2020/02/04 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
Servlet方面面试题
2016/09/28 面试题
实习教师个人的自我评价
2013/11/08 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
公司授权委托书范本
2014/09/18 职场文书
普通党员对照检查材料
2014/09/24 职场文书
同意离婚答辩状
2015/05/22 职场文书