['222','212','122','112'],
'new_user_activity_bm'=>['212','122','112'],
'new_user_activity_for_free'=>['000']
];
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$type = $this->option('type');
$time = $this->option('time');
if(!$type || !$time) return ;
$client = new Client();
$this->getUser($time);
if(!$this->user) return ;
if($type == 'sm' || $type == 'bm'){
$requests = $this->newUserSmAndBm();
if($requests){
$pool = new Pool($client, $requests, ['concurrency' => 5,
'fulfilled' => function ($response, $index) {},
'rejected' => function ($reason, $index) {},
]);
$promise = $pool->promise();
$promise->wait();
}
}
if($type == 'all'){
$requests =$this->newUserAll();
if($requests){
$pool = new Pool($client, $requests, ['concurrency' => 5,
'fulfilled' => function ($response, $index) {},
'rejected' => function ($reason, $index) {},
]);
$promise = $pool->promise();
$promise->wait();
}
}
if($type == 'free-24'){
$requests =$this->newUserFree();
if($requests){
$pool = new Pool($client, $requests, ['concurrency' => 5,
'fulfilled' => function ($response, $index) {},
'rejected' => function ($reason, $index) {},
]);
$promise = $pool->promise();
$promise->wait();
}
}
if($type == 'free-36'){
$requests =$this->newUserFreeSmall();
if($requests){
$pool = new Pool($client, $requests, ['concurrency' => 5,
'fulfilled' => function ($response, $index) {},
'rejected' => function ($reason, $index) {},
]);
$promise = $pool->promise();
$promise->wait();
}
}
}
private function newUserFree(){
$user = $this->user;
foreach ($user as $item){
$charge = Order::where('uid',$item->uid)->where('status','PAID')->count();
if($charge) continue;
$force_subscribe_info = DB::connection('api_mysql')->table('temp_force_subscribe_users')
->where('uid',$item->uid)->where('is_subscribed',1)->select('appid','openid','distribution_channel_id')->first();
if(!$force_subscribe_info) continue;
$accecc_token = $this->getAccessToken($force_subscribe_info->appid);
if(!$accecc_token)continue;
$status = $this->isAccess($item->uid,'new_user_activity_for_free',$distribution_channel_id);
if($status){
$content = $this->newUserActivityBmContent($force_subscribe_info->distribution_channel_id);
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
$request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
'touser'=>$force_subscribe_info->openid,
'msgtype'=>'text',
'text'=>['content'=>$content]
],JSON_UNESCAPED_UNICODE));
yield $request;
}
}
}
private function newUserFreeSmall(){
$user = $this->user;
foreach ($user as $item){
$charge = Order::where('uid',$item->uid)->where('status','PAID')->count();
if($charge) continue;
$force_subscribe_info = DB::connection('api_mysql')->table('temp_force_subscribe_users')
->where('uid',$item->uid)->where('is_subscribed',1)->select('appid','openid','distribution_channel_id')->first();
if(!$force_subscribe_info) continue;
$accecc_token = $this->getAccessToken($force_subscribe_info->appid);
if(!$accecc_token)continue;
$status = $this->isAccess($item->uid,'new_user_activity_for_free',$distribution_channel_id);
if($status){
$content = $this->newUserAllContent($force_subscribe_info->distribution_channel_id);
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
$request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
'touser'=>$force_subscribe_info->openid,
'msgtype'=>'text',
'text'=>['content'=>$content]
],JSON_UNESCAPED_UNICODE));
yield $request;
}
}
}
//新用户大礼包-全量用户
private function newUserAll(){
$user = $this->user;
foreach ($user as $item){
$charge = Order::where('uid',$item->uid)->where('status','PAID')->count();
if($charge) continue;
$force_subscribe_info = DB::connection('api_mysql')->table('temp_force_subscribe_users')
->where('uid',$item->uid)->where('is_subscribed',1)->select('appid','openid','distribution_channel_id')->first();
if(!$force_subscribe_info) continue;
$accecc_token = $this->getAccessToken($force_subscribe_info->appid);
if(!$accecc_token)continue;
$content = $this->newUserAllContent($force_subscribe_info->distribution_channel_id);
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
$request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
'touser'=>$force_subscribe_info->openid,
'msgtype'=>'text',
'text'=>['content'=>$content]
],JSON_UNESCAPED_UNICODE));
yield $request;
}
}
private function getUser($time){
$s_time = $time+0.5;
$b_time = $time-0.5;
$user = DB::connection('api_mysql')->table('rfm_ab_test_user')
->where('created_at','>=',date('Y-m-d H:i:s',time()-$s_time*3600))
->where('created_at','<=',date('Y-m-d H:i:s',time()-$b_time*3600))
->where('type','B')
->select('uid','created_at')
->get();
if(!$user){
$this->user = null;
return ;
}
$this->user = $user;
}
//新用户大礼包-小M值用户 新用户大礼包-大M值用户
private function newUserSmAndBm(){
$user = $this->user;
foreach ($user as $item){
$charge = Order::where('uid',$item->uid)->where('status','PAID')->count();
if($charge) continue;
$force_subscribe_info = DB::connection('api_mysql')->table('temp_force_subscribe_users')
->where('uid',$item->uid)->where('is_subscribed',1)->select('appid','openid','distribution_channel_id')->first();
if(!$force_subscribe_info) continue;
$status = $this->isAccessSmAndBm($item->uid,$distribution_channel_id);
$accecc_token = $this->getAccessToken($force_subscribe_info->appid);
if(!$accecc_token)continue;
if($status['new_user_activity_sm']){
$content = $this->newUserActivitySmContent($force_subscribe_info->distribution_channel_id);
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
$request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
'touser'=>$force_subscribe_info->openid,
'msgtype'=>'text',
'text'=>['content'=>$content]
],JSON_UNESCAPED_UNICODE));
yield $request;
}
if($status['new_user_activity_bm']){
$content = $this->newUserActivityBmContent($force_subscribe_info->distribution_channel_id);
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
$request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
'touser'=>$force_subscribe_info->openid,
'msgtype'=>'text',
'text'=>['content'=>$content]
],JSON_UNESCAPED_UNICODE));
yield $request;
}
}
}
private function isAccessSmAndBm($uid,&$distribution_channel_id){
$sql = 'select id,created_at,distribution_channel_id from users WHERE openid = (SELECT openid FROM users WHERE id = '.$uid.')';
$result = DB::connection('api_mysql')->select($sql);
$return_status = [
'new_user_activity_sm'=>false,
'new_user_activity_bm'=>false
];
foreach ($result as $item){
if($item->id == $uid) {
$distribution_channel_id = $item->distribution_channel_id;
continue;
}
if($return_status['new_user_activity_sm'] && $return_status['new_user_activity_bm']){
return $return_status;
}
$this_user_level = UserService::rfmLevel($item->id,strtotime($item->created_at));
if($this_user_level){
$this_user_level_text = implode('',$this_user_level);
if(in_array($this_user_level_text,$this->Level['new_user_activity_sm'])){
$return_status['new_user_activity_sm'] = true;
}
if(in_array($this_user_level_text,$this->Level['new_user_activity_bm'])){
$return_status['new_user_activity_bm'] = true;
}
}
}
return $return_status;
}
private function isAccess($uid,$k,&$distribution_channel_id){
$sql = 'select id,created_at,distribution_channel_id from users WHERE openid = (SELECT openid FROM users WHERE id = '.$uid.')';
$result = DB::connection('api_mysql')->select($sql);
foreach ($result as $item){
if($item->id == $uid) {
$distribution_channel_id = $item->distribution_channel_id;
continue;
}
$this_user_level = UserService::rfmLevel($item->id,strtotime($item->created_at));
if($this_user_level){
$this_user_level_text = implode('',$this_user_level);
if(in_array($this_user_level_text,$this->Level[$k])){
return true;
}
}
}
return false;
}
private function newUserActivitySmContent($distribution_channel_id){
$text = "您的新用户专享礼包已送达\r\n\r\n充19.9得4000书币,充38得8800书币,只有一次机会哦!\r\n\r\n过期失效,不要错过!\r\n\r\n点击立即领取>>\r\n\r\n为方便下次阅读,请置顶公众号";
$link_format = 'https://site%s.%s.com/activity/rfmNUSm?send_time='.time();
$link = sprintf($link_format,encodeDistributionChannelId($distribution_channel_id),env('CUSTOM_HOST'));
$top = 'https://help.zhuishuyun.com/top.html';
return sprintf($text,$link,$top);
}
private function newUserActivityBmContent($distribution_channel_id){
$text = "您的新用户专享礼包已送达\r\n\r\n 优惠充值特惠 \r\n\r\n过期失效,不要错过!\r\n\r\n点击立即领取>>\r\n\r\n为方便下次阅读,请置顶公众号";
$link_format = 'https://site%s.%s.com/sale/newUserSale?send_time='.time();
$link = sprintf($link_format,encodeDistributionChannelId($distribution_channel_id),env('CUSTOM_HOST'));
$top = 'https://help.zhuishuyun.com/top.html';
return sprintf($text,$link,$link,$top);
}
private function newUserAllContent($distribution_channel_id){
$text = "您的新用户专享礼包已送达\r\n\r\n充9.9得2000书币,只有一次机会哦!\r\n\r\n过期失效,不要错过!\r\n\r\n点击立即领取>>\r\n\r\n为方便下次阅读,请置顶公众号";
$link_format = 'https://site%s.%s.com/sale/newUserActivity?send_time='.time();
$link = sprintf($link_format,encodeDistributionChannelId($distribution_channel_id),env('CUSTOM_HOST'));
$top = 'https://help.zhuishuyun.com/top.html';
return sprintf($text,$link,$top);
}
private function getAccessToken($appid){
try{
$WechatController = new WechatController($appid);
$accessToken = $WechatController->app->access_token; // EasyWeChat\Core\AccessToken 实例
$token = $accessToken->getToken(); // token 字符串
return $token;
}catch(\Exception $e){
\Log::error($e->getMessage());
}
return '';
}
}