* @version : HuoMp 1.0 */ namespace huoMpMsg\controller; use huo\controller\member\Oauth; use huo\controller\request\Channel; use huo\controller\request\Device; use huo\controller\request\Game; use huo\controller\request\Mem; use huo\model\member\MemoauthModel; use huolib\constant\MemConst; use huolib\constant\OauthConst; use huolib\constant\WeiXinMenuConst; use huomp\model\weixin\MpConfModel; use huoMpMsg\constant\OfficialAccountConst; use huoMpMsg\model\MpEventMsgLogModel; use huoMpMsg\model\MpMsgLogModel; use think\Log; class OaMessage { /** * 接收微信数据 * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 * * @param string $mp_id 小程序ID * @param array $param * */ public function receive($mp_id, $param) { $_data['mp_id'] = $mp_id; $_data['wx_msg_id'] = get_val($param, 'MsgId', 0); $_data['source_id'] = get_val($param, 'ToUserName', ''); $_data['open_id'] = get_val($param, 'FromUserName', ''); $_data['msg_type'] = get_val($param, 'MsgType', ''); $_data['pic_url'] = get_val($param, 'PicUrl', ''); $_data['media_id'] = get_val($param, 'MediaId', ''); $_data['title'] = get_val($param, 'Title', ''); $_data['mini_app_id'] = get_val($param, 'AppId', ''); $_data['page_path'] = get_val($param, 'PagePath', ''); $_data['thumb_url'] = get_val($param, 'ThumbUrl', ''); $_data['thumb_media_id'] = get_val($param, 'ThumbMediaId', ''); $_data['text'] = get_val($param, 'Content', ''); $_data['wx_create_time'] = get_val($param, 'CreateTime', 0); $_model = new MpMsgLogModel(); $_rs = $_model->hasMsg($_data['wx_msg_id']); if (empty($_rs)) { $_rs = $_model->insertLog($_data); } if (false !== $_rs) { if (!empty($_data['text'])) { $_msg = (new OaReturnMsg())->getKeyReturnMsg($mp_id, $_data['text']); if (!empty($_msg)) { $this->sendTextMsg($mp_id, $_data['open_id'], $_msg); } } // $this->sendTextMsg($mp_id,$_data['open_id'],'您好'); die('success'); } die(''); } /** * 接收事件推送 * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454 * * @param string $mp_id 微信ID * @param array $param 参数 * */ public function receiveEventMsg($mp_id, $param) { if (empty($mp_id) || empty($param) || empty($param['Event'])) { return; } $_event = $param['Event']; $_data['mp_id'] = $mp_id; $_data['source_id'] = get_val($param, 'ToUserName', ''); $_data['open_id'] = get_val($param, 'FromUserName', ''); $_data['msg_type'] = get_val($param, 'MsgType', ''); $_data['event'] = get_val($param, 'Event', ''); $_data['event_key'] = json_encode(get_val($param, 'EventKey', [])); $_data['ticket'] = get_val($param, 'Ticket', ''); $_data['latitude'] = get_val($param, 'Latitude', ''); $_data['longitude'] = get_val($param, 'Longitude', ''); $_data['precision'] = get_val($param, 'Precision', ''); $_data['wx_create_time'] = get_val($param, 'CreateTime', 0); $_model = new MpEventMsgLogModel(); $_rs = $_model->hasMsg($_data['open_id'], $_data['wx_create_time']); if (empty($_rs)) { $_model->insertLog($_data); } switch ($_event) { case OfficialAccountConst::EVENT_SUBSCRIBE: $_event_key = get_val($param, 'EventKey', ''); if (!empty($_event_key)) { /* 扫描带参数二维码事件 用户未关注时,进行关注后的事件推送 */ break; } /* 关注事件 */ $this->subscribe($mp_id, $param); break; case OfficialAccountConst::EVENT_UNSUBSCRIBE: /* 取消关注事件 */ $this->unsubscribe($mp_id, $param); break; case OfficialAccountConst::EVENT_SCAN: /* 扫描带参数二维码事件 用户已关注时的事件推送 */ $this->scan($mp_id, $param); break; case OfficialAccountConst::EVENT_CLICK: /* 自定义菜单事件 点击菜单拉取消息时的事件推送 */ $this->click($mp_id, $param); break; case OfficialAccountConst::EVENT_VIEW: /* 自定义菜单事件 点击菜单跳转链接时的事件推送 */ $this->view($mp_id, $param); break; case OfficialAccountConst::EVENT_SCANCODE_PUSH: /* 扫码推事件的事件推送 */ $this->scanCodePush($mp_id, $param); break; case OfficialAccountConst::EVENT_SCANCODE_WAITMSG: /* 扫码推事件且弹出“消息接收中”提示框的事件推送 */ $this->scanCodeWaitmsg($mp_id, $param); break; case OfficialAccountConst::EVENT_PIC_SYSPHOTO: /* 弹出系统拍照发图的事件推送 */ $this->picSysPhoto($mp_id, $param); break; case OfficialAccountConst::EVENT_PIC_PHOTO_OR_ALBUM: /* 弹出拍照或者相册发图的事件推送 */ $this->picPhotoOrAlbum($mp_id, $param); break; case OfficialAccountConst::EVENT_PIC_WEIXIN: /* 弹出微信相册发图器的事件推送 */ $this->picWeixin($mp_id, $param); break; case OfficialAccountConst::EVENT_LOCATION_SELECT: /* 弹出微信相册发图器的事件推送 */ $this->locationSelect($mp_id, $param); break; default: break; } } /** * * 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。 * * @param string $mp_id 微信ID * @param array $param 参数 * * * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅) */ public function subscribe($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } $_conf_id = (new MpConfModel())->getIdByMpId($mp_id); if (empty($_conf_id)) { die(''); } $_mo_model = new MemoauthModel(); $_type = OauthConst::OAUTH_WEIXIN; $_mo_data = $_mo_model->getInfoByOpenId($_type, $_open_id); if (empty($_mo_data)) { /* 注册用户 */ $_game_rq = new Game(); $_channel_rq = new Channel(); $_device_rq = new Device(); $_mem_rq = new Mem(); $_oauth_data['token'] = []; $_oauth_data['app_key'] = $mp_id; $_oauth_data['openid'] = $_open_id; $_oauth_data['unionid'] = $_open_id; $_oauth_data['channel'] = $_type; $_oauth_data['nickname'] = ''; $_oauth_data['gender'] = ''; $_oauth_data['avatar'] = ''; $_oauth_data['token'] = ['openid' => $_open_id, 'access_token' => '', 'expires_in' => 0]; $_config = []; $_wx_app_secret = (new MpConfModel())->getSecretByMpId($mp_id); if (!empty($_wx_app_secret)) { $_config['APP_KEY'] = $mp_id; $_config['APP_SECRET'] = $_wx_app_secret; $_config['CALLBACK'] = ''; } (new Oauth())->oAuthReg( $_type, $_oauth_data, $_game_rq, $_channel_rq, $_device_rq, $_mem_rq, $_config ); } else { /* 更新第三方状态 */ $_mo_data['status'] = MemConst::STATUS_NORMAL; $_mo_model->updateOauth($_mo_data['from'], $_open_id, $_mo_data); } $_msg = (new OaReturnMsg())->getSubscribeMsg($mp_id); if (empty($_msg)) { $_msg = '欢迎关注!'; } $this->sendTextMsg($mp_id, $_open_id, $_msg); die('success'); } public function unsubscribe($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } $_conf_id = (new MpConfModel())->getIdByMpId($mp_id); if (empty($_conf_id)) { die(''); } $_mo_model = new MemoauthModel(); $_type = OauthConst::OAUTH_WEIXIN; $_mo_data = $_mo_model->getInfoByOpenId($_type, $_open_id); if (!empty($_mo_data)) { $_mo_data['status'] = MemConst::STATUS_TRY; $_mo_model->updateOauth($_type, $_open_id, $_mo_data); } die(''); } public function scan($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function click($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } $_key = get_val($param, 'EventKey', ''); if (empty($_key)) { die(''); } $_msg = (new OaReturnMsg())->getKeyReturnMsg($mp_id, $_key, WeiXinMenuConst::IS_MENU_2); if (!empty($_msg)) { $this->sendTextMsg($mp_id, $_open_id, $_msg); die('success'); } } public function view($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function scanCodePush($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function scanCodeWaitmsg($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function picSysPhoto($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function picPhotoOrAlbum($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function picWeixin($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } public function locationSelect($mp_id, $param) { $_open_id = get_val($param, 'FromUserName', ''); if (empty($_open_id)) { die(''); } } /** * 发送文本消息 * * @param string $mp_id * @param string $open_id 玩家应用ID * @param string $text * * @return bool */ public function sendTextMsg($mp_id, $open_id, $text = '') { $_msg_type = 'text'; $_msg_data = [ "content" => $text ]; $_mp_conf = (new MpConfModel())->getDataByMpId($mp_id); if (empty($_mp_conf)) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__ ."&step=1&mp_id=$mp_id&open_id=".$open_id, Log::ERROR ); return false; } $_wx_app_secret = $_mp_conf['app_secret']; (new OfficialAccountApi())->sendMsg($mp_id, $_wx_app_secret, $open_id, $_msg_type, $_msg_data); return true; } }