| 
							
								 | 
							
							<?php
 | 
						
						
						
						
							 | 
							
								 | 
							
							namespace LaneWeChat\Core;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/**
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * 处理请求
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Created by Lane.
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * User: lane
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Date: 13-12-19
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Time: 下午11:04
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Mail: lixuan868686@163.com
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Website: http://www.lanecn.com 
 | 
						
						
						
						
							 | 
							
								 | 
							
							 */
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							class WechatRequest{
 | 
						
						
						
						
							 | 
							
								 | 
							
							    /**
 | 
						
						
						
						
							 | 
							
								 | 
							
							     * @description 分发请求
 | 
						
						
						
						
							 | 
							
								 | 
							
							     * @param $request 请求数据
 | 
						
						
						
						
							 | 
							
								 | 
							
							     * @return array|string 返回处理结果
 | 
						
						
						
						
							 | 
							
								 | 
							
							     */
 | 
						
						
						
						
							 | 
							
								 | 
							
							    public static function switchType(&$request){
 | 
						
						
						
						
							 | 
							
								 | 
							
							        $data = array();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        switch ($request['msgtype']) {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //事件
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'event':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $request['event'] = strtolower($request['event']);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                switch ($request['event']) {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //关注
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'subscribe':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        //二维码关注
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        if(isset($request['eventkey']) && isset($request['ticket'])){
 | 
						
						
						
						
							 | 
							
								 | 
							
							                            $data = self::eventQrsceneSubscribe($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        //普通关注
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        }else{
 | 
						
						
						
						
							 | 
							
								 | 
							
							                            $data = self::eventSubscribe($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //扫描二维码
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'scan':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventScan($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //地理位置
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'location':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventLocation($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 点击菜单拉取消息时的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'click':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventClick($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 点击菜单跳转链接时的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'view':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventView($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 扫码推事件的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'scancode_push':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventScancodePush($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'scancode_waitmsg':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventScancodeWaitMsg($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 弹出系统拍照发图的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'pic_sysphoto':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventPicSysPhoto($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 弹出拍照或者相册发图的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'pic_photo_or_album':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventPicPhotoOrAlbum($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 弹出微信相册发图器的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'pic_weixin':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventPicWeixin($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //自定义菜单 - 弹出地理位置选择器的事件推送
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'location_select':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventLocationSelect($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //取消关注
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'unsubscribe':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventUnsubscribe($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //群发接口完成后推送的结果
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'masssendjobfinish':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventMassSendJobFinish($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    //模板消息完成后推送的结果
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    case 'templatesendjobfinish':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        $data = self::eventTemplateSendJobFinish($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    default:
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        return Msg::returnErrMsg(MsgConstant::ERROR_UNKNOW_TYPE, '收到了未知类型的消息', $request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							                }
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //文本
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'text':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::text($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //图像
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'image':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::image($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //语音
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'voice':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::voice($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //视频
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'video':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::video($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //小视频
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'shortvideo':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::shortvideo($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //位置
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'location':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::location($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            //链接
 | 
						
						
						
						
							 | 
							
								 | 
							
							            case 'link':
 | 
						
						
						
						
							 | 
							
								 | 
							
							                $data = self::link($request);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            default:
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return ResponsePassive::text($request['fromusername'], $request['tousername'], '收到未知的消息,我不知道怎么处理');
 | 
						
						
						
						
							 | 
							
								 | 
							
							                break;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        return $data;
 | 
						
						
						
						
							 | 
							
								 | 
							
							    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							    // ... 其他方法 ...
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							类声明:class WechatRequest 定义了一个名为 WechatRequest 的类,用于处理微信公众号的请求。
 | 
						
						
						
						
							 | 
							
								 | 
							
							switchType方法:用于分发请求。根据请求的类型(msgtype)和事件类型(event),调用相应的处理方法。
 | 
						
						
						
						
							 | 
							
								 | 
							
							事件处理:对于不同类型的事件(如关注、取消关注、扫描二维码等),调用相应的事件处理方法。
 | 
						
						
						
						
							 | 
							
								 | 
							
							消息处理:对于不同类型的消息(如文本、图像、语音等),调用相应的消息处理方法。
 | 
						
						
						
						
							 | 
							
								 | 
							
							默认处理:如果收到未知类型的消息或事件,返回错误信息或默认响应。
 | 
						
						
						
						
							 | 
							
								 | 
							
							'''
 | 
						
						
						
						
							 | 
							
								 | 
							
							WechatRequest 类是微信公众号开发中的核心组件,负责接收和处理用户通过微信服务器发送的各种请求。以下是对该类主要功能的总结:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							类概述:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							WechatRequest 类定义在 LaneWeChat\Core 命名空间下,由开发者 Lane 创建,用于处理微信公众号的请求。
 | 
						
						
						
						
							 | 
							
								 | 
							
							主要功能:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							请求分发:switchType 方法是类的入口点,它根据请求的 msgtype(消息类型)和 event(事件类型)来决定调用相应的处理函数。
 | 
						
						
						
						
							 | 
							
								 | 
							
							事件处理:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							对于事件类型的消息(如用户关注、取消关注、扫描二维码等),switchType 方法会进一步判断 event 类型,并调用相应的处理函数,如 eventSubscribe、eventUnsubscribe、eventScan 等。
 | 
						
						
						
						
							 | 
							
								 | 
							
							消息处理:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							对于非事件类型的消息(如文本、图片、语音、视频等),switchType 方法会直接调用对应的处理函数,如 text、image、voice、video 等。
 | 
						
						
						
						
							 | 
							
								 | 
							
							默认响应:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							如果收到的请求类型未知,即不匹配任何已定义的 msgtype 或 event 类型,switchType 方法将返回一个默认的文本消息,告知用户收到了未知类型的消息。
 | 
						
						
						
						
							 | 
							
								 | 
							
							错误处理:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							在处理未知事件类型时,switchType 方法会调用 Msg::returnErrMsg 函数返回一个错误信息,错误类型由 MsgConstant::ERROR_UNKNOW_TYPE 定义。
 | 
						
						
						
						
							 | 
							
								 | 
							
							扩展性:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							类中还预留了其他方法的占位符(// ... 其他方法 ...),这表明 WechatRequest 类可以根据需要进一步扩展,以处理更多的请求类型或业务逻辑。
 | 
						
						
						
						
							 | 
							
								 | 
							
							代码组织:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							类中的代码组织遵循了单一职责原则,每个处理函数负责一种特定类型的请求,使得代码易于维护和扩展。
 | 
						
						
						
						
							 | 
							
								 | 
							
							命名规范:
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							类、方法和变量的命名都遵循了一定的规范,如 switchType 表示该方法用于切换处理不同类型的请求,eventSubscribe 表示处理用户订阅事件的方法。
 | 
						
						
						
						
							 | 
							
								 | 
							
							通过上述设计,WechatRequest 类为微信公众号提供了一个灵活、可扩展且易于维护的消息和事件处理机制。
 | 
						
						
						
						
							 | 
							
								 | 
							
							''' |