123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- <?php
- namespace app\admin\command;
- use app\common\library\Redis;
- use app\common\library\WeChatObject;
- use EasyWeChat\Factory;
- use Symfony\Component\Cache\Simple\RedisCache;
- use think\Config;
- use think\console\Command;
- use think\console\Input;
- use think\console\input\Argument;
- use think\console\Output;
- use think\Log;
- use think\Request;
- class TransferFans extends Command
- {
- protected function configure()
- {
- $this
- ->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;
- }
- }
|