[转]SpeedPHP微信接口扩展
这个扩展实现了SP和微信公众平台的对接,1.0版暂时只实现了最简单的功能:绑定,收信息,回复信息。
扩展配置方法:
$spConfig = array(
'mode' => 'debug'
//扩展配置
, 'ext' => array(
//微信扩展设置
'spWeiXin' => array(
'TOKEN' => 'weixin' //微信通信密钥,后台设置
)
)
);
然后在controll的方法里面执行:
$wx = spClass('spWeiXin');
$msg = $wx->run();
就行了,如果是绑定那么会直接输出微信指定显示的echostr,程序中止执行。如果是收到信息,那么$msg就是收到的信息的数组,键名对照微信官方文档就成。
<?php
/**
* <b>SpeedPHP微信接口扩展</b>
* <p>2013年8月15日 08:51:23</p>
* @author Lee(leeldy[AT]163.com)
* @version 1.0
*/
class spWeiXin {
//微信通信密钥
private $token;
//微信公众帐号ID
private $publicuserid;
//信息接受者
private $touserid;
public function __construct() {
$params = spExt('spWeiXin');
//获取配置参数
if (empty($params['TOKEN'])) {
spError('微信公众帐号通信密钥未设置!');
}
$this->token = $params['TOKEN'];
}
/**
* 绑定微信接口
* @return string|false
*/
public function bind() {
//随机字符串
$echoStr = $_GET["echostr"];
//微信加密签名
$signature = $_GET["signature"];
//签名时间戳
$timestamp = $_GET["timestamp"];
//加密随机数
$nonce = $_GET["nonce"];
/*
* 加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
*/
$tmpArr = array($this->token, $timestamp, $nonce);
sort($tmpArr);
$_signature = sha1(implode($tmpArr));
if ($_signature != $signature) {
//签名不正确,返回false
$echoStr = false;
}
return $echoStr;
}
/**
* 接收消息,返回消息数组
* @return array
*/
public function receive() {
$raw = $this->php_fix_raw_query();
$msg = false;
if (!empty($raw)) {
$msg = (array) simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'], 'SimpleXMLElement', LIBXML_NOCDATA);
$this->publicuserid = $msg['ToUserName'];
$this->touserid = $msg['FromUserName'];
}
return $msg;
}
/**
* 获取 POST 提交的原始数据
* @author robotreply at gmail dot com (24-Jul-2009 08:17)
* @return string
*/
private function php_fix_raw_query() {
// Try globals array
//试图从全局变量中获取
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
return $GLOBALS["HTTP_RAW_POST_DATA"];
}
// Try globals variable
//试图从全局变量中获取
if (isset($HTTP_RAW_POST_DATA)) {
return $HTTP_RAW_POST_DATA;
}
$post = '';
// Try stream
//试图从流中获取
if (!function_exists('file_get_contents')) {
//php://input is not available with enctype="multipart/form-data".
$fp = fopen("php://input", "r");
if ($fp) {
while (!feof($fp)) {
$post = fread($fp, 1024);
}
fclose($fp);
}
} else {
$post = file_get_contents("php://input");
}
return $post;
}
/**
* <b>回复文本消息</b>
* <p>对于每一个POST请求,开发者在响应包中返回特定xml结构</p>
* <p>对该消息进行响应(现支持回复文本、图文、语音、视频、音乐和对收到的消息进行星标操作)</p>
* <p>微信服务器在五秒内收不到响应会断掉连接。</p>
* @param string $Content 回复的消息内容
* @return string|false
*/
public function replyText($Content) {
$msg = false;
if (!empty($Content)) {
//CreateTime 消息创建时间
$CreateTime = time();
$msg = <<<XML
<xml>
<ToUserName><![CDATA[{$this->touserid}]]></ToUserName>
<FromUserName><![CDATA[{$this->publicuserid}]]></FromUserName>
<CreateTime>{$CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$Content}]]></Content>
</xml>
XML;
}
return $msg;
}
/**
* <b>回复音乐消息</b>
* @param string $Title 标题
* @param string $Description 描述
* @param string $MusicUrl 音乐链接
* @param string $HQMusicUrl 高质量音乐链接,WIFI环境优先使用该链接播放音乐
* @return string|false
*/
public function replyMusic($Title, $Description, $MusicUrl, $HQMusicUrl) {
$msg = false;
if (!empty($MusicUrl)) {
//CreateTime 消息创建时间
$CreateTime = time();
$msg = <<<XML
<xml>
<ToUserName><![CDATA[{$this->touserid}]]></ToUserName>
<FromUserName><![CDATA[{$this->publicuserid}]]></FromUserName>
<CreateTime>{$CreateTime}</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[{$Title}]]></Title>
<Description><![CDATA[{$Description}]]></Description>
<MusicUrl><![CDATA[{$MusicUrl}]]></MusicUrl>
<HQMusicUrl><![CDATA[{$HQMusicUrl}]]></HQMusicUrl>
</Music>
</xml>
XML;
}
return $msg;
}
/**
* 回复图文消息
* @param type $Articles 文章列表 array(array(Title,PicUrl,Url))
* @return string|false
*/
public function replyNews($Articles) {
$msg = false;
$articlesStr = '';
//图文消息个数,限制为10条以内
$ArticleCount = 0;
foreach ($Articles as $_art) {
if (!empty($_art['Title']) && !empty($_art['PicUrl']) && !empty($_art['Url'])) {
$ArticleCount++;
$articlesStr .= "
<item>
<Title><![CDATA[{$_art['Title']}]]></Title>
<Description><![CDATA[{$_art['Description']}]]></Description>
<PicUrl><![CDATA[{$_art['PicUrl']}]]></PicUrl>
<Url><![CDATA[{$_art['Url']}]]></Url>
</item>";
}
}
if (!empty($ArticleCount)) {
//CreateTime 消息创建时间
$CreateTime = time();
$msg = <<<XML
<xml>
<ToUserName><![CDATA[{$this->touserid}]]></ToUserName>
<FromUserName><![CDATA[{$this->publicuserid}]]></FromUserName>
<CreateTime>{$CreateTime}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>{$ArticleCount}</ArticleCount>
<Articles>{$articlesStr}
</Articles>
</xml>
XML;
}
return $msg;
}
/**
* 运行
* @return type
*/
function run() {
//微信服务器每次请求都会将signature,timestamp,nonce三个参数GET到接口
//只能通过是否存在echostr来判断是否是接口绑定动作
if (isset($_GET['echostr'])) {
//绑定
exit($this->bind());
} else {
//收到信息
return $this->receive();
}
}
}
?>
[转]SpeedPHP微信接口扩展的更多相关文章
- C#开发微信门户及应用(1)--开始使用微信接口
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...
- C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理
在很多情况下,我们利用IOC控制反转可以很方便实现一些接口的适配处理,可以在需要的时候切换不同的接口实现,使用这种方式在调用的时候,只需要知道相应的接口接口,具体调用哪个实现类,可以在配置文件中动态指 ...
- 转 C#开发微信门户及应用(1)--开始使用微信接口
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...
- (转)C#开发微信门户及应用(1)--开始使用微信接口
http://www.cnblogs.com/wuhuacong/p/3613826.html 微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习 ...
- 练习题(登陆-进度条-微信接口判断qq-微信接口判断列车时刻表-)
1.写一个用户的登陆注册的界面,用户的密码用hashlib加密存在文件中,登陆时候,用户的密码要和文件中的密码一致才行 def sha(password): #加密函数 passwd = hashli ...
- C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...
- java微信接口之五—消息分组群发
一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...
- java微信接口之四—上传素材
一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...
- java微信接口之三—上传多媒体文件
一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...
随机推荐
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题
实际上这里说的是移植的第一步,下载到源码后,我用的是opencv2.4.9,解压缩,然后可以利用cmake-gui来进行configure配置,这里面需要设置交叉编译的工具链,具体的可以参考[Linu ...
- 【Qt开发】V4L2 API详解 Camera详细设置
Camera的可设置项极多,V4L2 支持了不少.但Sam之前对这些设置的用法和涵义都是在看videodev2.h中边看边理解,感觉非常生涩.直到写这篇blog时,才发现v4l2有专门的SPEC来说明 ...
- Java第一周总结
通过两周的Java学习最深刻的体会就是Java好像要比C要简单一些. 然后这两周我学习到了很多东西,李老师第一次上课就给我们介绍了Java的发展历程,同时还有Java工具jdk的发展历程. Java语 ...
- 剑指Offer编程题(Java实现)——从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 思路一:使用头插法 使用头插法可以得到一个逆序的链表.遍历链表,每次将所遍历节点插入到链表的头部. 头结点和第一个 ...
- win10远程桌面报出现身份验证错误,要求的函数不受支持
win10远程桌面报出现身份验证错误,要求的函数不受支持 编写人:左丘文 2019-6-6 公司换了一台新笔记本电脑,是win10操作系统,刚想远程连接一下服务器,发现以前很正常的功能,发现不行了.网 ...
- PyCharm控制台python shell 和 IPython shell的切换
1. IPython介绍 IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许 ...
- Scrapy 教程(十)-管道与数据库
Scrapy 框架将爬取的数据通过管道进行处理,即 pipelines.py 文件. 管道处理流程 一.定义 item item 表示的是数据结构,定义了数据包括哪些字段 class TianqiIt ...
- Fusioncharts图表常用参数设置
1.1 <chart>参数设置: 图表和轴的标题* caption=”String” : 图表上方的标题* subCaption=”String” : 图表上方的副标题* xAxisNam ...
- 2019-11-26-Resharper-去掉注释拼写
title author date CreateTime categories Resharper 去掉注释拼写 lindexi 2019-11-26 8:42:5 +0800 2018-09-04 ...
- git上传代码到code.csdn.net
国内有code.csdn.net速度很快 用git上传需要去下载git程序 很简单. 我是Windows下 先code.csdn.net创建一个项目 https://code.csdn.net/das ...