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开发环境配置记录
Jan 14 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
php 批量添加多行文本框textarea一行一个
Jun 03 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
php 数组随机取值的简单实例
May 23 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP fclose函数用法总结
Feb 15 PHP
laravel请求参数校验方法
Oct 10 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
PHP Mysql编程之高级技巧
2008/08/27 PHP
php 中英文语言转换类
2011/09/07 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
javascript 数组的方法集合
2008/06/05 Javascript
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
JavaScript模块详解
2017/12/18 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
营销专业应届生求职信
2013/11/26 职场文书
公休请假条
2014/04/11 职场文书
倡议书格式范文
2014/04/14 职场文书
公司联欢会策划方案
2014/05/19 职场文书
迎新晚会策划方案
2014/06/13 职场文书
物流仓管员岗位职责
2015/04/01 职场文书