在CodeIgniter中使用微信开发类库
来源:互联网 发布:北京美食小熊网络 编辑:程序博客网 时间:2024/05/17 23:48
在CI中国论坛里,Hex老大很早就写了一个微信开发的类库,原文地址: http://codeigniter.org.cn/forums/forum.php?mod=viewthread&tid=16665
这个类库很简洁,符合CI开发模式,不过功能过于简单,所以要使用一些高级的微信开发接口,推荐使用这个比较收欢迎的微信开发类库: https://github.com/dodgepudding/wechat-php-sdk
不过这个类库不是CI的,需要封装一下,下面讲讲我的封装,封装的有点过度,你可以按照自己的意愿稍加改造。
1.首先git clone https://github.com/dodgepudding/wechat-php-sdk.git 源代码wechat.php,放到CI的library文件夹下;
2.然后我们扩展一下wechat.php,为它加入一些事件委托,防止你每次写具体逻辑时要写一堆的switch或者if/else语句,这里就看你是否习惯我这种写法了。新建类库wechatex.php放到library下,源代码如下:
<?phpinclude APPPATH.'libraries/wechat.php';class WechatEx extends Wechat { const EVENT_SUBSCRIBE = 'SUBSCRIBE'; // 没关注时扫描:订阅公共号 const EVENT_UNSUBSCRIBE = 'UNSUBSCRIBE';// 已关注后,手动取消订阅号时触发 const EVENT_SCAN = 'SCAN'; //关注后再次扫描 const EVENT_CLICK = 'CLICK'; //点击推事件 const EVENT_VIEW = 'VIEW'; //跳转URL const EVENT_LOCATION = 'LOCATION'; //用户同意上传位置信息后,服务器每5秒钟推送触发 const EVENT_SCANCODE_PUSH = 'SCANCODE_PUSH';//用户点击自定义扫描按钮,扫码推事件 const EVENT_SCANCODE_WAITMSG = 'SCANCODE_WAITMSG';//扫码推事件且弹出消息接收中提示框 const EVENT_PIC_SYSPHOTO = 'PIC_SYSPHOTO';//弹出系统拍照发图 const EVENT_PIC_PHOTO_OR_ALBUM = 'PIC_PHOTO_OR_ALBUM'; //弹出拍照或者相册发图 const EVENT_PIC_WEIXIN = 'PIC_WEIXIN'; //弹出微信相册发图器 const EVENT_LOCATION_SELECT = 'LOCATION_SELECT';//弹出地理位置选择器 function __construct($options) { parent::__construct($options); } public function run() { $this->valid(); $type = $this->getRev()->getRevType(); switch($type) { case Wechat::MSGTYPE_TEXT: $this->onText(); break; case Wechat::MSGTYPE_EVENT: $info = $this->getRevEvent(); //event, key if (isset($info['event'])){ switch(strtoupper($info['event'])){ case self::EVENT_SUBSCRIBE: $this->onSubscribe(); break; case self::EVENT_UNSUBSCRIBE: $this->onUnsubscribe(); break; //关注后再次扫描 case self::EVENT_SCAN: $this->onScan(); break; case self::EVENT_LOCATION: $this->onLocation(); break; //点击菜单时:CLICK case self::EVENT_CLICK: //EventKey:与自定义菜单接口中KEY值对应 $this->onClick(); break; //点击菜单跳转链接时的事件推送 case self::EVENT_VIEW: //EventKey:设置的跳转URL $this->onView(); break; case self::EVENT_SCANCODE_PUSH: $this->onScanCodePush(); break; case self::EVENT_SCANCODE_WAITMSG: $this->onScanCodeWaitMsg(); break; case self::EVENT_PIC_SYSPHOTO: $this->onPicSysPhoto(); break; case self::EVENT_PIC_PHOTO_OR_ALBUM: $this->onPicPhotoOrAlbum(); break; case self::EVENT_PIC_WEIXIN: $this->onPicWeixin(); break; case self::EVENT_LOCATION_SELECT: $this->onLocationSelect(); break; default: $this->onUnknown(); } } break; case Wechat::MSGTYPE_IMAGE: $this->onImage(); break; case Wechat::MSGTYPE_LOCATION: $this->onLocation(); break; case Wechat::MSGTYPE_LINK: $this->onLink(); break; case Wechat::MSGTYPE_VOICE: $this->onVoice(); break; case Wechat::MSGTYPE_VIDEO: $this->onVideo(); break; default: $this->onUnknown(); } } protected function onScanCodePush(){$this->defaultReply();} protected function onScanCodeWaitMsg(){$this->defaultReply();} protected function onPicWeixin(){$this->defaultReply();} protected function onPicSysPhoto(){$this->defaultReply();} protected function onPicPhotoOrAlbum(){$this->defaultReply();} protected function onLocationSelect(){$this->defaultReply();} /** * 用户关注时触发,用于子类重写 * * @return void */ protected function onSubscribe() { $this->defaultReply(); } protected function onUnsubscribe() { $this->defaultReply(); } protected function onClick(){ $this->defaultReply(); } protected function onView() { $this->defaultReply(); } protected function onScan(){ $this->defaultReply(); } /* 1 文本消息 2 图片消息 3 语音消息 4 视频消息 5 地理位置消息 6 链接消息 */ protected function onText() { $this->defaultReply(); } protected function onImage() { $this->defaultReply(); } protected function onVoice(){ $this->defaultReply(); } protected function onVideo(){ $this->defaultReply(); } protected function onLocation(){ $this->defaultReply(); } protected function onLink() { $this->defaultReply(); } protected function onUnknown() { $this->defaultReply(); } protected function defaultReply(){ $this->text('')->reply(); } }
3.再次扩展wechatex.php,新建mywechat.php放到library下,这里就要写具体的实现逻辑了:
<?phpinclude APPPATH.'libraries/wechatex.php';class MyWechat extends WechatEx { private $_ci; function __construct($options){ parent::__construct($options); if (function_exists("get_instance") && defined("APPPATH")){ $this->_ci =& get_instance(); $this->_ci->load->model('product_model', 'product'); //$this->_ci->load->model('post_model', 'post'); } } protected function onSubscribe() { $this->text('终于等到你。感谢你关注……')->reply(); } protected function onUnsubscribe() { $this->text('悄悄地我走了,正如我悄悄地来。')->reply(); } protected function onText(){} protected function onLocation() { $info = $this->getRevGeo(); $this->text("收到了位置消息:({$info['x']},{$info['y']})")->reply(); }protected function onLink() { $info = $this->getRevLink(); $url = $info['url']; $this->text("收到链接消息:({$info['url']},{$info['title']},{$info['description']})")->reply(); } protected function onVoice() { $info = $this->getRevVoice(); $this->text("收到链接消息:({$info['mediaid']},{$info['format']})")->reply(); }protected function onUnknown() { $this->text('收到未知消息')->reply(); }//以下是cache的保存,按照具体情形保存你的token,因为微信服务器规定token的获取次数是有限制的,不要请求太多次数。 protected function setCache($cachename, $value, $expired){ $this->_ci->load->model('setting_model', 'setting'); $this->_ci->setting->set($cachename, array( 'value' => $value, 'expire_time'=> time() + $expired) ); } protected function getCache($cachename){ $this->_ci->load->model('setting_model', 'setting'); $data = $this->_ci->setting->get($cachename); if(empty($data) || time() > $data['expire_time']) return false; return $data['value']; } protected function removeCache($cachename){ $this->_ci->load->model('setting_model', 'setting'); $this->_ci->setting->remove($cachename); }//真实微信号里只要有的事件,具体逻辑就可以写到这里。}
4.最后,你需要一个控制器,在控制器之前,我们来一个配置文件,wechat.php放到config下:
<?php$config['wechat'] = array( 'token'=>'CodeIgniter', //填写你设定的key 'appid'=>'wx1357312bf6f6f5df', //填写高级调用功能的app id 'appsecret'=>'0bf5ef023cd0318808b52232e3fc2315', // 'partnerid'=>'88888888', //财付通商户身份标识 'partnerkey'=>'', //财付通商户权限密钥Key 'paysignkey'=>'', //商户签名密钥Key 'debug'=>true);$config['wechat_menu'] = array( "button"=>array( array( "type"=>"pic_photo_or_album", "name"=>"我卖", "key"=>"upload_pics" ), array( "type"=>"view", "name"=>"逛逛", "url"=> site_url('product/discovery') ), array( "name"=>"我的", "sub_button"=>array( array( "type"=>"view", "name"=>"正在出售", "url"=>site_url('user/product/index') ), array( "type"=>"view", "name"=>"个人中心", "url"=>site_url('user/home/index') ), array( "type"=>"view", "name"=>"帮助", "url"=>site_url('home/weixin_help') ) ) ) ));
最后的最后,实现一个简单的微信控制器, weixin.php。这里不要命名成wechat.php,因为CI中已经含有wechat对象了,那就是那个类库,如果再把控制器也命名为wechat.php就会出错,简单地说,CI中类库的名字和控制器的名字不能重复,否则出错。不要跳坑。代码如下:
class Weixin extends MY_Controller{ function __construct(){ parent::__construct(); $this->config->load('wechat'); $options = $this->config->item('wechat'); $options['logcallback'] = 'logdebug'; $this->load->library('mywechat', $options); } public function api(){ $this->mywechat->run(); } public function menu(){ $menus = $this->config->item('wechat_menu'); $flag = $this->mywechat->createMenu($menus); echo !$flag ? 'FALSE' : json_encode($menus); }//其他的一些逻辑……}function logdebug($text){ file_put_contents('./upload/log.txt',$text."\n",FILE_APPEND);}
在微信开发者模式下,填入以下API: http://www.abc.com/weixin/api即可。如果需要更改菜单,可以使用: http://www.abc.com/weixin/menu 刷新,当然你可以自己做个菜单系统,不像我这样把菜单写死。欢迎大家批评指正。
文章来源:http://www.tuicool.com/articles/eIvYna
- 在CodeIgniter中使用微信开发类库
- 在codeigniter中使用Pchart
- 在 CodeIgniter 中使用 Laravel Eloquent ORM
- 在CodeIgniter中创建自己的类
- CodeIgniter中分页类的使用
- CodeIgniter中使用Sqlite3
- 在codeigniter中的url中混合使用querystring和segment
- 在开发中使用SharedSDK实现微信第三方登录遇到的坑
- CodeIgniter 分页类使用
- CodeIgniter中表格的使用
- CodeIgniter 在使用hook中获取保存在数据库里的session中的userdata
- 如何在discuz中使用微信登陆,又使用微信自定义菜单
- 微信Tinker在Android中集成以及使用
- 微信 Tinker 在 Android 中集成以及使用
- 微信开发中使用curl上传永久素材
- 微信开发中使用curl忽略https证书
- codeIgniter在view中引入model
- 在codeigniter框架里使用thrift
- AsParallel()没有多线程执行,要用 AsParallel().ForAll(...)
- Cannot add or update a child row: a foreign key constraint fails 解决办法
- 各项异性扩散(Anisotropic diffusion)
- 《Java虚拟机原理图解》 1.1、class文件基本组织结构
- 哲学家用餐模型分析
- 在CodeIgniter中使用微信开发类库
- jmockit
- maven项目spring的pom配置
- Android5.0之NavigationView的使用 。android组件之DrawerLayout(抽屉导航)-- 侧滑菜单效果
- Full Stack Web Development Bootstrap(三)学习笔记
- 微信支付报错:解析失败
- 在Node.js中合并两个复杂对象方法步骤详解
- js浮点数精确计算(加、减、乘、除)
- 走台阶