微信PHP快速开发框架!将微信的各个功能进行了封装,只需要简单的调用方法和传递参数即可。
框架名称:LaneWeChat
框架简介:这是一个为快速开发微信应用而生的PHP框架。将微信的开发者功能根据文档进行了封装。为了快速开发的目的,开发者完全不需要要知道具体是如何实现的,只需要简单的调用方法即可
开发语言:PHP
版本要求:原则PHP5.3以上
版本规避:若版本低于PHP5.3,则删除本框架所有页面开头“namespace”的行、删除本框架中所有的“use LaneWeChat”开头的行,删除“LaneWeChat\Core”,修改Autoloader::NAMESPACE_PREFIX='',修改curl.lib.php的\Exception为Exception即可。
命名空间:本框架的命名空间均为LaneWeChat开头。
开源协议:Do What The Fuck You Want To Public License
开发者博客:http://www.lanecn.com
文档地址:http://lanewechat.lanecn.com/
更新日志:
2016-05-05 1.5.4
1、接收数据方式由HTTP_RAW_POST_DATA替换为php://input. HTTP_RAW_POST_DATA在PHP5.6以后就不再推荐使用.
2016-04-26 1.5.4
1、新增生成个性化菜单方法Menu::setPersonalMenuJson($menuListJson)
2、新增生成默认菜单方法Menu::setMenuJson($menuListJson),与原生成默认菜单函数Menu::setMenu($menuList),此函数参数是json字符串
3、新增Environment类, isSae($appname,$accesskey)方法判断所在环境是否是SAE平台。
4、外部类调用的入口,一定是getAccessToken(),所以进入此方法后调用Environment::isSae($appname,$accesskey)判断平台属性,若不是SAE,逻辑不变原用户不受影响,否则根据SAE环境执行不同的获取token的方法。
5、新增AccessToken::_getSae()方法,在SAE平台上根据条件的不同,选择从memcache/文件/数据库中读取access_token.
6、新增AccessToken::_getFromMemcache()方法,在SAE平台上从memcache中读取access_token。
7、新增AccessToken::_getFromFile()方法,从文件中读取access_token。
1) 在获取access_token的过程中需要调用私有方法_existsToken(),_expriseToken()
2) 此方法在其他平台上的可写目录中可以正常执行,因为SAE平台不支持本地创建/写文件,可通过改写此方法在SAE的storage中创建/读/写文件,
个人感觉任何缓存、中间临时交换数据的需求都是不适合使用Storage和KVDB存储的,所以没有添加相关的方法实现(有什么理解不对的请指出)。
8、改写WechatRequest::eventQrsceneSubscribe方法,用户在扫描带参数二维码之后,可根据所带参数实现对用户自动分组的功能
1、修复主动响应的BUG,感谢 晨露微凉<[email protected]> 反馈。
2015-10-21 1.5.3
1、文件上传根据PHP版本增加了CURLFile()类。自PHP5.5以后,废弃了“@文件名”的方式上传文件
2015-06-29 1.5.2
1、在主动发消息模块(responseinitiative.lib.php)pic_url 和 url赋值反了。
2015-04-29 1.5.1
1、新增获取微信服务器IP列表接口。如果需要安全性校验,可以每次判断请求的来源IP。
2、新增接收消息类型:小视频
3、新增 模板消息-设置行业 和 模板消息-获取模板ID
4、高级群发接口-根据分组群发 新增参数is_to_all,使用is_to_all为true且成功群发,会使得此次群发进入历史消息列表。
5、新增 高级群发接口-预览接口【订阅号与服务号认证后均可用】 和 高级群发接口-查询群发消息发送状态【订阅号与服务号认证后均可用】
6、新增 客服帐号管理-获取所有客服账号列表/添加客服账号/修改客服账号/删除客服账号/设置客服头像
7、新增 自动回复-获取自动回复 接口
2014-12-04 1.4.2
1、解决CURL的GET调用在php5.3以下时出现errno=60(CA证书无效)的BUG。(解决人:大志<[email protected]>)
2、文档、注释优化。(zhulin3141)
3、实战演练 - 添加微信自定义菜单 文档场景描述错误
2014-11-05:1.4版本
兼容性:
设置菜单Menu::setMenu($menuList)参数结构和返回值重写,不向下兼容。
根目录下新增lanewechat.php:
在项目用需要使用本SDK的地方,只需要include 'lanewechat/lanewechat.php',然后可以直接ClassName::method()调用即可。
安全性升级:
因为SSL爆出高危漏洞,公众平台在2014.11.30起,将关闭SSLv2,SSLv3版本的支持。根据官方实例,LaneWeChat的CURL类中也将使用curl_setopt($curl, CURLOPT_SSLVERSION, 1)
新增消息体签名加解密验证(EncodingAESKey),默认为空,为空时微信公众号平台会自动生成。也可以开发者自行手动指定。
新增语音消息识别
新增高级群发接口:
1 上传图文消息素材
2 根据分组进行群发,可发送图文消息,文本消息,图片消息,语音消息,视频消息。
3 根据OpenID列表群发,,可发送图文消息,文本消息,图片消息,语音消息,视频消息。
4 删除群发
5 事件推送群发结果
新增模板消息接口:
1、主动推送给用户模板消息的接口
2、被动接收微信服务器发送的关于主动推送模板消息的结果通知。
用户管理接口:
1、新增设置备注名。开发者可以通过该接口对指定用户设置备注名,该接口暂时开放给微信认证的服务号。
网页授权接口:
注意:此access_token与基础支持的access_token不同。
1、新增刷新access_token。由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
2、新增scope为snsapi_userinfo的模式下(会在网页弹出一个授权框),拉取用户信息的接口。
3、新增检验授权凭证(access_token)是否有效接口
新增多客服功能:
1、新增将消息转发到多客服接口:在接收到用户发送的消息时,调用ResponsePassive::forwardToCustomService($fromusername, $tousername),微信服务器在收到这条消息时,会把这次发送的消息转到多客服系统。用户被客服接入以后,客服关闭会话以前,处于会话过程中,用户发送的消息均会被直接转发至客服系统。
2、新增获取客服聊天记录接口:在需要时,开发者可以通过获取客服聊天记录接口,获取多客服的会话记录,包括客服和用户会话的所有消息记录和会话的创建、关闭等操作记录。利用此接口可以开发如“消息记录”、“工作监控”、“客服绩效考核”等功能。
自定义菜单:
警告:设置菜单Menu::setMenu($menuList)参数结构和返回值重写,自1.4版本起不向下兼容。
注意:所有新增的菜单类型,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。
1、新增“scancode_push:扫码推事件”类型菜单
用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
2、新增“scancode_waitmsg:扫码推事件且弹出‘消息接收中’提示框”类型菜单
用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
3、新增“pic_sysphoto:弹出系统拍照发图”类型菜单
用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
4、新增“pic_photo_or_album:弹出拍照或者相册发图”类型菜单
用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
5、新增“pic_weixin:弹出微信相册发图器”类型菜单
用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
6、新增“location_select:弹出地理位置选择器”类型菜单
用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
7、新增了以上6种菜单类型、view(点击跳转链接)的菜单类型的被动响应的支持。默认讲点击菜单的事件推送数据发送文本消息返回给用户。开发者请自行修改。
新增语义理解接口
1、如输入“查一下明天从北京到上海的南航机票”,类型为“flight,hotel”,则返回机票信息。
新增推广支持:
1、新增获取二维码接口。二维码分临时二维码和永久二维码。第一步先获取ticket,第二部是拿ticket获取二维码图片。二维码可以保存为文件,也可以展示预览。
2、新增长链接转短链接接口。
新增实例示范:
1、被动响应用户 - 发送图文消息
2、群发图文消息
3、推送模板消息
4、添加自定义菜单
5、页面展示二维码
关于获取用户信息的新亮点 - unionId:
获取用户信息是根据openId获取,同一个微信用户对于不同的公众号,是不同的openId。那问题就来了,如果你有多个公众号,想要共享一份用户数据,可是同一个用户在不同的公众号是不同的openId,我们无法判断是否是同一个用户,现在微信引入了UnionId的概念。
如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
在绑定了公众号后,我们根据openId获取用户信息的时候,会新增一个字段“unionid”,只要是同一个用户,在不同的公众号用不同的openId获取用户信息的时候unionid是相同的。
此功能不需要新增/修改代码,只需要在微信开放平台绑定公众号就可以了。仍旧使用获取用户信息接口UserManage::getUserInfo($openId);
2014-10-14:1.2.2版本。新增自动载入函数
2014-08-17:1.2版本。新增自定义菜单功能、新增多媒体上传下载功能。
2014-08-07:1.0版本文档目录:
1、常识普及。
2、如何安装。
3、初出茅庐。
4、流程分析。
5、牛刀小试。
6、函数详解。
7、实例示范。常识普及:
一、微信公众账号分两种,一种是订阅号,一种是服务号。
1、订阅号是被动响应用户消息功能,并且每天推送一条消息。
2、服务号是300元/每年认证,被动响应用户消息,主动给用户发送消息,自定义菜单按钮,网页授权等功能,并且每月推送一条消息。
3、订阅号适合消息类,新闻类应用,常常需要推送文章给用户的;服务号适合自助查询等。
4、订阅号被认证后也享用自定义菜单等功能,仍旧是300元/每年二、专业术语:
1、OpenId:微信服务器并不会告诉公众号用户的微信ID,即使是你的关注者也不行,为了解决开发中唯一标识的问题,微信使用了OpenId,所谓的OpenId,就是用户和微信公众号之间的一种唯一关系。一个用户在一个公众号面前,享用唯一的OpenId,不会和别人重复。换言之,同一个用户在另一个公众号面前,是拥有另一个OpenId的。再直白些就是$openId = md5('用户微信ID+公众号ID')
2、Access_Token:此项只有认证号的功能才会使用的到,Access_token是一个授权标识,即一个授权验证码,一个标识10分钟内有效,10分钟的有效期内公众号的多个关注者可以使用同一个Access_Token。在使用主动给指定用户发送消息、自定义菜单、用户管理和用户组管理等功能的时候,每次操作需要给微信服务器以参数的形式附带Access_token。
3、Access_Token网页版:本Access_Token网页版授权时会使用到,和2中的Access_Toekn是不同的东西,不过使用我们的LaneWeChat微信快速开发框架是不需要了解这些的。Access_Token网页版是说在用户打开你的公众号提供的网页的时候,你的网页需要获取用户的OpenId、昵称、头像等信息的时候授权用的。同时,本Access_Token网页版有两种用法,一种是打开网页后弹出一个授权框,让用户点击是否授权,界面像主流的开放平台授权界面(比如QQ登陆某网站,支付宝账号登陆某网站等);另一种是不需要弹出授权框仍旧可以获取用户信息,用法可以在实例中看到。如何安装:
1、本框架以代码包的插件形式放在项目的目录中即可。调用时只需要include 'lanewechat/lanewechat.php'即可。如:
<?php
include 'lanewechat/lanewechat.php';
//获取自定义菜单列表
$menuList = Menu::getMenu();
2、配置项:打开根目录下的config.php,修改定义常量WECHAT_APPID,WECHAT_APPSECRET,WECHAT_URL。其中前两项可以在微信公众号官网的开发者页面中找到,而WECHAT_URL是你微信项目的URL,以http://开头
3、本框架的外部访问唯一入口为根目录下的wechat.php,本框架的内部调用唯一入口为根目录下的lanewechat.php。两者的区别是wechat.php是通过http://www.abc.com/lanewechat/wechat.php访问,是留给微信平台调用的入口。而lanewechat.php是我们项目内部调用时需要include 'lanewechat/lanewechat.php';
4、首次使用时,请打开根目录下的wechat.php,注释掉26行,并且打开注释第29行。
5、在微信开发者-填写服务器配置页面,填写URL为http://www.lanecn.com/wechat.php,保证该URL可以通过80端口正常访问(微信服务器目前只支持80端口),并且将Token填写为config.php中的WECHAT_TOKEN常量的内容(可以修改)。
6、微信服务器在第4步验证通过后,反向操作第4步,即注释掉第27行,打开注释第26行。至此,安装配置完成。初出茅庐:
1、给你的微信公众号发送一条文本消息,比如hello world或者其他什么的。这个时候你应该会收到一条“收到文本”的服务器反馈的被动响应的消息。
2、这个时候你需要先为自己鼓掌。流程分析:
1、我们给微信服务器发送了一条“hello world”的文本消息。
2、微信服务器收到我们的消息后,查找该公众账号所配置的服务器信息中的URL(如何安装部分 - 第5步)。
3、微信服务器向第二步获取的URL发送请求,参数是微信服务器自己拼接过的XML格式。
4、根目录下的wechat.php,引入了我们的配置文件和所需的类后,进入了类WeChat的方法run()。该类位于core/wechat.lib.php。微信的XML数据此时已经被解析为数组,变量名为$request。
5、然后,我们进入了类WechatRequest的方法switchType(),根据不同的消息类型,给予不同的响应。比如用户发送文本消息和关注事件,给出的返回应该是不同的。当然,你要给出同样的提示也不能说是错的。
6、在第5步中的方法中,是一个switch,根据消息类型(此时是文本类型,微信服务器给我的是text)选择了一个处理文本消息的方法,类WechatRequest中的方法text()。该方法的功能是发送文本消息,文本内容是“收到文本”。
7、此时,我们return了一个数据返回给了上层调用,层层return,就到了我们根目录的下的唯一入口文件wechat.php,此时我们返回的数据被echo出来了。
8、微信服务器拿到了输出的数据,微信服务器进行分析和处理,将文本发送给了用户的微信客户端。我们就在手机上看到了微信输出的“收到文本”。
9、流程结束,这就是发送“hello world”,然后返回给用户“收到文本”。牛刀小试:
1、打开core/wechatrequest.php文件,讲方法text()中的变量修改为$content = '收到文本消息'.$request['content'];
2、保存并且上传到你的服务器。
3、在微信中打开你的公众号,输入文本消息“hello world”。见证奇迹的时刻到了。这个时候你的手机微信客户端中现实的是“收到文本消息hello world”。函数详解:
一、被动给用户发送消息。
1、类简介:用户输入文本、图片、语音、音乐、视频等消息,以及关注、取消关注,上报地理位置等事件后,服务器被动给出应答。
2、使用命名空间:use LaneWeChat\Core\ResponsePassive;
3、参数: $fromusername = "谁发给你的?(用户的openId)" 在变量$request['fromusername']中
$tousername = "你的公众号Id"; 在变量$require['tousername']中
$mediaId = "通过上传多媒体文件,得到的id。";
4、发送文本
ResponsePassive::text($fromusername, $tousername, '文本消息内容');
5、发送图片
ResponsePassive::image($fromusername, $tousername, $mediaId);
6、发送语音
ResponsePassive::voice($fromusername, $tousername, $mediaId);
7、发送视频
ResponsePassive::video($fromusername, $tousername, $mediaId, '视频标题', '视频描述');
8、发送音乐
ResponsePassive::music($fromusername, $tousername, '音乐标题', '音乐描述', '音乐链接', '高质量音乐链接,WIFI环境优先使用该链接播放音乐', '缩略图的媒体id,通过上传多媒体文件,得到的id');
9、发送图文
1)创建图文消息内容
$tuwenList = array();
$tuwenList[] = array('title'=>'标题1', 'description'=>'描述1', 'pic_url'=>'图片URL1', 'url'=>'点击跳转URL1');
$tuwenList[] = array('title'=>'标题2', 'description'=>'描述2', 'pic_url'=>'图片URL2', 'url'=>'点击跳转URL2');
2)构建图文消息格式
$itemList = array();
foreach($tuwenList as $tuwen){
$itemList[] = ResponsePassive::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
}
3)发送图文消息
ResponsePassive::news($fromusername, $tousername, $itemList);
二、AccessToken授权。
1、类简介:除了被动相应用户之外,在主动给用户发送消息,用户组管理等高级操作,是需要AccessToken授权的,我们调用一个URL给微信服务器,微信服务器会返回给我们一个散列字符串,在高级操作的时候需要将此串以参数的形式发送。散列字符串10分钟内有效,过期需要重新获取,获取新的后之前的全部失效。
2、使用命名空间:use LaneWeChat\Core\AccessToken;
3、参数:无
4、获取AccessToken
AccessToken::getAccessToken(); 该调用会返回微信服务器散列后的AccessToken字符串。
5、温馨提示
如果暂且用不到此功能,请跳过。最后来看这里!
6、功能补充
有一个地方需要用户自行完善,根据介绍我们已经知道了,获取AccessToken只有10分钟的有效期,过期需要重新获取。因此,我们需要存储这个AccessToken。
由于大家的存储方式各不相同,有Mysql的,有Redis的,有MongoDB的,还有Session的。所以这里我讲存储和读取给留空了。
流程:AccessToken类,public方法只有一个,就是getAccessToken()。这个方法会调用一个私有方法_checkAccessToken()来检测AccessToken是否存在并且是否过期,如果不存在或过期,则调用私有方法_getAccessToken()
完善步骤:
1)、打开core/accesstoken.lib.php文件。
2)、私有方法_getAccessToken()的倒数第二行(return是倒数第一行),在这个地方,请讲变量$accessTokenJson存储起来,变量$accessTokenJson是一个字符串。
3)、私有方法_checkAccessToken()的第一行就是读取操作(有一行伪代码$accessToken = YourDatabase::get('access_token');),将刚才第二步的存储的东西给读出来,并且赋值给$accessToken。
4)、在第二步的存储,第三部的读取的时候,请不要修改数据,仅仅完善一个读和存的操作就可以了。
三、主动给用户发送消息。1、类简介:主动向用户推送文本、图片、语音、音乐、视频等消息。
2、使用命名空间:use LaneWeChat\Core\ResponseInitiative;
3、参数 $tousername = "你的公众号Id"; 在变量$require['tousername']中
$mediaId = "通过上传多媒体文件,得到的id。";
4、发送文本内容
ResponseInitiative::text($tousername, '文本消息内容');
5、发送图片
ResponseInitiative::image($tousername, $mediaId);
6、发送语音
ResponseInitiative::voice($tousername, $mediaId);
7、发送视频
ResponseInitiative::video($tousername, $mediaId, '视频暂无开放 Issues,或尚未同步最近议题。