PHP code example of victorruan / lanewechat
1. Go to this page and download the library: Download victorruan/lanewechat library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
victorruan / lanewechat example snippets
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"; 在变量$过上传多媒体文件,得到的id。";
4、发送文本内容
ResponseInitiative::text($tousername, '文本消息内容');
5、发送图片
ResponseInitiative::image($tousername, $mediaId);
6、发送语音
ResponseInitiative::voice($tousername, $mediaId);
7、发送视频
ResponseInitiative::video($tousername, $mediaId, '视频描述', '视频标题');
8、发送地理位置
ResponseInitiative::music($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[] = ResponseInitiative::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
}
3)发送图文消息
ResponseInitiative::news($tousername, $itemList);
四、用户及用户组管理。
1、类简介:获取粉丝列表,创建\修改用户组,讲用户添加\移除到用户组。
2、使用命名空间:use LaneWeChat\Core\UserManage;
3、参数 $openId = '用户和微信公众号的唯一ID'; 在变量$ * 媒体文件在后台保存时间为3天,即3天后media_id失效
2、使用命名空间:use LaneWeChat\Core\Media;
3、参数 $filename 上传的文件的绝对路径
$type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
$mediaId = "通过上传多媒体文件,得到的id。";
$groupId = '分组ID'; 在添加新分组、获取分组列表的时候可以得到
4、上传:上传后,微信服务器会返回一个mediaId。
Media::upload($filename, $type);
5、下载:根据mediaId下载一个多媒体文件。
Media::download($mediaId);
七、自定义菜单
1、类简介:添加自定义菜单。最多可以有三个一级菜单,每个一级菜单最多可以有五个菜单。一级菜单最多4个汉字,二级菜单最多7个汉字。创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
警告:设置菜单Menu::setMenu($menuList)参数结构和返回值重写,自1.4版本起不向下兼容。
注意:所有新增的菜单类型(除了click类型和view类型),仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。
摘自微信官方网站:目前自定义菜单接口可实现两种类型按钮,如下:
click:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值(即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
总结一下哦,就是微信的菜单分两种,一种是view型,就是你设置一个网址,点了这个菜单之后就跳到你设置的网址去了。另一种就是click型,你设置一个key,然后用户点击的时候会通过本框架唯一入口wechat.php发送一个消息类型为event的请求,在wechatrequest.lib.php文件下的eventClick方法中可以使用。
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(点击跳转链接)的菜单类型的被动响应的支持。默认讲点击菜单的事件推送数据发送文本消息返回给用户。开发者请自行修改。
2、使用命名空间:use LaneWeChat\Core\Menu;
3、设置菜单:是所有的菜单数据全部发送一次,可不是每新增一个只发一个菜单。
Menu::setMenu($menuList);
$menuLis 是菜单列表,结构如下:
$menuList = array(
array('id'=>'1', 'pid'=>'0', 'name'=>'顶级分类一', 'type'=>'', 'code'=>''),
array('id'=>'2', 'pid'=>'1', 'name'=>'分类一子分类一', 'type'=>'click', 'code'=>'lane_wechat_menu_1_1'),
array('id'=>'3', 'pid'=>'1', 'name'=>'分类一子分类二', 'type'=>'1', 'code'=>'http://www.lanecn.com'),
array('id'=>'4', 'pid'=>'0', 'name'=>'顶级分类二', 'type'=>'1', 'code'=>'http://www.php.net/'),
array('id'=>'5', 'pid'=>'0', 'name'=>'顶级分类三', 'type'=>'2', 'code'=>'lane_wechat_menu_3'),
);
'id'是您的系统中对分类的唯一编号;
'pid'是该分类的上级分类,顶级分类则填写0;
'name'是分类名称;
'type'是菜单类型,如果该分类下有子分类请务必留空;
'type'的值从以下类型中选择:click、view、scancode_push、scancode_waitmsg、pic_sysphoto、pic_photo_or_album、pic_weixin、location_select。
'code'是view类型的URL或者其他类型的自定义key,如果该分类下有子分类请务必留空。
4、获取微信菜单:获取到的是已经设置过的菜单列表,格式为Json,是微信服务器返回的原始数据。
Menu::getMenu();
5、删除微信菜单:将会删除设置过的所有菜单(一键清空)。
Menu::delMenu();
八、高级群发接口
1、类简介:根据分组、openId列表进行群发(推送)。图文消息需要先将图文消息当作一个素材上传,然后再群发,其他类型的消息直接群发即可。
注意:推送后用户到底是否成功接受,微信会向公众号推送一个消息。消息类型为事件消息,可以在lanewechat/wechatrequest.lib.php文件中的方法eventMassSendJobFinish(&$request)中收到这条消息。
2、使用命名空间:use LaneWeChat\Core\AdvancedBroadcast;
3、上传图文消息。创建一个图文消息,保存到微信服务器,可以得到一个id代表这个图文消息,发送的时候根据这个id发送就可以了。
Menu::uploadNews($articles);
$articles 是图文消息列表,结构如下:
$articles = array(
array('thumb_media_id'=>'多媒体ID,由多媒体上传接口获得' , 'author'=>'作者', 'title'=>'标题', 'content_source_url'=>'www.lanecn.com', 'digest'=>'摘要', 'show_cover_pic'=>'是否设置为封面(0或者1)'),
array('thumb_media_id'=>'多媒体ID,由多媒体上传接口获得' , 'author'=>'作者', 'title'=>'标题', 'content_source_url'=>'www.lanecn.com', 'digest'=>'摘要', 'show_cover_pic'=>'是否设置为封面(0或者1)'),
);
'thumb_media_id'多媒体ID,由多媒体上传接口获得:Media::upload($filename, $type);
'author'作者
'title'标题
'content_source_url'一个URL,点击“阅读全文”跳转的地址
'digest'摘要
'show_cover_pic'0或1,是否设置为封面。
下面的方法,图文消息的参数mediaId是由上面这个方法(3)Menu::uploadNews($articles);获得的,其他的mediaId是多媒体上传获得的Media::upload($filename, $type);
根据分组群发的所有接口最后一个参数,$isToAll,默认未false。使用true且成功群发,会使得此次群发进入历史消息列表。
4、根据分组进行群发 - 发送图文消息:
AdvancedBroadcast::sentNewsByGroup($groupId, $mediaId, $isToAll=false);
5、根据分组进行群发 - 发送文本消息
AdvancedBroadcast::sentTextByGroup($groupId, $content, $isToAll=false);
6、根据分组进行群发 - 发送语音消息
AdvancedBroadcast::sentVoiceByGroup($groupId, $mediaId, $isToAll=false);
7、根据分组进行群发 - 发送图片消息
AdvancedBroadcast::sentImageByGroup($groupId, $mediaId, $isToAll=false);
8、根据分组进行群发 - 发送视频消息
AdvancedBroadcast::sentVideoByGroup($mediaId, $title, $description, $groupId, $isToAll=false);
9、根据OpenID列表群发 - 发送图文消息
AdvancedBroadcast::sentNewsByOpenId($toUserList, $mediaId);
10、根据OpenID列表群发 - 发送文本消息
AdvancedBroadcast::sentTextByOpenId($toUserList, $content);
11、根据OpenID列表群发 - 发送语音消息
AdvancedBroadcast::sentVoiceByOpenId($toUserList, $mediaId);
12、根据OpenID列表群发 - 发送图片消息
AdvancedBroadcast::sentImageByOpenId($toUserList, $mediaId);
13、根据OpenID列表群发 - 发送视频消息
AdvancedBroadcast::sentVideoByOpenId($toUserList, $mediaId, $title, $description);
14、删除群发
请注意,只有已经发送成功的消息才能删除删除消息只是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。 另外,删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。
AdvancedBroadcast::delete($msgId);
$msgId:以上的群发接口成功时都会返回msg_id这个字段
15、预览图文消息
AdvancedBroadcast::previewNewsByGroup($openId, $mediaId);
16、预览文本消息
AdvancedBroadcast::previewTextByGroup($openId, $content);
17、预览语音消息
AdvancedBroadcast::previewVoiceByGroup($openId, $mediaId);
18、预览图片消息
AdvancedBroadcast::previewImageByGroup($openId, $mediaId);
19、预览视频消息
AdvancedBroadcast::previewVideoByGroup($mediaId, $title, $description, $openId);
20、查询群发消息发送状态【订阅号与服务号认证后均可用】
AdvancedBroadcast::getStatus($openId, $mediaId);
九、多客服接口
1、类简介:客服功能接口。
2、使用命名空间:use LaneWeChat\Core\CustomService;
3、获取客服聊天记录接口,有分页,一次获取一页,一页最多1000条。不能跨日。
在需要时,开发者可以通过获取客服聊天记录接口,获取多客服的会话记录,包括客服和用户会话的所有消息记录和会话的创建、关闭等操作记录。利用此接口可以开发如“消息记录”、“工作监控”、“客服绩效考核”等功能。
CustomService::getRecord($startTime, $endTime, $pageIndex=1, $pageSize=1000, $openId='')
'startTime':查询开始时间,UNIX时间戳
'startTime':查询结束时间,UNIX时间戳,每次查询不能跨日查询
4、将用户发送的消息转发到客服:
调用ResponsePassive::forwardToCustomService($fromusername, $tousername)。
如用户在微信给公众号发送一条文本消息“iphone 6 多少钱?”,我们就可以在lanewechat/wechatrequest.lib.php文件中的方法text(&$request)中收到这条消息(如果不了解为什么会在这里收到文本消息,请重头再看文档)。
然后在text(&$request)方法中,我们可以调用ResponsePassive::forwardToCustomService($request['fromusername'], $request['tousername'])。那么刚才用户发的“iphone 6 多少钱?”就会被转发到客服系统,在微信的客服客户端中就可以收到了。
5、添加客服帐号
必须先在公众平台官网为公众号设置微信号后才能使用该能力。
开发者可以通过本接口为公众号添加客服账号,每个公众号最多添加10个客服账号。
CustomService::addAccount($kfAccount, $nickname, $password)
$kfAccount String 完整客服账号,格式为:账号前缀@公众号微信号
$nickname String 昵称
$password String 密码
6、修改客服帐号
必须先在公众平台官网为公众号设置微信号后才能使用该能力。
CustomService::editAccount($kfAccount, $nickname, $password)
$kfAccount String 完整客服账号,格式为:账号前缀@公众号微信号
$nickname String 昵称
$password String 密码
7、删除客服帐号
必须先在公众平台官网为公众号设置微信号后才能使用该能力。
CustomService::delAccount($kfAccount, $nickname, $password)
$kfAccount String 完整客服账号,格式为:账号前缀@公众号微信号
$nickname String 昵称
$password String 密码
8、获取所有客服账号
必须先在公众平台官网为公众号设置微信号后才能使用该能力。
CustomService::getAccountList($kfAccount, $nickname, $password)
$kfAccount String 完整客服账号,格式为:账号前缀@公众号微信号
$nickname String 昵称
$password String 密码
9、设置客服帐号的头像
必须先在公众平台官网为公众号设置微信号后才能使用该能力。
CustomService::setAccountImage($kfAccount, $imagePath)
$kfAccount String 完整客服账号,格式为:账号前缀@公众号微信号
$imagePath String 待上传的头像文件路径
十、智能接口
1、类简介:智能接口。
2、使用命名空间:use LaneWeChat\Core\IntelligentInterface;
3、语义理解:比如输入文本串,如“查一下明天从北京到上海的南航机票”就可以收到关于这个问题的答案。
单类别意图比较明确,识别的覆盖率比较大,所以如果只要使用特定某个类别,建议将category只设置为该类别。
IntelligentInterface::semanticSemproxy($query, $category, $openId, $latitude='', $longitude='', $region='', $city=''){
$query 输入文本串,如“查一下明天从北京到上海的南航机票"
$category String 需要使用的服务类型,如“flight,hotel”,多个用“,”隔开,不能为空。详见《接口协议文档》
$latitude Float 纬度坐标,与经度同时传入;与城市二选一传入。详见《接口协议文档》
$longitude Float 经度坐标,与纬度同时传入;与城市二选一传入。详见《接口协议文档》
$region String 区域名称,在城市存在的情况下可省;与经纬度二选一传入。详见《接口协议文档》
$city 城市名称,如“北京”,与经纬度二选一传入
$openId
《接口协议文档》:http://mp.weixin.qq.com/wiki/images/1/1f/微信语义理解协议文档.zip
十一、推广支持
1、类简介:推广支持。
2、使用命名空间:use LaneWeChat\Core\Popularize;
3、生成带参数的二维码 - 第一步 创建二维码ticket
获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。
目前有2种类型的二维码,分别是临时二维码和永久二维码,
前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000)。
两种二维码分别适用于帐号绑定、用户来源统计等场景。
Popularize::createTicket($type, $expireSeconds, $sceneId);
$type Int 临时二维码类型为1,永久二维码类型为2
$expireSeconds Int 过期时间,只在类型为临时二维码时有效。最大为1800,单位秒
$sceneId Int 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
4、生成带参数的二维码 - 第二步 通过ticket换取二维码
public static function getQrcode($ticket, $filename='');
$ticket Popularize::createTicket()获得的
$filename String 文件路径,如果不为空,则会创建一个图片文件,二维码文件为jpg格式,保存到指定的路径
返回值:如果传递了第二个参数filename则会在filename指定的路径生成一个二维码的图片。如果第二个参数filename为空,则直接echo本函数的返回值,并在调用页面添加header('Content-type: image/jpg');,将会展示出一个二维码的图片。
5、将一条长链接转成短链接。
主要使用场景:开发者用于生成二维码的原链接(商品、支付二维码等)太长导致扫码速度和成功率下降,将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率。
Popularize::long2short($longUrl);
$longUrl String 需要转换的长链接,支持http://、https://、weixin://wxpay 格式的url
十二、模板消息接口
1、类简介:模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
关于使用规则,请注意:
1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
2、需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
3、在所选择行业的模板库中选用已有的模板进行调用;
4、每个账号可以同时使用15个模板。
5、当前每个模板的日调用上限为10000次。
关于接口文档,请注意:
1、模板消息调用时主要需要模板ID和模板中各参数的赋值内容;
2、模板中参数内容必须以".DATA"结尾,否则视为保留字;
3、模板保留符号"{{ }}"。
2、使用命名空间:use LaneWeChat\Core\TemplateMessage;
3、向用户推送模板消息
TemplateMessage::sendTemplateMessage($data, $touser, $templateId, $url, $topcolor='#FF0000'){
$data = array(
'first'=>array('value'=>'您好,您已成功消费。', 'color'=>'#0A0A0A')
'keynote1'=>array('value'=>'巧克力', 'color'=>'#CCCCCC')
'keynote2'=>array('value'=>'39.8元', 'color'=>'#CCCCCC')
'keynote3'=>array('value'=>'2014年9月16日', 'color'=>'#CCCCCC')
'keynote3'=>array('value'=>'欢迎再次购买。', 'color'=>'#173177')
);
$touser 接收方的OpenId。
$templateId 模板Id。在公众平台线上模板库中选用模板获得ID
$url URL
$topcolor 顶部颜色,可以为空。默认是红色
注意:推送后用户到底是否成功接受,微信会向公众号推送一个消息。消息类型为事件消息,可以在lanewechat/wechatrequest.lib.php文件中的方法eventTemplateSendJobFinish(&$request)中收到这条消息。
4、设置行业
TemplateMessage::setIndustry($industryId1, $industryId2){
$industryId1 公众号模板消息所属行业编号 请打开连接查看行业编号 http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html#.E8.AE.BE.E7.BD.AE.E6.89.80.E5.B1.9E.E8.A1.8C.E4.B8.9A
$industryId2 公众号模板消息所属行业编号。在公众平台线上模板库中选用模板获得ID
5、获得模板ID
TemplateMessage::getTemplateId($templateIdShort)
$templateIdShort 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
十三、安全性
1、类简介:安全性相关接口
2、使用命名空间:use LaneWeChat\Core\Auth;
3、获取微信服务器IP列表,用于验证每次的请求来源是否是微信服务器。
Auth::getWeChatIPList();
十四、自动回复
1、类简介:自动回复
2、使用命名空间:use LaneWeChat\Core\AutoReply;
3、获取自动回复规则
AutoReply::getRole($industryId1, $industryId2);
返回结果与字段说明请查看http://mp.weixin.qq.com/wiki/7/7b5789bb1262fb866d01b4b40b0efecb.html
实例示范:
一、通过网页授权获得用户信息
场景:用户点击了我的自定义菜单,或者我发送的文本消息中包含一个URL,用户打开了我的微信公众号的网页版,我需要获取用户的信息。
代码:
use LaneWeChat\Core\WeChatOAuth;
use LaneWeChat\Core\UserManage;
//第一步,获取CODE
WeChatOAuth::getCode('http://www.lanecn.com/index.php', 1, 'snsapi_base');
//此时页面跳转到了http://www.lanecn.com/index.php,code和state在GET参数中。
$code = $_GET['code'];
//第二步,获取access_token网页版
$openId = WeChatOAuth::getAccessTokenAndOpenId($code);
//第三步,获取用户信息
$userInfo = UserManage::getUserInfo($openId['openid']);