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下过滤HTML代码的函数
Dec 10 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
用php过滤危险html代码的函数
Jul 22 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
php常用表单验证类用法实例
Jun 18 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
Oct 03 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php URL编码解码函数代码
2009/03/10 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
2017/09/28 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
python之Socket网络编程详解
2016/09/29 Python
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
PHP如何防止SQL注入
2014/05/03 面试题
数据库什么时候应该被重组
2012/11/02 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
婚礼主持词开场白
2014/03/13 职场文书
研发工程师岗位职责
2014/04/28 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
诚实守信主题班会
2015/08/13 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技