/** * 微信消息接口入口 * 所有发送到微信的消息都会推送到该操作 * 所以,微信公众平台后台填写的api地址则为该操作的访问地址 * 在mp.weixin.qq.com 开发者中心配置的 URL(服务器地址) http://域名/index.php/home/weixin/index/id/member_public表的id.html */ public function index($id = '') { // $this->member_public = M('MemberPublic')->find($id); $this->options['appid'] = $this->member_public['appid']; //初始化options信息 $this->options['appsecret'] = $this->member_public['secret']; $this->options['encodingaeskey'] = $this->member_public['encodingaeskey']; $weObj = new TPWechat($this->options); $weObj->valid(); $weObj->getRev(); $data = $weObj->getRevData(); $type = $weObj->getRevType(); $ToUserName = $weObj->getRevTo(); $FromUserName = $weObj->getRevFrom(); $params['weObj'] =& $weObj; $params['mp_id'] = $id; $params['weOptions'] = $this->options; //如果被动响应可获得用户信息就记录下 if (!empty($id)) { //设置当前上下文的公众号id $mp_id = get_mpid($id); } if (!empty($ToUserName)) { get_token($ToUserName); } if (!empty($FromUserName)) { $oid = get_openid($FromUserName); } hook('init_ucuser', $params); //把消息分发到addons/ucuser/init_ucuser的方法中,初始化公众号粉丝信息 $map['openid'] = get_openid(); $map['mp_id'] = $params['mp_id']; $ucuser = D('Ucuser'); $user = $ucuser->where($map)->find(); //查询出公众号的粉丝 $fsub = $user["subscribe"]; //记录首次关注状态 //与微信交互的中控服务器逻辑可以自己定义,这里实现一个通用的 switch ($type) { //事件 case TPWechat::MSGTYPE_EVENT: //先处理事件型消息 $event = $weObj->getRevEvent(); switch ($event['event']) { //关注 case TPWechat::EVENT_SUBSCRIBE: //二维码关注 if (isset($event['eventkey']) && isset($event['ticket'])) { //普通关注 } else { } if (!$user["subscribe"]) { //未关注,并设置关注状态为已关注 $user["subscribe"] = 1; $ucuser->where($map)->save($user); } hook('welcome', $params); //把消息分发到实现了welcome方法的addons中,参数中包含本次用户交互的微信类实例和公众号在系统中id exit; break; //扫描二维码 //扫描二维码 case TPWechat::EVENT_SCAN: break; //地理位置 //地理位置 case TPWechat::EVENT_LOCATION: break; //自定义菜单 - 点击菜单拉取消息时的事件推送 //自定义菜单 - 点击菜单拉取消息时的事件推送 case TPWechat::EVENT_MENU_CLICK: break; //自定义菜单 - 点击菜单跳转链接时的事件推送 //自定义菜单 - 点击菜单跳转链接时的事件推送 case TPWechat::EVENT_MENU_VIEW: break; //自定义菜单 - 扫码推事件的事件推送 //自定义菜单 - 扫码推事件的事件推送 case TPWechat::EVENT_MENU_SCAN_PUSH: break; //自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送 //自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送 case TPWechat::EVENT_MENU_SCAN_WAITMSG: break; //自定义菜单 - 弹出系统拍照发图的事件推送 //自定义菜单 - 弹出系统拍照发图的事件推送 case TPWechat::EVENT_MENU_PIC_SYS: break; //自定义菜单 - 弹出拍照或者相册发图的事件推送 //自定义菜单 - 弹出拍照或者相册发图的事件推送 case TPWechat::EVENT_MENU_PIC_PHOTO: break; //自定义菜单 - 弹出微信相册发图器的事件推送 //自定义菜单 - 弹出微信相册发图器的事件推送 case TPWechat::EVENT_MENU_PIC_WEIXIN: break; //自定义菜单 - 弹出地理位置选择器的事件推送 //自定义菜单 - 弹出地理位置选择器的事件推送 case TPWechat::EVENT_MENU_LOCATION: break; //取消关注 //取消关注 case TPWechat::EVENT_UNSUBSCRIBE: if ($user["subscribe"]) { $user["subscribe"] = 0; //取消关注设置关注状态为取消 $ucuser->where($map)->save($user); } break; //群发接口完成后推送的结果 //群发接口完成后推送的结果 case TPWechat::EVENT_SEND_MASS: break; //模板消息完成后推送的结果 //模板消息完成后推送的结果 case TPWechat::EVENT_SEND_TEMPLATE: break; default: break; } break; //文本 //文本 case TPWechat::MSGTYPE_TEXT: hook('keyword', $params); //把消息分发到实现了keyword方法的addons中,参数中包含本次用户交互的微信类实例和公众号在系统中id $weObj->reply(); //在addons中处理完业务逻辑,回复消息给用户 break; //图像 //图像 case TPWechat::MSGTYPE_IMAGE: break; //语音 //语音 case TPWechat::MSGTYPE_VOICE: break; //视频 //视频 case TPWechat::MSGTYPE_VIDEO: break; //位置 //位置 case TPWechat::MSGTYPE_LOCATION: break; //链接 //链接 case TPWechat::MSGTYPE_LINK: break; default: break; } // 记录日志 if (C('DEVELOP_MODE')) { // 是否开发者模式 addWeixinLog($data, $GLOBALS['HTTP_RAW_POST_DATA']); } }