setName('TransferFans') ->addArgument('out', Argument::REQUIRED, "转移粉丝的渠道") ->addArgument('in', Argument::REQUIRED, "接受粉丝的渠道") ->addArgument('id', Argument::OPTIONAL, "开始ID(包含当前ID)") ->setDescription('转移渠道粉丝到另一个渠道'); } protected function execute(Input $input, Output $output) { try{ //cli模式下无法获取到当前的项目模块,手动指定一下 Request::instance()->module('admin'); $adminConfigModel = model('AdminConfig'); //获取参数 $in = $input->getArgument('in'); $out = $input->getArgument('out'); $id = $input->getArgument('id'); //检测参数是否合法 if(empty($in) || empty($out)){ $output->error('WeChat->TransferFans Error: 转移粉丝的渠道ID AND 接受粉丝的渠道ID 为必填项'); Log::error('WeChat->TransferFans Error: 转移粉丝的渠道ID AND 接受粉丝的渠道ID 为必填项'); return; } if(!is_numeric($in) || !is_numeric($out)){ $output->error('WeChat->TransferFans Error: 转移粉丝的渠道ID AND 接受粉丝的渠道ID 必须为Int类型'); Log::error('WeChat->TransferFans Error: 转移粉丝的渠道ID AND 接受粉丝的渠道ID 必须为Int类型'); return; } $output->info("WeChat->TransferFans Info: 粉丝转移渠道[ {$out} ],粉丝接收渠道[ {$in} ]"); Log::info("WeChat->TransferFans Info: 粉丝转移渠道[ {$out} ],粉丝接收渠道[ {$in} ]"); //获取渠道信息 if(!$inAdminConfig = $adminConfigModel->getAdminInfoAll($in)){ $output->error("WeChat->TransferFans Channel_in:{$in},Error: 获取接受粉丝渠道信息失败"); Log::error("WeChat->TransferFans Channel_in:{$in},Error: 获取接受粉丝渠道信息失败"); return; } Log::info("WeChat->TransferFans Info: 粉丝接收渠道[ {$in} ],配置信息 ".var_export($inAdminConfig,true)); if(!$outAdminConfig = $adminConfigModel->getAdminInfoAll($out)){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error: 获取转移粉丝渠道信息失败"); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error: 获取转移粉丝渠道信息失败"); return; } Log::info("WeChat->TransferFans Info: 粉丝转移渠道[ {$out} ],配置信息 ".var_export($outAdminConfig,true)); //确认转移信息 if(!$confirm = $output->confirm($input,"请确认把渠道[ {$out} ]的粉丝转移到渠道[ {$in} ]上面:")){ $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Info: 已取消粉丝转移操作"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Info: 已取消粉丝转移操作"); return; } $map['channel_id'] = $out; $map['id'] = ['>=',$id ?? 1]; //一次最多转移100个 while($fans_list = model('Oldwx')->where($map)->limit(100)->column('id,openid')){ //获取渠道WeChat对象 if(!$inOfficialAccount = $this->getChannelWechat($inAdminConfig)){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error: 获取接受粉丝渠道WeChat对象失败"); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error: 获取接受粉丝渠道WeChat对象失败"); return; } $output->write('WeChat->TransferFans ------------------------------------->转移100个粉丝',5,$output::OUTPUT_NORMAL); //输出查询语句 $execSQL = model('Oldwx')->where($map)->limit(100)->fetchSql(true)->column('id,openid'); $output->info('WeChat->TransferFans QuerySQL:'.$execSQL); Log::info('WeChat->TransferFans QuerySQL:'.$execSQL); //构造查询条件 $keys = array_keys($fans_list); $map['id'] = ['>',end($keys)]; //调用微信接口转移 Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Call_WeChat_Interface_Params:".var_export(array('old_appid'=>$outAdminConfig['appid'],'open_list'=>$fans_list),true)); $transferRes = $inOfficialAccount->user->changeOpenid($outAdminConfig['appid'],array_values($fans_list)); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Call_WeChat_Interface_Result:".var_export($transferRes,true)); //检测是否转移是否成功 if(isset($transferRes['errcode']) && $transferRes['errcode'] != 0){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Error:".$transferRes['errmsg']); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Error:".$transferRes['errmsg']); continue; } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Info:微信粉丝转移接口调用成功"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Info:微信粉丝转移接口调用成功"); if(!isset($transferRes['result_list']) || empty($transferRes['result_list'])){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Error:微信返回数据错误,结果集为空"); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Code:{$transferRes['errcode']},Error:微信返回数据错误,结果集为空"); continue; } foreach($transferRes['result_list'] as $result){ $output->write('WeChat->TransferFans ------------------------------------->处理微信返回结果',3,$output::OUTPUT_NORMAL); //粉丝是否转移成功 if($result['err_msg'] != 'ok'){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error:".$result['err_msg'].',Resutl:'.var_export($result,true)); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Error:".$result['err_msg'].',Resutl:'.var_export($result,true)); continue; } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Info:{$result['err_msg']}"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Info:{$result['err_msg']}"); //成功转移的粉丝,获取用户ID ori_openid new_openid 是否删除OpenID? $openInfo = model('Openid')->setConnect($out, $result['ori_openid'])->where(['channel_openid' => $out.'_'.$result['ori_openid']])->find(); if(!$openInfo || !isset($openInfo['user_id']) || (isset($openInfo['user_id']) && empty($openInfo['user_id']))){ Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Error:查找数据库OpenID失败"); $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Error:查找数据库OpenID失败"); continue; } $openInfo = $openInfo->toArray(); $user_id = $openInfo['user_id']; Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Info:获取OpenID信息成功,Result:".var_export($openInfo,true)); $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Info:获取OpenID信息成功"); //查找是否存在OpenID if($open_exists = model('Openid')->setConnect($in, $result['new_openid'])->where(['channel_openid' => $in.'_'.$result['new_openid']])->find()){ Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:用户新OPENID已存在,Data:".var_export($open_exists->toArray(),true)); $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:用户新OPENID已存在,Data:".var_export($open_exists->toArray(),true)); continue; } // //插入新的OPEN_ID $open_data = ['channel_openid' => $in . '_' . $result['new_openid'], 'user_id' => $user_id, 'createtime' => time(), 'updatetime' => time()]; if(!$insertOpenID = model('openid')->setConnect($in, $result['new_openid'])->insertGetId($open_data)){ Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:创建新的OPENID信息失败,Data:".var_export($open_data,true)); $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:创建新的OPENID信息失败,Data:".var_export($open_data,true)); die(); } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:创建新的OPENID信息成功,Data:".var_export($open_data,true)); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:创建新的OPENID信息成功,Data:".var_export($open_data,true)); //删除旧的OPEN_ID if(!model('Openid')->setConnect($out, $result['ori_openid'])->where(['channel_openid' => $out.'_'.$result['ori_openid']])->delete()){ Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Error:删除旧的OpenID信息失败,Result:".var_export($openInfo,true)); $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},Error:删除旧的OpenID信息失败,Result:".var_export($openInfo,true)); die(); } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},OpenID:{$openInfo['id']},Info:删除旧的OpenID信息成功"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},OpenID:{$openInfo['id']},Info:删除旧的OpenID信息成功"); //更新用户基础数据 $user_data = ['openid'=>$result['new_openid'],'channel_id'=>$in]; if(false === model('User')->setConnect($user_id)->where('id',$user_id)->update($user_data)){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:更新用户基础信息失败,Data:".var_export($user_data,true)); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:更新用户基础信息失败,Data:".var_export($user_data,true)); die(); } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:更新用户基础信息成功,Data:".var_export($user_data,true)); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:更新用户基础信息成功,Data:".var_export($user_data,true)); //清空用户缓存 if(!$this->clearCache($user_id)){ $output->error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:清除用户缓存失败"); Log::error("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Error:清除用户缓存失败"); die(); } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:清除用户缓存成功"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},OLD_OPENID:{$result['ori_openid']},NEW_OPENID:{$result['new_openid']},User_id:{$user_id},Info:清除用户缓存成功"); } } $output->info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Info: 已完成粉丝转移操作"); Log::info("WeChat->TransferFans Channel_in:{$in},Channel_out:{$out},Info: 已完成粉丝转移操作"); }catch (\Exception $e){ Log::error('WeChat->TransferFans Error: '.$e->getMessage(). ' Code:'.$e->getLine()); $output->error('WeChat->TransferFans Error: '.$e->getMessage(). ' Code:'.$e->getLine()); } } /** * 删除用户缓存 * @param $user_id * @return bool */ private function clearCache($user_id){ $redis = Redis::instance(); $redis->del('UN:' . $user_id); if ($redis->exists('UN:' . $user_id)) { return false; } return true; } /** * 获取渠道对象 * @param $adminConfig * @return \EasyWeChat\OpenPlatform\Authorizer\OfficialAccount\Application */ private function getChannelWechat($adminConfig){ $wechat = new WeChatObject($adminConfig); $officialAccount = $wechat->getOfficialAccount(); return $officialAccount; } }