123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- <?php
- namespace app\admin\controller;
- use app\common\library\Rabbitmq;
- use app\admin\library\Auth;
- use app\common\controller\Backend;
- use app\common\utility\SubscriptionAuth;
- use app\main\service\OpenPlatformService;
- use EasyWeChat\Factory;
- use think\Config;
- use think\Log;
- use app\common\library\Redis;
- use Symfony\Component\Cache\Simple\RedisCache;
- /**
- * 订阅号管理
- *
- * @icon fa fa-circle-o
- */
- class Subscription extends Backend
- {
- const MQ_EXCHANGE_SYNC = 'E_SYNC_SUBSCRIPTION_TASK';
- const MQ_QUEUE_SUBSCRIPTION_TASK = 'Q_SYNC_SUBSCRIPTION_TASK';
- /**
- * SmartRecommand模型对象
- */
- protected $model = null;
- /**
- * 快速搜索时执行查找的字段
- */
- protected $searchFields = 'sub.id';
- protected $noNeedLogin = ['wxre','wxcallback'];
- public function _initialize()
- {
- parent::_initialize();
- $this->model = model('SubscriptionRelation');
- }
- public function index(){
- if($this->request->isAjax()){
- list($where, $sort, $order, $offset, $limit) = $this->buildparams();
- //检测VIP OR 渠道
- if($this->group == Auth::GROUP_ID_VIP_OPERATION){
- $admin_id = $this->auth->vip_id;
- }else{
- $admin_id = $this->auth->id;
- }
- $total = $this->model
- ->join('Subscription sub','sub.id = subscription_relation.subscription_id','left')
- ->join('Subscription_token token','token.subscription_id = sub.id','left')
- ->field('subscription_relation.admin_id,sub.id,sub.name,sub.json,token.updatetime,sub.status')
- ->where('admin_id',$admin_id)
- ->where($where)
- ->count();
- $list = $this->model
- ->join('Subscription sub','sub.id = subscription_relation.subscription_id','left')
- ->join('Subscription_token token','token.subscription_id = sub.id','left')
- ->field('subscription_relation.admin_id,sub.id,sub.name,sub.json,token.updatetime,sub.status')
- ->where('admin_id',$admin_id)
- ->where($where)
- ->order($sort, $order)
- ->limit($offset, $limit)
- ->select();
- return json(array("total" => $total, "rows" => $list));
- }else{
- //检测VIP OR 渠道
- if($this->group == Auth::GROUP_ID_VIP_OPERATION){
- $admin_id = $this->auth->vip_id;
- }else{
- $admin_id = $this->auth->id;
- }
- //获取对应用户默认平台信息
- $adminConfig = model('AdminConfig')->where('admin_id',$admin_id)->find();
- if(!$platform = model('platform')->whereIn('id',$adminConfig['platform_id'])->where(['status'=>'1'])->find()){
- $this->error("没有平台信息");
- }
- if(!$adminConfig['is_subscription']){
- $this->error('没有开通订阅号权限,如需开通请联系商务');
- }
- //获取微信授权地址
- $wechat = config('wechat');
- $wechat['app_id'] = $platform['appid'];
- $wechat['secret'] = $platform['secret'];
- $wechat['token'] = $platform['token'];
- $wechat['aes_key'] = $platform['aes_key'];
- if ($proxy = OpenPlatformService::instance()->getProxy($platform['id'])) {
- $wechat['http'] = array_merge(Config::get('wechat.http'), ['proxy' => $proxy]);
- }
- $openPlatform = Factory::openPlatform($wechat);
- $openPlatform['cache'] = new RedisCache(Redis::instanceCache());
- $params = [ //跳转参数
- 'platform_id' => $platform['id'],
- 'admin_id' => $admin_id,
- 'backurl' => $this->request->scheme() . '://' . get_host_no_port() . '/admin/subscription/index'
- ];
- $url = $openPlatform->getPreAuthorizationUrl(\think\Config::get('site.scheme').'://'.$platform['authhost'].'/admin/subscription/wxcallback?'.http_build_query($params));
- $platform['url'] = \think\Config::get('site.scheme').'://'.$platform['authhost'].'/admin/subscription/wxre?url='.base64_encode($url);
- //获取授权订阅号资格
- $sys_is_auth = model('AdminConfig')->where('admin_id',$admin_id)->value('is_subscription');
- $sys_auth_num = model('AdminConfig')->where('admin_id',$admin_id)->value('subscription_num');
- $sub_num = model('SubscriptionRelation')->where(['admin_id'=>$admin_id])->count();
- if($sys_is_auth && $sub_num < $sys_auth_num){
- $is_auth = true;
- }else{
- $is_auth = false;
- }
- //检查VIP
- if($this->group == Auth::GROUP_ID_VIP || $this->group == Auth::GROUP_ID_VIP_OPERATION){
- $is_vip = true;
- }else{
- $is_vip = false;
- }
- $this->assign('is_vip',$is_vip);
- $this->assign('platform',$platform);
- $this->assign('sub_is_auth',$is_auth);
- $this->assign('sys_auth_num',$sys_auth_num);
- $this->assignconfig('sub_is_auth',$is_auth);
- $this->assignconfig('auth_url',$platform['url']);
- return $this->view->fetch();
- }
- }
- public function manager(){
- if($this->request->isAjax()){
- $this->searchFields = 'id';
- list($where, $sort, $order, $offset, $limit) = $this->buildparams();
- $total = model('Subscription')
- ->where($where)
- ->order($sort, $order)
- ->limit($offset, $limit)
- ->count();
- $list = model('Subscription')
- ->where($where)
- ->order($sort, $order)
- ->limit($offset, $limit)
- ->select();
- return json(array("total" => $total, "rows" => $list));
- }else{
- return $this->view->fetch();
- }
- }
- public function fans(){
- if($this->request->has('ids')){
- $id = $this->request->param('ids');
- $appid = model('Subscription')->where('id',$id)->value('appid');
- $mq = new Rabbitmq();
- $mq->send(['subscription_id'=>$id,'appid'=>$appid],self::MQ_QUEUE_SUBSCRIPTION_TASK,self::MQ_EXCHANGE_SYNC);
- Log::info('syncSubscription->Queue: subscription_id:'.$id.'Appid:'.$appid.' 添加订阅号粉丝同步任务');
- $this->success('同步任务添加成功');
- }else{
- $this->error('参数错误');
- }
- }
- public function detail(){
- if($this->request->has('ids')){
- $id = $this->request->param('ids');
- $this->assign('sync',model('SubscriptionSync')->where('subscription_id',$id)->find());
- return $this->view->fetch();
- }else{
- $this->error('参数错误');
- }
- }
- public function del($ids = null){
- if(is_numeric($ids) && $ids){
- //检测VIP OR 渠道
- if($this->group == Auth::GROUP_ID_VIP_OPERATION){
- $admin_id = $this->auth->vip_id;
- }else{
- $admin_id = $this->auth->id;
- }
- $this->model->where(['subscription_id'=>$ids,'admin_id'=>$admin_id])->delete();
- $this->success('操作成功');
- }else{
- $this->error('参数错误');
- }
- }
- /**
- * 同步渠道订阅号
- */
- public function sync(){
- //检测VIP OR 渠道
- if($this->group == Auth::GROUP_ID_VIP_OPERATION){
- $admin_id = $this->auth->vip_id;
- }else{
- $admin_id = $this->auth->id;
- }
- //获取用户订阅号相关信息
- $sub_num = model('SubscriptionRelation')->where(['admin_id'=>$admin_id])->count();
- $sys_is_auth = model('AdminConfig')->where('admin_id',$admin_id)->value('is_subscription');
- $sys_auth_num = model('AdminConfig')->where('admin_id',$admin_id)->value('subscription_num');
- if($this->request->isAjax()){
- $err_ids = [];
- if(!$sub_ids = $this->request->param('ids/a')){
- $this->error('请选择要同步的订阅号');
- }
- if(count($sub_ids) > Config::get('site.sync_sub_max')){
- $this->error('单次同步超过指定数量'.Config::get('site.sync_sub_max'));
- }
- if((count($sub_ids) + $sub_num) > $sys_auth_num){
- $this->error('订阅号数量超过系统限定数量');
- }
- $sub_list = model('Subscription')->where('status','normal')->column('id');
- foreach($sub_ids as $sub_id){
- if(in_array($sub_id,$sub_list)){
- if(!model('Subscription_relation')->insert(['admin_id'=>$admin_id,'subscription_id'=>$sub_id,'createtime'=>time(),'updatetime'=>time()])){
- array_push($err_ids,$sub_id);
- }
- }else{
- array_push($err_ids,$sub_id);
- }
- }
- if(count($err_ids) == 0){
- $this->success('绑定成功');
- }else{
- $list = model('Subscription')->whereIn('id',implode(',',$err_ids))->column('name');
- $this->error(implode(',',$list).'绑定失败');
- }
- }else{
- if($sys_is_auth && $sub_num < $sys_auth_num){
- $is_auth = true;
- }else{
- $is_auth = false;
- }
- //获取订阅号列表
- $channel_ids = model('VipAdminBind')->where(['admin_id_master'=>$admin_id])->column('admin_id_slave');
- $subscription_ids = model('SubscriptionRelation')->whereIn('admin_id',implode(',',$channel_ids))->column('subscription_id');
- $subscription_ids = array_unique($subscription_ids);
- $vip_sub_ids = model('SubscriptionRelation')->where('admin_id',$admin_id)->column('subscription_id');
- $sub_list = model('Subscription')->where('status','normal')->whereIn('id',implode(',',array_diff($subscription_ids,$vip_sub_ids)))->select();
- $this->assign('sub_list',$sub_list);
- $this->assign('sub_is_auth',$is_auth);
- $this->assign('sub_auth_num',$sub_num);
- $this->assign('sys_auth_num',$sys_auth_num);
- $this->assignconfig('sub_is_auth',$is_auth);
- return $this->view->fetch();
- }
- }
- public function wxcallback(){
- $url = rawurldecode($this->request->get('backurl'));
- $sub_id = $this->request->param('sub_id') ?? null;
- try{
- $wechatAuth = new SubscriptionAuth($this->request->get('platform_id'),$this->request->get('admin_id'));
- $wechatAuth->authorization($this->group,$sub_id);
- }catch (\Exception $e){
- Log::error('Wechat Authorization Platform_id:'.$this->request->get('platform_id').' Admin_id:'.$this->request->get('admin_id').' Error:'.$e->getMessage());
- $this->error($e->getMessage(),$url);
- }
- $this->success('授权成功',$url,'',1);
- }
- public function wxre(){
- $url = base64_decode($this->request->get('url'));
- $sub_id = $this->request->param('ids') ?? null;
- if($sub_id){
- $urlArray = explode('wxcallback%3F',$url);
- $url = $urlArray[0].'wxcallback%3Fsub_id%3D'.$sub_id.'%26'.$urlArray[1];
- }
- $this->assign('url',$url);
- return $this->view->fetch();
- }
- }
|