Subscription.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <?php
  2. namespace app\admin\controller;
  3. use app\common\library\Rabbitmq;
  4. use app\admin\library\Auth;
  5. use app\common\controller\Backend;
  6. use app\common\utility\SubscriptionAuth;
  7. use app\main\service\OpenPlatformService;
  8. use EasyWeChat\Factory;
  9. use think\Config;
  10. use think\Log;
  11. use app\common\library\Redis;
  12. use Symfony\Component\Cache\Simple\RedisCache;
  13. /**
  14. * 订阅号管理
  15. *
  16. * @icon fa fa-circle-o
  17. */
  18. class Subscription extends Backend
  19. {
  20. const MQ_EXCHANGE_SYNC = 'E_SYNC_SUBSCRIPTION_TASK';
  21. const MQ_QUEUE_SUBSCRIPTION_TASK = 'Q_SYNC_SUBSCRIPTION_TASK';
  22. /**
  23. * SmartRecommand模型对象
  24. */
  25. protected $model = null;
  26. /**
  27. * 快速搜索时执行查找的字段
  28. */
  29. protected $searchFields = 'sub.id';
  30. protected $noNeedLogin = ['wxre','wxcallback'];
  31. public function _initialize()
  32. {
  33. parent::_initialize();
  34. $this->model = model('SubscriptionRelation');
  35. }
  36. public function index(){
  37. if($this->request->isAjax()){
  38. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  39. //检测VIP OR 渠道
  40. if($this->group == Auth::GROUP_ID_VIP_OPERATION){
  41. $admin_id = $this->auth->vip_id;
  42. }else{
  43. $admin_id = $this->auth->id;
  44. }
  45. $total = $this->model
  46. ->join('Subscription sub','sub.id = subscription_relation.subscription_id','left')
  47. ->join('Subscription_token token','token.subscription_id = sub.id','left')
  48. ->field('subscription_relation.admin_id,sub.id,sub.name,sub.json,token.updatetime,sub.status')
  49. ->where('admin_id',$admin_id)
  50. ->where($where)
  51. ->count();
  52. $list = $this->model
  53. ->join('Subscription sub','sub.id = subscription_relation.subscription_id','left')
  54. ->join('Subscription_token token','token.subscription_id = sub.id','left')
  55. ->field('subscription_relation.admin_id,sub.id,sub.name,sub.json,token.updatetime,sub.status')
  56. ->where('admin_id',$admin_id)
  57. ->where($where)
  58. ->order($sort, $order)
  59. ->limit($offset, $limit)
  60. ->select();
  61. return json(array("total" => $total, "rows" => $list));
  62. }else{
  63. //检测VIP OR 渠道
  64. if($this->group == Auth::GROUP_ID_VIP_OPERATION){
  65. $admin_id = $this->auth->vip_id;
  66. }else{
  67. $admin_id = $this->auth->id;
  68. }
  69. //获取对应用户默认平台信息
  70. $adminConfig = model('AdminConfig')->where('admin_id',$admin_id)->find();
  71. if(!$platform = model('platform')->whereIn('id',$adminConfig['platform_id'])->where(['status'=>'1'])->find()){
  72. $this->error("没有平台信息");
  73. }
  74. if(!$adminConfig['is_subscription']){
  75. $this->error('没有开通订阅号权限,如需开通请联系商务');
  76. }
  77. //获取微信授权地址
  78. $wechat = config('wechat');
  79. $wechat['app_id'] = $platform['appid'];
  80. $wechat['secret'] = $platform['secret'];
  81. $wechat['token'] = $platform['token'];
  82. $wechat['aes_key'] = $platform['aes_key'];
  83. if ($proxy = OpenPlatformService::instance()->getProxy($platform['id'])) {
  84. $wechat['http'] = array_merge(Config::get('wechat.http'), ['proxy' => $proxy]);
  85. }
  86. $openPlatform = Factory::openPlatform($wechat);
  87. $openPlatform['cache'] = new RedisCache(Redis::instanceCache());
  88. $params = [ //跳转参数
  89. 'platform_id' => $platform['id'],
  90. 'admin_id' => $admin_id,
  91. 'backurl' => $this->request->scheme() . '://' . get_host_no_port() . '/admin/subscription/index'
  92. ];
  93. $url = $openPlatform->getPreAuthorizationUrl(\think\Config::get('site.scheme').'://'.$platform['authhost'].'/admin/subscription/wxcallback?'.http_build_query($params));
  94. $platform['url'] = \think\Config::get('site.scheme').'://'.$platform['authhost'].'/admin/subscription/wxre?url='.base64_encode($url);
  95. //获取授权订阅号资格
  96. $sys_is_auth = model('AdminConfig')->where('admin_id',$admin_id)->value('is_subscription');
  97. $sys_auth_num = model('AdminConfig')->where('admin_id',$admin_id)->value('subscription_num');
  98. $sub_num = model('SubscriptionRelation')->where(['admin_id'=>$admin_id])->count();
  99. if($sys_is_auth && $sub_num < $sys_auth_num){
  100. $is_auth = true;
  101. }else{
  102. $is_auth = false;
  103. }
  104. //检查VIP
  105. if($this->group == Auth::GROUP_ID_VIP || $this->group == Auth::GROUP_ID_VIP_OPERATION){
  106. $is_vip = true;
  107. }else{
  108. $is_vip = false;
  109. }
  110. $this->assign('is_vip',$is_vip);
  111. $this->assign('platform',$platform);
  112. $this->assign('sub_is_auth',$is_auth);
  113. $this->assign('sys_auth_num',$sys_auth_num);
  114. $this->assignconfig('sub_is_auth',$is_auth);
  115. $this->assignconfig('auth_url',$platform['url']);
  116. return $this->view->fetch();
  117. }
  118. }
  119. public function manager(){
  120. if($this->request->isAjax()){
  121. $this->searchFields = 'id';
  122. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  123. $total = model('Subscription')
  124. ->where($where)
  125. ->order($sort, $order)
  126. ->limit($offset, $limit)
  127. ->count();
  128. $list = model('Subscription')
  129. ->where($where)
  130. ->order($sort, $order)
  131. ->limit($offset, $limit)
  132. ->select();
  133. return json(array("total" => $total, "rows" => $list));
  134. }else{
  135. return $this->view->fetch();
  136. }
  137. }
  138. public function fans(){
  139. if($this->request->has('ids')){
  140. $id = $this->request->param('ids');
  141. $appid = model('Subscription')->where('id',$id)->value('appid');
  142. $mq = new Rabbitmq();
  143. $mq->send(['subscription_id'=>$id,'appid'=>$appid],self::MQ_QUEUE_SUBSCRIPTION_TASK,self::MQ_EXCHANGE_SYNC);
  144. Log::info('syncSubscription->Queue: subscription_id:'.$id.'Appid:'.$appid.' 添加订阅号粉丝同步任务');
  145. $this->success('同步任务添加成功');
  146. }else{
  147. $this->error('参数错误');
  148. }
  149. }
  150. public function detail(){
  151. if($this->request->has('ids')){
  152. $id = $this->request->param('ids');
  153. $this->assign('sync',model('SubscriptionSync')->where('subscription_id',$id)->find());
  154. return $this->view->fetch();
  155. }else{
  156. $this->error('参数错误');
  157. }
  158. }
  159. public function del($ids = null){
  160. if(is_numeric($ids) && $ids){
  161. //检测VIP OR 渠道
  162. if($this->group == Auth::GROUP_ID_VIP_OPERATION){
  163. $admin_id = $this->auth->vip_id;
  164. }else{
  165. $admin_id = $this->auth->id;
  166. }
  167. $this->model->where(['subscription_id'=>$ids,'admin_id'=>$admin_id])->delete();
  168. $this->success('操作成功');
  169. }else{
  170. $this->error('参数错误');
  171. }
  172. }
  173. /**
  174. * 同步渠道订阅号
  175. */
  176. public function sync(){
  177. //检测VIP OR 渠道
  178. if($this->group == Auth::GROUP_ID_VIP_OPERATION){
  179. $admin_id = $this->auth->vip_id;
  180. }else{
  181. $admin_id = $this->auth->id;
  182. }
  183. //获取用户订阅号相关信息
  184. $sub_num = model('SubscriptionRelation')->where(['admin_id'=>$admin_id])->count();
  185. $sys_is_auth = model('AdminConfig')->where('admin_id',$admin_id)->value('is_subscription');
  186. $sys_auth_num = model('AdminConfig')->where('admin_id',$admin_id)->value('subscription_num');
  187. if($this->request->isAjax()){
  188. $err_ids = [];
  189. if(!$sub_ids = $this->request->param('ids/a')){
  190. $this->error('请选择要同步的订阅号');
  191. }
  192. if(count($sub_ids) > Config::get('site.sync_sub_max')){
  193. $this->error('单次同步超过指定数量'.Config::get('site.sync_sub_max'));
  194. }
  195. if((count($sub_ids) + $sub_num) > $sys_auth_num){
  196. $this->error('订阅号数量超过系统限定数量');
  197. }
  198. $sub_list = model('Subscription')->where('status','normal')->column('id');
  199. foreach($sub_ids as $sub_id){
  200. if(in_array($sub_id,$sub_list)){
  201. if(!model('Subscription_relation')->insert(['admin_id'=>$admin_id,'subscription_id'=>$sub_id,'createtime'=>time(),'updatetime'=>time()])){
  202. array_push($err_ids,$sub_id);
  203. }
  204. }else{
  205. array_push($err_ids,$sub_id);
  206. }
  207. }
  208. if(count($err_ids) == 0){
  209. $this->success('绑定成功');
  210. }else{
  211. $list = model('Subscription')->whereIn('id',implode(',',$err_ids))->column('name');
  212. $this->error(implode(',',$list).'绑定失败');
  213. }
  214. }else{
  215. if($sys_is_auth && $sub_num < $sys_auth_num){
  216. $is_auth = true;
  217. }else{
  218. $is_auth = false;
  219. }
  220. //获取订阅号列表
  221. $channel_ids = model('VipAdminBind')->where(['admin_id_master'=>$admin_id])->column('admin_id_slave');
  222. $subscription_ids = model('SubscriptionRelation')->whereIn('admin_id',implode(',',$channel_ids))->column('subscription_id');
  223. $subscription_ids = array_unique($subscription_ids);
  224. $vip_sub_ids = model('SubscriptionRelation')->where('admin_id',$admin_id)->column('subscription_id');
  225. $sub_list = model('Subscription')->where('status','normal')->whereIn('id',implode(',',array_diff($subscription_ids,$vip_sub_ids)))->select();
  226. $this->assign('sub_list',$sub_list);
  227. $this->assign('sub_is_auth',$is_auth);
  228. $this->assign('sub_auth_num',$sub_num);
  229. $this->assign('sys_auth_num',$sys_auth_num);
  230. $this->assignconfig('sub_is_auth',$is_auth);
  231. return $this->view->fetch();
  232. }
  233. }
  234. public function wxcallback(){
  235. $url = rawurldecode($this->request->get('backurl'));
  236. $sub_id = $this->request->param('sub_id') ?? null;
  237. try{
  238. $wechatAuth = new SubscriptionAuth($this->request->get('platform_id'),$this->request->get('admin_id'));
  239. $wechatAuth->authorization($this->group,$sub_id);
  240. }catch (\Exception $e){
  241. Log::error('Wechat Authorization Platform_id:'.$this->request->get('platform_id').' Admin_id:'.$this->request->get('admin_id').' Error:'.$e->getMessage());
  242. $this->error($e->getMessage(),$url);
  243. }
  244. $this->success('授权成功',$url,'',1);
  245. }
  246. public function wxre(){
  247. $url = base64_decode($this->request->get('url'));
  248. $sub_id = $this->request->param('ids') ?? null;
  249. if($sub_id){
  250. $urlArray = explode('wxcallback%3F',$url);
  251. $url = $urlArray[0].'wxcallback%3Fsub_id%3D'.$sub_id.'%26'.$urlArray[1];
  252. }
  253. $this->assign('url',$url);
  254. return $this->view->fetch();
  255. }
  256. }