public function handle_request() { //获取关注的微信用户 $WechatInfoList = Model_Wechat_WechatUsers::getWechatInfoListById($this->id, $this->limit); //判断当前队列是否处理完成 if (empty($WechatInfoList)) { //清空游标 $this->setFlag(array('id' => 0)); //停止shell调用 $this->setStop(); //写过程日志 $this->setLog('处理完成'); exit; } $WechatMbroker = new Bll_Wechat_Mbroker_WechatMbroker(); //数据处理 foreach ($WechatInfoList as $list) { $this->id = $list['id']; //判断微信是否关注 if ($list['status'] != Model_Wechat_WechatUsers::subscribe) { $this->setLog(date('Y-m-d H:i:s') . ' openid:' . $list['openId'] . ' userid:' . $list['userId'] . ' 未关注'); continue; } //判断关注账号是否绑定 if (!$list['userId']) { $this->setLog(date('Y-m-d H:i:s') . ' openid:' . $list['openId'] . ' userid:' . $list['userId'] . ' 微信未绑定'); continue; } //推送消息 $WechatMbroker->setMbrokeNoticeFromTemplate($list['openId'], $list['userId'], $list['userType']); //记录游标 $this->setFlag(array('id' => $this->id)); } //休息10毫秒 $this->setShCommonSleepTime(0.01); }
/** * 绑定微信id和安居客id * @param $UserId * @param $OpenId * @param $UserType */ public static function bindingOpenidTOUserid($UserId, $OpenId, $UserType) { //查询是否存在账号信息 $WechatInfo = Model_Wechat_WechatUsers::getWechatInfoByOpenId($OpenId); if ($WechatInfo) { if ($WechatInfo['status'] == 1 && $UserId == $WechatInfo['userId']) { //关注账号信息已经登记 } else { Model_Wechat_WechatUsers::updateUserIdByOpenId($OpenId, $UserId, $UserType); } } else { $WechatMbroker = new Bll_Wechat_Mbroker_WechatMbroker(); $accountId = $WechatMbroker->accountId; Model_Wechat_WechatUsers::addWechatUsers($accountId, $OpenId, $UserId, $UserType); } }
/** * 微信用户关注,取消关注 * @param $openId * @param $status 1-关注,2-取消关注 * @return array */ public static function updateStatusByOpenId($openId, $status = 1) { $native_sql = 'update wechat_users set `status`=?,user_id=0,user_type=0 where open_id=?'; return Model_Wechat_WechatUsers::data_access()->native_sql($native_sql, array($status, $openId), false); }
/** * 服务端:用于微信向我们自有服务器发起的请求的处理 * 使用范文:服务器认证、监听事件、接收用户消息等 * @return \Overtrue\Wechat\Server */ public function WechatServer() { $WechatServer = new Overtrue\Wechat\Server($this->appId, $this->token, $this->encodingAESKey); $thisObj = $this; /** * 监听消息 * @link http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF * @link https://github.com/overtrue/wechat/wiki/%E6%B6%88%E6%81%AF%E7%9A%84%E4%BD%BF%E7%94%A8 * $message * [signature] => 8f42463963cdbcfd828e1e7f02fc35065d806614 * [timestamp] => 1431416888 * [nonce] => 2009557068 * [ToUserName] => gh_d24166bcf121 * [FromUserName] => oBN0jt4WSP2np13IhruvIggaK31U * [CreateTime] => 1431416888 * [MsgType] => text * [Content] => 0009 * [MsgId] => 6147888721115024795 */ $WechatServer->on('message', function ($message) use($thisObj) { //消息逻辑处理 switch ($message['MsgType']) { case 'text': //文本消息 $thisObj->msgText($message); break; case 'image': //图片消息 $thisObj->msgImage($message); break; case 'voice': //语音消息 $thisObj->msgVoice($message); break; case 'video': //视频消息 $thisObj->msgVideo($message); break; default: return $thisObj->sendText(''); } }); /** * 监听事件 * @link http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF * @link https://github.com/overtrue/wechat/wiki/%E7%9B%91%E5%90%AC%E5%BE%AE%E4%BF%A1%E4%BA%8B%E4%BB%B6 * * ToUserName 接收者 ID(公众号 ID) * FromUserName 发送方帐号(一个 OpenID) * CreateTime 消息创建时间 (整型) * MsgType event * Event 事件类型,ex: subscribe * EventKey 事件 Key 值,与自定义菜单接口中 Key 值对应 */ $WechatServer->on('event', function ($event) use($thisObj) { //消息逻辑处理 switch ($event['Event']) { case 'subscribe': //关注 //查询是否存在账号信息 $WechatInfo = Model_Wechat_WechatUsers::getWechatInfoByOpenId($event['FromUserName']); if ($WechatInfo) { if ($WechatInfo['status'] == 1) { //关注账号信息已经登记 } else { Model_Wechat_WechatUsers::updateStatusByOpenId($event['FromUserName'], Model_Wechat_WechatUsers::subscribe); } } else { Model_Wechat_WechatUsers::addWechatUsers($thisObj->accountId, $event['FromUserName']); } //关注的后续处理 return $thisObj->eventSubscribe($event); break; case 'unsubscribe': //取消关注 //记录账号信息openid Model_Wechat_WechatUsers::updateStatusByOpenId($event['FromUserName'], Model_Wechat_WechatUsers::unsubscribe); return $thisObj->eventUnsubscribe($event); break; case 'CLICK': //菜单点击事件 return $thisObj->eventClick($event); break; case 'LOCATION': return $thisObj->eventClick($event); break; default: return $thisObj->sendText(''); } }); //返回消息体 return $WechatServer->serve(); }