| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | <?php/** * Created by PhpStorm. * User: z-yang * Date: 2020/2/6 * Time: 22:09 */namespace App\Modules\OfficialAccount\Services;use App\Jobs\SendNews;use App\Jobs\SendTexts;use App\Modules\OfficialAccount\Models\ForceSubscribeDelayMsg;use App\Http\Controllers\WechatController;use GuzzleHttp\Client;use GuzzleHttp\Psr7\Request as GuzzleRequest;use DB;class ForceSubscribeDelayMsgService{    public static function getList($distribution_channel_id){        return ForceSubscribeDelayMsg::where('distribution_channel_id',$distribution_channel_id)            ->where('is_show',1)            ->where('is_enable',1)            ->select('id',                'distribution_channel_id',                'title',                'link',                'icon',                'desc',                'time_delay',                'is_enable')            ->get();    }    public static function queue($distribution_channel_id,$appid,$openid){        $list = self::getList($distribution_channel_id);        if($list->isEmpty())return ;        foreach ($list as $item){            try{                $inset_data  = [                    'openid'=>$openid,                    'title'=>$item->title,                    'link'=>$item->link,                    'icon'=>$item->icon,                    'desc'=>$item->desc,                    'appid'=>$appid,                    'time_delay'=>$item->time_delay,                    'distribution_channel_id'=>$distribution_channel_id                ];                $inset_data['created_at'] = date('Y-m-d H:i:s');                $inset_data['updated_at'] = date('Y-m-d H:i:s');                $inset_data['predict_send_time'] = date('Y-m-d H:i:s',time()+$item->time_delay);                $inset_data['send_status'] = 'ready';                //$id = DB::table('force_subscribe_delay_msg_send_record')->insertGetId($inset_data);                DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->insert($inset_data);                if(stripos($item->link,'?') !== false){                    $link = $item->link.'&fromtype=subscribe_delay&send_time='.(time()+$item->time_delay);                }else{                    $link = $item->link.'?fromtype=subscribe_delay&send_time='.(time()+$item->time_delay);                }                $send_content = [];                $send_content[] = [                    ['title'=>$item->title],                    ['description'=>$item->desc],                    ['url'=> $link],                    ['image'=>$item->icon]                ];                $send_data=array(                    'send_time'=>date("Y-m-d H:i:s"),                    'data' => [                        'openid'=>$openid,                        'appid'=>$appid,                        'type'=>'one_task',                        'task_id'=>3,                        'news_content'=>json_encode($send_content)                    ]                );                //$job = (new SendNews($send_data))->onConnection('rabbitmq')->delay($item->time_delay)->onQueue('send_news_list');                //dispatch($job);            }catch (\Exception $e){            }        }    }    public static function  dequeue($openid){        DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('openid',$openid)            ->where('send_status','ready')->update([                'send_status'=>'unsubscribe',                'updated_at'=>date('Y-m-d H:i:s')            ]);    }    public static function getSendList($time_delay){        $result = DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('send_status','ready')            ->where('predict_send_time','>=',date('Y-m-d H:i:s',time()-$time_delay*2))            ->where('predict_send_time','<=',date('Y-m-d H:i:s',time()+$time_delay))            ->select('openid','id','desc','link','icon','appid','title','distribution_channel_id','time_delay')            ->get();        if($result){            $client = new Client();            $access_token_list = [];            foreach ($result as $item){                //用户类型是否满足条件                $is_access = self::msgUserTypeIsAccess($item->distribution_channel_id,$item->time_delay,$item->openid,$msg);                if(!$is_access) {                    DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$item->id)                        ->update([                            'send_status'=>$msg,                            'send_time'=>date('Y-m-d H:i:s'),                            'updated_at'=>date('Y-m-d H:i:s'),                            'send_result'=>''                        ]);                    continue;                }                if(isset($access_token_list[$item->appid])){                    $access_token = $access_token_list[$item->appid];                }else{                    $access_token = self::getAccessToken($item->appid);                    if($access_token){                        $access_token_list[$item->appid] = $access_token;                    }                }                if(stripos($item->link,'?') !== false){                    $link = $item->link.'&fromtype=subscribe_delay_'.$item->id;                }else{                    $link = $item->link.'?fromtype=subscribe_delay_'.$item->id;                }                if($access_token){                    $result = self::send($client,$access_token,$item->openid,$item->title,$item->desc,$link,$item->icon);                    $result_array = \GuzzleHttp\json_decode($result,1);                    if(isset($result_array['errcode']) && $result_array['errcode'] == 0){                        $send_status = 'send_success';                    }else{                        $send_status = 'send_fail';                    }                    DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$item->id)                    ->update([                        'send_status'=>$send_status,                        'send_time'=>date('Y-m-d H:i:s'),                        'updated_at'=>date('Y-m-d H:i:s'),                        'send_result'=>$result                    ]);                }            }        }    }    public static function msgUserTypeIsAccess($distribution_channel_id,$time_delay,$openid,&$msg){        $forceSubscribeDelayMsg = ForceSubscribeDelayMsg::where('distribution_channel_id',$distribution_channel_id)            ->where('time_delay',$time_delay)            ->where('is_show',1)            ->where('is_enable',1)            ->select('user_type')            ->first();        $msg = '';        if(!$forceSubscribeDelayMsg) {            $msg = 'sys-error';            return false;        }        if(strtoupper($forceSubscribeDelayMsg->user_type) == 'ALL') return true;        //已付费用户        $force_subscribe_user = DB::connection('api_mysql')->table('force_subscribe_users')->where('openid',$openid)->where('is_subscribed',1)->select('uid')->first();        if(!$force_subscribe_user) {            $msg = 'no subscribe';            return false;        }        if(!$force_subscribe_user->uid) {            $msg = 'no subscribe uid';            return false;        }        if(strtoupper($forceSubscribeDelayMsg->user_type) == 'PAID'){            $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();            if($paid_count && $paid_count >0)                return true;            $msg = 'need paid';            return false;        }        //未已付费用户        if(strtoupper($forceSubscribeDelayMsg->user_type) == 'UNPAID'){            $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();            if($paid_count && $paid_count >0) {                $msg = 'need unpaid';                return false;            }            return true;        }        $msg = 'unknown type';        return false;    }    private static function getAccessToken($appid){        try{            $WechatController = new WechatController($appid);            $accessToken = $WechatController->app->access_token;            $token = $accessToken->getToken();            return $token;        }catch(\Exception $e){            \Log::error($e);        }        return '';    }    private static function send(Client $client,$access_token,$openid,$title,$description,$url,$picurl){        $push_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;        $request = new GuzzleRequest('post',$push_url,[],\GuzzleHttp\json_encode([            'touser'=>$openid,            'msgtype'=>'news',            'news'=>[                'articles'=>[compact('title','description','url','picurl')]            ]        ],JSON_UNESCAPED_UNICODE));        try{            return $client->send($request)->getBody()->getContents();        }catch (\Exception $e){}        return '';    }}
 |