CoflController.php 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. <?php
  2. namespace App\Http\Controllers\Wap\User;
  3. use App\Modules\Activity\Services\ActivityService;
  4. use App\Modules\Book\Services\BookConfigService;
  5. use App\Modules\Channel\Models\Channel;
  6. use App\Modules\Subscribe\Models\BookOrder;
  7. use App\Modules\Subscribe\Models\YearOrder;
  8. use App\Modules\Subscribe\Services\YearOrderService;
  9. use App\Modules\User\Models\User;
  10. use App\Modules\User\Services\ReadRecordService;
  11. use App\Modules\User\Services\UserBindHkWelfareService;
  12. use App\Modules\User\Services\UserService;
  13. use Illuminate\Http\Request;
  14. use App\Http\Controllers\Controller;
  15. use Hashids;
  16. use EasyWeChat\Foundation\Application;
  17. use Log;
  18. use Exception;
  19. use Redis;
  20. use Cookie;
  21. use DB;
  22. /**
  23. * 朋友圈链接
  24. * Class CoflController
  25. * @package App\Http\Controllers\Wap\User
  26. */
  27. class CoflController extends Controller
  28. {
  29. public function index(Request $request){
  30. $bid = $request->get('bid');
  31. if(empty($bid)){
  32. $default_ink = $this->getLink();
  33. return redirect()->to($default_ink);
  34. }
  35. $openid = $request->get('openid');
  36. //授权
  37. $params = $request->except('_url');
  38. if(empty($openid)){
  39. //$url = str_replace('http://', env('PROTOCOL') . '://', url()->current() . '?' . http_build_query($params));
  40. $url = url()->current() . '?' . http_build_query($params);
  41. $params['redirect_url'] = urlencode($url);
  42. $app = new Application($this->auth($params));
  43. return $app->oauth->redirect();
  44. }
  45. try{
  46. if(is_numeric($bid) && $bid == 6500 ){
  47. $params['bid'] = Hashids::encode($bid);
  48. }else{
  49. $bid = Hashids::decode($bid)[0];
  50. }
  51. }catch (Exception $e){
  52. return redirect()->to($this->getLink());
  53. }
  54. $crm = $request->get('crm','book_'.$bid);
  55. if(!$bid) return redirect()->to($this->getLink());
  56. //获取用户
  57. //$user = $this->getUsers($openid);
  58. $test_param = $request->input('test',0);
  59. //if($test_param ==1 || $test_param =='1' ) {
  60. $user = $this->getUsersV2($openid);
  61. //}
  62. if(!$user[0]){
  63. $user[1] = 123;
  64. }
  65. //有阅读纪录的跳转
  66. $read_record = ReadRecordService::getByField($user[0],$bid);
  67. if($read_record){
  68. $cid = explode('_',$read_record)[0];
  69. }else{
  70. //没有阅读记录的跳转
  71. $book_info = BookConfigService::getBookById($bid);
  72. $cid = $book_info->first_cid;
  73. }
  74. $params['cid'] = $cid;
  75. $params['crm'] ='book_'.$bid;
  76. if(isset($params['openid'])) unset($params['openid']);
  77. if(isset($params['unionid'])) unset($params['unionid']);
  78. $url = $this->getLink($user[1]).'reader?'.http_build_query($params);
  79. $this->stats('book',$crm);
  80. $this->statsDetail($user[0],'book',$bid);
  81. return redirect()->to($url);
  82. }
  83. public function freeCurrencyView(Request $request){
  84. $openid = $request->get('openid');
  85. //授权
  86. $params = $request->except('_url');
  87. if(empty($openid)){
  88. //$url = str_replace('http://', env('PROTOCOL') . '://', url()->current() . '?' . http_build_query($params));
  89. $url = url()->current() . '?' . http_build_query($params);
  90. $params['redirect_url'] = urlencode($url);
  91. $app = new Application($this->auth($params));
  92. return $app->oauth->redirect();
  93. }
  94. $uri = $request->path();
  95. $token = $request->get('token');
  96. $rfee = $request->get('amount');
  97. $crm = $request->get('crm','reward');
  98. $source = $request->get('wx','none');
  99. $type = 'CRM';
  100. if($uri == 'freethrhcurrency'){
  101. //$fee = 300;
  102. $fee = 500;
  103. $this->stats('reward_300',$crm);
  104. }elseif($uri == 'wfreecurrency'){
  105. $fee = 200;
  106. $type = 'WCRM';
  107. }elseif ($uri == 'frocefreethrhcurrency'){
  108. //$fee = 200;
  109. $fee = 500;
  110. $type = 'CRM_FORCE';
  111. }
  112. else{
  113. $this->stats('reward_200',$crm);
  114. $fee = $this->freeCurrencyFee($token,$rfee);
  115. }
  116. //$user = $this->getUsers($openid);
  117. $user = $this->getUsersV2($openid);
  118. if(!$user || !$user[0] || !$user[1]) return redirect()->to($this->getLink().'?'.http_build_query($params));
  119. if($type == 'CRM'){
  120. $this->statsDetail($user[0],'reward',0);
  121. }elseif ($type == 'CRM_FORCE'){
  122. $this->statsDetail($user[0],'forcereward',0);
  123. } else{
  124. $this->statsDetail($user[0],'wreward',0);
  125. }
  126. $get_free_currency = UserBindHkWelfareService::isHasGet($user[0]);
  127. if($get_free_currency){
  128. //已经领过
  129. if(isset($user[2]) && !empty($user[2]) && isset($user[3]) && !empty($user[3])){
  130. $bid = Hashids::encode($user[2]);
  131. $cid = $user[3];
  132. $params['bid'] = $bid;
  133. $params['cid'] = $cid;
  134. $link = $this->getLink($get_free_currency->distribution_channel_id).'reader?'.http_build_query($params);
  135. }else{
  136. $link = $this->getLink($get_free_currency->distribution_channel_id).'recent?'.http_build_query($params);
  137. }
  138. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>1,'uid'=>$get_free_currency->uid,'source'=>$source]);
  139. }else{
  140. if(isset($user[2]) && !empty($user[2]) && isset($user[3]) && !empty($user[3])){
  141. $bid = Hashids::encode($user[2]);
  142. $cid = $user[3];
  143. $params['bid'] = $bid;
  144. $params['cid'] = $cid;
  145. $link = $this->getLink($user[1]).'reader?'.http_build_query($params);
  146. }else{
  147. $link = $this->getLink($user[1]).'recent?'.http_build_query($params);
  148. }
  149. $this->getReward($user[0],$fee,$source,$type);
  150. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>0,'uid'=>$user[0],'source'=>$source]);
  151. }
  152. }
  153. public function freeCurrencyViewOther(Request $request){
  154. $openid = $request->get('openid');
  155. //授权
  156. $params = $request->except('_url');
  157. if(empty($openid)){
  158. $url = url()->current() . '?' . http_build_query($params);
  159. $params['redirect_url'] = urlencode($url);
  160. $app = new Application($this->auth($params));
  161. return $app->oauth->redirect();
  162. }
  163. $token = $request->get('token');
  164. $fee = 0;
  165. if($token){
  166. $info = DB::table('crm_free_currency_token')->where('token',$token)->where('is_enable',1)->first();
  167. if($info) $fee = $info->amount;
  168. }
  169. $user = $this->getUsersV2($openid);
  170. if(!$user || !$user[0] || !$user[1] || !$fee) return redirect()->to($this->getLink().'?'.http_build_query($params));
  171. $crm = 'new_reward';
  172. $source = $request->get('wx','none');
  173. $type = 'NCRM_'.$fee;
  174. $this->stats($crm.'_'.$fee,$crm);
  175. $this->statsDetail($user[0],'new_reward_'.$fee,0);
  176. $get_free_currency = UserBindHkWelfareService::isHasGet($user[0]);
  177. if($get_free_currency){
  178. //已经领过
  179. $link = $this->getLink($get_free_currency->distribution_channel_id).'recent?'.http_build_query($params);
  180. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>1,'uid'=>$get_free_currency->uid,'source'=>$source]);
  181. }else{
  182. $link = $this->getLink($user[1]).'recent?'.http_build_query($params);
  183. $this->getReward($user[0],$fee,$source,$type);
  184. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>0,'uid'=>$user[0],'source'=>$source]);
  185. }
  186. }
  187. private function freeCurrencyFee($token,$fee){
  188. if(!$token || !$fee) return 200;
  189. $param['fee'] = $fee;
  190. if( _sign($param,env('SECRET_KEY')) == $token) return $fee;
  191. return 200;
  192. }
  193. public function freeCurrencyPost(Request $request){
  194. $uid = $request->post('uid');
  195. $fee = $request->post('fee',200);
  196. $source = $request->post('source','');
  197. $result = UserBindHkWelfareService::getfreeCurrency($uid,$fee,'CRM',$source);
  198. if($result){
  199. UserService::addBalance($uid,$fee,0,$fee);
  200. }
  201. return response()->success(['uid'=>$uid,'result'=>$result]);
  202. }
  203. private function getReward($uid,$fee,$source,$crm='CRM'){
  204. $result = UserBindHkWelfareService::getfreeCurrency($uid,$fee,$crm,$source);
  205. if($result){
  206. UserService::addBalance($uid,$fee,0,$fee);
  207. }
  208. }
  209. public function activity(Request $request){
  210. $token = $request->get('token');
  211. if(empty($token)){
  212. $default_ink = $this->getLink();
  213. return redirect()->to($default_ink);
  214. }
  215. $openid = $request->get('openid');
  216. //授权
  217. $params = $request->except('_url');
  218. if(empty($openid)){
  219. $url = url()->current() . '?' . http_build_query($params);
  220. $params['redirect_url'] = urlencode($url);
  221. $app = new Application($this->auth($params));
  222. return $app->oauth->redirect();
  223. }
  224. $crm = $request->get('crm');
  225. $this->stats('activity',$crm);
  226. $activity = ActivityService::getByToken($token);
  227. if($activity){
  228. $user = $this->getUsersV2($openid);
  229. $distribution_channel_id = (isset($user[1]) && !empty($user[1]))?$user[1]:123;
  230. $url_format = '%s://site%s.%s.com%s';
  231. $activity_page = $activity->activity_page ;
  232. if($activity->id == 6000){
  233. $activity_page = '/activity/common?token=LNyAqbFMgvkmvnHP8PXV3DYPIIhQm3oe';
  234. }
  235. $url = sprintf($url_format, env('PROTOCOL'), encodeDistributionChannelId($distribution_channel_id),
  236. env('CUSTOM_HOST'),
  237. $activity_page
  238. );
  239. return redirect()->to($url);
  240. }
  241. $default_ink = $this->getLink();
  242. return redirect()->to($default_ink);
  243. }
  244. public function indexRoot(Request $request){
  245. $openid = $request->get('openid');
  246. //授权
  247. $params = $request->except('_url');
  248. if(empty($openid)){
  249. $url = url()->current() . '?' . http_build_query($params);
  250. $params['redirect_url'] = urlencode($url);
  251. $app = new Application($this->auth($params));
  252. return $app->oauth->redirect();
  253. }
  254. list($uid,$distribution_channel_id) = $this->getUsersV2($openid);
  255. $link = $this->getLink($distribution_channel_id);
  256. $crm = $request->get('crm','index');
  257. $params['crm'] = $crm;
  258. $link = $link.'?'.http_build_query($params);
  259. $this->stats('index',$crm);
  260. $this->statsDetail($uid,'index',0);
  261. return redirect()->to($link);
  262. }
  263. public function recent(Request $request){
  264. $openid = $request->get('openid');
  265. //授权
  266. $params = $request->except('_url');
  267. if(empty($openid)){
  268. $url = url()->current() . '?' . http_build_query($params);
  269. $params['redirect_url'] = urlencode($url);
  270. $app = new Application($this->auth($params));
  271. return $app->oauth->redirect();
  272. }
  273. $user = $this->getUsersV2($openid);
  274. if(!$user[0]){
  275. $distribution_channel_id = 123;
  276. }else{
  277. $distribution_channel_id = $user[1];
  278. }
  279. $crm = $request->get('crm');
  280. $this->stats('recent',$crm);
  281. $this->statsDetail($user[0],'recent',0);
  282. $link = $this->getLink($distribution_channel_id).'recent?'.http_build_query($params);
  283. return redirect()->to($link);
  284. }
  285. public function person(Request $request){
  286. $openid = $request->get('openid');
  287. //授权
  288. $params = $request->except('_url');
  289. if(empty($openid)){
  290. $url = url()->current() . '?' . http_build_query($params);
  291. $params['redirect_url'] = urlencode($url);
  292. $app = new Application($this->auth($params));
  293. return $app->oauth->redirect();
  294. }
  295. $user = $this->getUsersV2($openid);
  296. if(!$user[0]){
  297. $distribution_channel_id = 123;
  298. }else{
  299. $distribution_channel_id = $user[1];
  300. }
  301. $crm = $request->get('crm');
  302. $this->stats('person',$crm);
  303. $this->statsDetail($user[0],'person',0);
  304. $link = $this->getLink($distribution_channel_id).'person?'.http_build_query($params);
  305. return redirect()->to($link);
  306. }
  307. public function sign(Request $request){
  308. $openid = $request->get('openid');
  309. //授权
  310. $params = $request->except('_url');
  311. if(empty($openid)){
  312. $url = url()->current() . '?' . http_build_query($params);
  313. $params['redirect_url'] = urlencode($url);
  314. $app = new Application($this->auth($params));
  315. return $app->oauth->redirect();
  316. }
  317. $user = $this->getUsersV2($openid);
  318. if(!$user[0]){
  319. $distribution_channel_id = 123;
  320. }else{
  321. $distribution_channel_id = $user[1];
  322. }
  323. $crm = $request->get('crm');
  324. $uri = $request->path();
  325. if($uri == 'sign'){
  326. $this->stats('sign',$crm);
  327. $this->statsDetail($user[0],'sign',0);
  328. }elseif($uri == 'wsign'){
  329. $this->stats('wsign',$crm);
  330. $this->statsDetail($user[0],'wsign',0);
  331. }
  332. $link = $this->getLink($distribution_channel_id).'sign?'.http_build_query($params);
  333. return redirect()->to($link);
  334. }
  335. private function getUsers($openid){
  336. $users = User::where('openid',$openid)->select('id','distribution_channel_id')->get();
  337. if($users->isEmpty()) return [0,0,0,0];
  338. $temp = null;
  339. $distribution_channel_id = 0;
  340. $uid = 0;
  341. $bid = 0;
  342. $cid = 0;
  343. foreach ($users as $user){
  344. $last_read = ReadRecordService::getByField($user->id,'last_read');
  345. if(!$last_read) continue;
  346. if(!$temp ){
  347. $distribution_channel_id = $user->distribution_channel_id;
  348. $uid = $user->id;
  349. $temp = $last_read;
  350. }else{
  351. $temp_last_read_info = explode('_',$temp);
  352. $last_read_info = explode('_',$last_read);
  353. if($last_read_info[2] > $temp_last_read_info[2]){
  354. $uid = $user->id;
  355. $distribution_channel_id = $user->distribution_channel_id;
  356. $temp = $last_read;
  357. $bid = $last_read_info[0];
  358. $cid = $last_read_info[1];
  359. }
  360. }
  361. }
  362. return [$uid,$distribution_channel_id,$bid,$cid];
  363. }
  364. /**
  365. * @param $openid
  366. * @return array
  367. */
  368. private function getUsersV2($openid){
  369. $friend_link_uid_bind = DB::table('friend_link_uid_bind')->where('openid',$openid)->orderBy('id','desc')->first();
  370. if($friend_link_uid_bind) {
  371. $user = User::where('id',$friend_link_uid_bind->uid)->select('id','distribution_channel_id')->first();
  372. if($user) {
  373. return [$user->id,$user->distribution_channel_id];
  374. }
  375. }
  376. //外部渠道导粉
  377. if(Redis::hget('crm:out_guide_exposure_user',$openid)){
  378. Log::info('------------getUsersV2-outer---start--------------------------------');
  379. Log::info('getUsersV2 $openid is:'.$openid);
  380. $user = $this->createUser($openid,$openid,5204,0,'');
  381. Log::info('$user = $this->createUser($openid,$openid,5204,0):');
  382. Log::info($user);
  383. $uid = $user->id;
  384. $distribution_channel_id = 5204;
  385. $ouid = Redis::hget('crm:out_guide_exposure_user',$openid);
  386. Log::info('$ouid is :'.$ouid);
  387. UserService::transfer($ouid,$uid,5204);
  388. $insert_data = ['uid'=>$uid,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  389. DB::table('friend_link_uid_bind')->insert($insert_data);
  390. Redis::hdel('crm:out_guide_exposure_user',$openid);
  391. Log::info([$uid,$distribution_channel_id]);
  392. Log::info('------------getUsersV2-outer---end--------------------------------');
  393. return [$uid,$distribution_channel_id];
  394. }
  395. $inner_channels = Channel::join('channel_users','channel_users.id','=','distribution_channels.channel_user_id')
  396. ->select('distribution_channels.id')
  397. ->whereIn('channel_users.id',explode(',',redisEnv('PROMOTION_GROUP_CHANNEL_USER_ID')))
  398. ->get()
  399. ->pluck('id')
  400. ->toArray();
  401. //\Log::info($inner_channels);
  402. $users = User::where('openid',$openid)->select('id','distribution_channel_id')->get();
  403. \Log::info('users:openid:'.$openid);
  404. if($users->isEmpty()) return [0,0];
  405. $temp = null;
  406. $distribution_channel_id = 0;
  407. $uid = 0;
  408. $inner_channel_uid_list = [];
  409. //先筛网站运营部UID
  410. foreach ($users as $user){
  411. if(in_array($user->distribution_channel_id,$inner_channels)) {
  412. $inner_channel_uid_list[] = $user;
  413. }
  414. }
  415. if(count($inner_channel_uid_list) == 1) {
  416. $insert_data = ['uid'=>$inner_channel_uid_list[0]->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  417. \Log::info('anchor:count $inner_channel_uid_list =1');
  418. DB::table('friend_link_uid_bind')->insert($insert_data);
  419. return [$inner_channel_uid_list[0]->id,$inner_channel_uid_list[0]->distribution_channel_id];
  420. }
  421. if(count($inner_channel_uid_list)>1) {
  422. //有多个网站运营部UID,针对网站运营部UID进入到下一步筛选
  423. $users = $inner_channel_uid_list;
  424. }
  425. //筛选包年UID
  426. $uid_list = [];
  427. foreach ($users as $item) {
  428. $uid_list[] =$item->id;
  429. }
  430. $year_order = YearOrder::whereIn('uid',$uid_list)->orderBy('end_time','desc')->first();
  431. if($year_order) {
  432. foreach ($users as $item) {
  433. if($item->id == $year_order->uid) {
  434. //筛选包年结束时间最后的UID
  435. $insert_data = ['uid'=>$item->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  436. \Log::info('anchor:year_order');
  437. DB::table('friend_link_uid_bind')->insert($insert_data);
  438. return [$item->id,$item->distribution_channel_id];
  439. }
  440. }
  441. }
  442. //按订阅章节数最多的筛选
  443. $users_select = ['id'=>0,'count'=>0,'user'=>null,'create_time'=>0];
  444. foreach ($users as $each){
  445. $table_prefix = ($each->id)%512;
  446. $chapter_count = DB::connection('chapter_order_mysql')
  447. ->table('chapter_orders'.$table_prefix)
  448. ->where('created_at','>=',date('Y-m-d H:i:s',strtotime('-3 day')))
  449. ->where('uid',$each->id)
  450. //->where('bid',$bid)
  451. ->count('id');
  452. $book_order = BookOrder::where('uid',$each->id)
  453. //->where('bid',$bid)
  454. ->where('created_at','>=',date('Y-m-d H:i:s',strtotime('-3 day')))
  455. ->first();
  456. if($book_order) {
  457. $chapter_count += 30;
  458. }
  459. //$each->chapter_count = $chapter_count;
  460. if($chapter_count>$users_select['count']) {
  461. $users_select['id'] = $each->id;
  462. $users_select['count'] = $chapter_count;
  463. $users_select['user'] = $each;
  464. }
  465. }
  466. if($users_select['id'] >0) {
  467. $insert_data = ['uid'=>$users_select['user']->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  468. \Log::info('anchor:subs_chapter');
  469. DB::table('friend_link_uid_bind')->insert($insert_data);
  470. return [$users_select['user']->id,$users_select['user']->distribution_channel_id];
  471. }
  472. //有订阅记录的
  473. foreach ($users as $value) {
  474. $table_prefix = ($value->id)%512;
  475. $chapter_order = DB::connection('chapter_order_mysql')
  476. ->table('chapter_orders'.$table_prefix)
  477. ->where('uid',$value->id)
  478. //->where('bid',$bid)
  479. ->orderBy('created_at','desc')
  480. ->first();
  481. $book_order = BookOrder::where('uid',$value->id)
  482. //->where('bid',$bid)
  483. ->first();
  484. if($chapter_order ){
  485. if(strtotime($chapter_order->created_at) > $users_select['create_time']) {
  486. $users_select['id'] = $value->id;
  487. $users_select['create_time'] = strtotime($chapter_order->created_at);
  488. $users_select['user'] = $value;
  489. }
  490. }
  491. if($book_order){
  492. if(strtotime($book_order->created_at) > $users_select['create_time']){
  493. $users_select['id']=$value->id;
  494. $users_select['create_time']= strtotime($book_order->created_at);
  495. $users_select['user']= $value;
  496. }
  497. }
  498. }
  499. if($users_select['id'] >0) {
  500. $insert_data = ['uid'=>$users_select['user']->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  501. \Log::info('anchor:subs_');
  502. DB::table('friend_link_uid_bind')->insert($insert_data);
  503. return [$users_select['user']->id,$users_select['user']->distribution_channel_id];
  504. }
  505. if(count($inner_channel_uid_list)>1) {
  506. //有多个网站运营部UID,针对网站运营部UID进入到下一步筛选
  507. $insert_data = ['uid'=>$inner_channel_uid_list[0]->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  508. \Log::info('anchor:count $inner_channel_uid_list >1');
  509. DB::table('friend_link_uid_bind')->insert($insert_data);
  510. return [$inner_channel_uid_list[0]['id'],$inner_channel_uid_list[0]['distribution_channel_id']];
  511. }
  512. \Log::info('anchor:over');
  513. return [0,0];
  514. }
  515. private function getUsersV3($openid){
  516. //5204
  517. //\Log::info($inner_channels);
  518. $users = User::where('openid',$openid)->select('id','distribution_channel_id')->get();
  519. if($users->isEmpty()) return [0,0];
  520. if(count($users) == 1){
  521. return [$users->first()->id,$users->first()->distribution_channel_id];
  522. }
  523. $temp = null;
  524. //筛选包年UID
  525. $uid_list = [];
  526. foreach ($users as $item) {
  527. $uid_list[] =$item->id;
  528. }
  529. $year_order = YearOrder::whereIn('uid',$uid_list)->orderBy('end_time','desc')->first();
  530. if($year_order) {
  531. foreach ($users as $item) {
  532. if($item->id == $year_order->uid) {
  533. //筛选包年结束时间最后的UID
  534. return [$item->id,$item->distribution_channel_id];
  535. }
  536. }
  537. }
  538. //按订阅章节数最多的筛选
  539. $users_select = ['id'=>0,'count'=>0,'user'=>null,'create_time'=>0];
  540. foreach ($users as $each){
  541. $table_prefix = ($each->id)%512;
  542. $chapter_count = DB::connection('chapter_order_mysql')
  543. ->table('chapter_orders'.$table_prefix)
  544. ->where('created_at','>=',date('Y-m-d H:i:s',strtotime('-3 day')))
  545. ->where('uid',$each->id)
  546. //->where('bid',$bid)
  547. ->count('id');
  548. $book_order = BookOrder::where('uid',$each->id)
  549. //->where('bid',$bid)
  550. ->where('created_at','>=',date('Y-m-d H:i:s',strtotime('-3 day')))
  551. ->first();
  552. if($book_order) {
  553. $chapter_count += 30;
  554. }
  555. //$each->chapter_count = $chapter_count;
  556. if($chapter_count>$users_select['count']) {
  557. $users_select['id'] = $each->id;
  558. $users_select['count'] = $chapter_count;
  559. $users_select['user'] = $each;
  560. }
  561. }
  562. if($users_select['id'] >0) {
  563. $insert_data = ['uid'=>$users_select['user']->id,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  564. return [$users_select['user']->id,$users_select['user']->distribution_channel_id];
  565. }
  566. //有订阅记录的
  567. foreach ($users as $value) {
  568. $table_prefix = ($value->id)%512;
  569. $chapter_order = DB::connection('chapter_order_mysql')
  570. ->table('chapter_orders'.$table_prefix)
  571. ->where('uid',$value->id)
  572. //->where('bid',$bid)
  573. ->orderBy('created_at','desc')
  574. ->first();
  575. $book_order = BookOrder::where('uid',$value->id)
  576. //->where('bid',$bid)
  577. ->first();
  578. if($chapter_order ){
  579. if(strtotime($chapter_order->created_at) > $users_select['create_time']) {
  580. $users_select['id'] = $value->id;
  581. $users_select['create_time'] = strtotime($chapter_order->created_at);
  582. $users_select['user'] = $value;
  583. }
  584. }
  585. if($book_order){
  586. if(strtotime($book_order->created_at) > $users_select['create_time']){
  587. $users_select['id']=$value->id;
  588. $users_select['create_time']= strtotime($book_order->created_at);
  589. $users_select['user']= $value;
  590. }
  591. }
  592. }
  593. if($users_select['id'] >0) {
  594. return [$users_select['user']->id,$users_select['user']->distribution_channel_id];
  595. }
  596. return [0,0];
  597. }
  598. private function getLink($distribution_channel_id=123){
  599. $url_format = '%s://site%s.%s.com/';
  600. return sprintf(
  601. $url_format,
  602. env('PROTOCOL'),
  603. encodeDistributionChannelId($distribution_channel_id),
  604. env('CUSTOM_HOST')
  605. );
  606. }
  607. private function auth($param){
  608. $param['appid'] = 'wx9d389a73b88bbeae';
  609. $options = [
  610. 'app_id' => 'wx9d389a73b88bbeae',
  611. 'secret' => '2f6594bb595dfa256b5512e43a32a3d3',
  612. 'oauth' => [
  613. 'scopes' => ['snsapi_base'],
  614. 'callback' => env('AUTH_CALLBACK_URL') . '?' . http_build_query($param),
  615. ],
  616. ];
  617. return $options;
  618. }
  619. private function stats($page,$flag){
  620. if(!$page || !$flag) return ;
  621. $flag = trim($flag);
  622. //pv
  623. $day = date('Y-m-d');
  624. $pv_key = sprintf('crm:pv:%s',$flag);
  625. Redis::hincrby($pv_key, $day, 1);
  626. //Redis::hincrby($pv_key, 'total', 1);
  627. Redis::sadd('crm_'.$day,$flag);
  628. //uv
  629. $cookie_flag = Cookie::get('crm_flag');
  630. if(!$cookie_flag || $cookie_flag != $flag){
  631. $uv_key = sprintf('crm:uv:%s',$flag);
  632. Redis::hincrby($uv_key, $day, 1);
  633. //Redis::hincrby($uv_key, 'total', 1);
  634. }
  635. Cookie::queue('crm_flag', $flag, env('U_COOKIE_EXPIRE'), null, null, false, false);
  636. }
  637. private function statsDetail($uid,$page,$bid=0)
  638. {
  639. try{
  640. DB::table('crm_visit_detail')->insert([
  641. 'uid'=>$uid,'page'=>$page,
  642. 'bid'=>$bid,'day'=>date('Y-m-d'),
  643. 'created_at'=>date('Y-m-d H:i:s'),
  644. 'updated_at'=>date('Y-m-d H:i:s')
  645. ]);
  646. }catch (\Exception $e){}
  647. }
  648. public function longActivity(Request $request)
  649. {
  650. $openid = $request->get('openid');
  651. //授权
  652. $params = $request->except('_url');
  653. if(empty($openid)){
  654. $url = url()->current() . '?' . http_build_query($params);
  655. $params['redirect_url'] = urlencode($url);
  656. $app = new Application($this->auth($params));
  657. return $app->oauth->redirect();
  658. }
  659. $user = $this->getUsersV2($openid);
  660. if(!$user[0]){
  661. $distribution_channel_id = 123;
  662. }else{
  663. $distribution_channel_id = $user[1];
  664. }
  665. $crm = $request->get('crm');
  666. $this->stats('activity',$crm);
  667. $baselink = $this->getLink($distribution_channel_id).'activity/crm?'.http_build_query($params);
  668. if(isset($params['token']) && !empty($params['token'])){
  669. return redirect()->to($baselink.'activity/crm?'.http_build_query($params));
  670. }
  671. return redirect()->to($baselink);
  672. }
  673. public function yearActivity(Request $request)
  674. {
  675. $openid = $request->get('openid');
  676. //授权
  677. $params = $request->except('_url');
  678. if(empty($openid)){
  679. $url = url()->current() . '?' . http_build_query($params);
  680. $params['redirect_url'] = urlencode($url);
  681. $app = new Application($this->auth($params));
  682. return $app->oauth->redirect();
  683. }
  684. $user = $this->getUsersV2($openid);
  685. if(!$user[0]){
  686. $distribution_channel_id = 123;
  687. }else{
  688. $distribution_channel_id = $user[1];
  689. }
  690. $crm = $request->get('crm','crm_year_activity');
  691. $params['crm'] = $crm;
  692. $this->stats('activity',$crm);
  693. $this->statsDetail($user[0],'year_activity',0);
  694. $baselink = $this->getLink($distribution_channel_id).'activity/crmy?'.http_build_query($params);
  695. return redirect()->to($baselink);
  696. }
  697. public function guidePersonal(Request $request){
  698. $openid = $request->get('openid');
  699. //授权
  700. $params = $request->except('_url');
  701. if(empty($openid)){
  702. $url = url()->current() . '?' . http_build_query($params);
  703. $params['redirect_url'] = urlencode($url);
  704. $app = new Application($this->auth($params));
  705. return $app->oauth->redirect();
  706. }
  707. list($uid,$distribution_channel_id) = $this->getUsersV2($openid);
  708. $link = $this->getLink($distribution_channel_id);
  709. $get_info = UserBindHkWelfareService::isHasGet($uid);
  710. if($get_info) redirect()->to($link);
  711. $crm = $request->get('crm','guide_personal');
  712. $params['crm'] = $crm;
  713. $params['uid'] = $uid;
  714. $link = $link.'guidestrem?'.http_build_query($params);
  715. $this->stats('index',$crm);
  716. $this->statsDetail($uid,'guidePersonal',0);
  717. return redirect()->to($link);
  718. }
  719. public function guidePersonalAccount(Request $request,$channel_id){
  720. $uid = $request->get('uid',0);
  721. //$user_cookie = Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
  722. //$uid = $user_cookie ? decrypt($user_cookie) : null;
  723. $cookie_crm_img = Cookie::get('crm_person_img');
  724. $cookie_crm_name = Cookie::get('crm_person_name','');
  725. $request_img = $request->get('img');
  726. $fee = $request->get('fee',200);
  727. if($request_img){
  728. $name = $request_img = $request->get('name');
  729. return view('jump.guidePersonalAccountOurs',['img'=>$cookie_crm_img,'name'=>$name,'fee'=>$fee]);
  730. }
  731. $get_info = UserBindHkWelfareService::isHasGet($uid);
  732. if($get_info) return back();
  733. if($cookie_crm_img){
  734. return view('jump.guidePersonalAccountOurs',['img'=>$cookie_crm_img,'name'=>$cookie_crm_name,'fee'=>$fee]);
  735. }
  736. $distribution_channel_id = decodeDistributionChannelId($channel_id);
  737. //$distribution_channel_id = $channel_id;
  738. //if(in_array($distribution_channel_id,Redis::SISMEMBER('')));
  739. //$out = false;
  740. $group = 'ACTIVE';
  741. if(Redis::SISMEMBER('crm:out_channel_sites',$distribution_channel_id)){
  742. //$out = true;
  743. $group = 'OUT_ACTIVE';
  744. $env_config = redisEnvMulti('OUT_ACTIVE_GUIDE_PERSONAL_ACCOUNT_OURS_QRCODE',
  745. 'OUT_ACTIVE_GUIDE_PERSONAL_ACCOUNT_MAX_UV','OUT_ACTIVE_GUIDE_PERSONAL_ACCOUNT_ID',
  746. 'OUT_ACTIVE_GUIDE_PERSONAL_ACCOUNT_MAX_EVERY_UV');
  747. }else{
  748. $env_config = redisEnvMulti('ACTIVE_GUIDE_PERSONAL_ACCOUNT_OURS_QRCODE',
  749. 'ACTIVE_GUIDE_PERSONAL_ACCOUNT_MAX_UV','ACTIVE_GUIDE_PERSONAL_ACCOUNT_ID',
  750. 'ACTIVE_GUIDE_PERSONAL_ACCOUNT_MAX_EVERY_UV');
  751. }
  752. if(empty($env_config[0])){
  753. return back();
  754. }
  755. //$img = empty($env_config[0])?'https://cdn-novel.iycdm.com/h5/personal_account/chenchen.jpg':$env_config[0];
  756. $img =$env_config[0];
  757. $max = empty($env_config[1])?100:$env_config[1];
  758. $max = (int)$max;
  759. $one_loop_max = empty($env_config[3])?10:$env_config[3];
  760. $now_id = (int)$env_config[2];
  761. if($group == 'OUT_ACTIVE'){
  762. $uv_key = 'out_active_guide_personal_uv';
  763. }else{
  764. $uv_key = 'active_guide_personal_uv';
  765. }
  766. $uv = Redis::scard($uv_key);
  767. $personal_info = DB::table('personal_account_list')->where('id',$now_id)->select('count')->first();
  768. if(!$personal_info){
  769. return back();
  770. }
  771. $total_max = (int)($personal_info->count+$uv);
  772. //Log::info('$total_max is: '.);
  773. if($uv >= $one_loop_max || $total_max>=$max){
  774. if($total_max>=$max){
  775. DB::table('personal_account_list')->where('id',$now_id)->update([
  776. 'status'=>2,
  777. 'count'=>$total_max,
  778. 'updated_at'=>date('Y-m-d H:i:s')
  779. ]);
  780. }else{
  781. DB::table('personal_account_list')->where('id',$now_id)->increment('count',$uv,[
  782. 'updated_at'=>date('Y-m-d H:i:s')
  783. ]);
  784. }
  785. $account = DB::table('personal_account_list')
  786. ->where('is_enable',1)
  787. ->whereIn('status',[1,0])
  788. ->select('id','url')
  789. ->where('group',$group)
  790. ->where('count','<',$max)
  791. ->orderBy('count','asc')
  792. ->orderBy('id')
  793. ->first();
  794. Redis::del($uv_key);
  795. if($account){
  796. DB::table('personal_account_list')->where('id',$account->id)->update([
  797. 'status'=>1,
  798. 'updated_at'=>date('Y-m-d H:i:s')
  799. ]);
  800. $img = $account->url;
  801. $now_id = $account->id;
  802. Redis::Hmset('env',$group.'_GUIDE_PERSONAL_ACCOUNT_OURS_QRCODE',$account->url,$group.'_GUIDE_PERSONAL_ACCOUNT_ID',$account->id);
  803. }else{
  804. Redis::Hmset('env',$group.'_GUIDE_PERSONAL_ACCOUNT_OURS_QRCODE','',$group.'_GUIDE_PERSONAL_ACCOUNT_ID','');
  805. return back();
  806. }
  807. }
  808. Redis::sadd($uv_key,$uid);
  809. if($uid){
  810. if($group == 'OUT_ACTIVE'){
  811. DB::table('ad_pdd')->insert([
  812. 'uid'=>$uid,
  813. 'img'=>'OUT_GUIDE_PERSONAL_ACCOUNT_'.$now_id,
  814. 'date'=>date('Y-m-d'),
  815. 'created_at'=>date('Y-m-d H:i:s'),
  816. 'updated_at'=>date('Y-m-d H:i:s')
  817. ]);
  818. $user = UserService::getById($uid);
  819. Redis::hset('crm:out_guide_exposure_user',$user->openid,$uid);
  820. }else{
  821. DB::table('ad_pdd')->insert([
  822. 'uid'=>$uid,
  823. 'img'=>'GUIDE_PERSONAL_ACCOUNT_'.$now_id,
  824. 'date'=>date('Y-m-d'),
  825. 'created_at'=>date('Y-m-d H:i:s'),
  826. 'updated_at'=>date('Y-m-d H:i:s')
  827. ]);
  828. }
  829. }
  830. $name = '';
  831. $name_info = DB::table('personal_account_list')->where('id',$now_id)->select('name')->first();
  832. if($name_info){
  833. $name = $name_info->name;
  834. }
  835. /*if(in_array($channel_id,explode(',',redisEnv('GUIDE_PERSONAL_ACCOUNT_WEID_SITES')))){
  836. $imgs = redisEnv('GUIDE_PERSONAL_ACCOUNT_WEID_QRCODE',[]);
  837. if($imgs) $imgs = json_decode($imgs,1);
  838. $page = 'jump.guidePersonalAccount';
  839. }else{
  840. $imgs = redisEnv('GUIDE_PERSONAL_ACCOUNT_OURS_QRCODE',[]);
  841. if($imgs) $imgs = json_decode($imgs,1);
  842. $page = 'jump.guidePersonalAccountOurs';
  843. }*/
  844. $page = 'jump.guidePersonalAccountOurs';
  845. $time = strtotime(date('Y-m-d',time()+86400))-time();
  846. Cookie::queue('crm_person_img', $img,$time);
  847. Cookie::queue('crm_person_name', $name,$time);
  848. //$page = 'jump.guidePersonalAccount';
  849. //$img = collect($imgs)->random();
  850. return view($page,['img'=>$img,'name'=>$name,'fee'=>$fee]);
  851. }
  852. public function r(Request $request,$number){
  853. switch ($number){
  854. case 1:
  855. //首页
  856. break;
  857. case 2:
  858. //阅读器
  859. break;
  860. case 3:
  861. //阅读器
  862. break;
  863. case 4:
  864. //个人中心
  865. break;
  866. case 5:
  867. //最近阅读
  868. break;
  869. case 6:
  870. }
  871. }
  872. public function freeCurrencyViewForTransfer(Request $request){
  873. $openid = $request->get('openid');
  874. //授权
  875. $params = $request->except('_url');
  876. if(empty($openid)){
  877. //$url = str_replace('http://', env('PROTOCOL') . '://', url()->current() . '?' . http_build_query($params));
  878. $url = url()->current() . '?' . http_build_query($params);
  879. $params['redirect_url'] = urlencode($url);
  880. $app = new Application($this->auth($params));
  881. return $app->oauth->redirect();
  882. }
  883. $crm = $request->get('crm','treward');
  884. $source = $request->get('wx','none');
  885. $fee = 500;
  886. $type = 'TCRM';
  887. $this->stats('treward_500',$crm);
  888. $crm_transfer_uid_bind = DB::table('crm_transfer')->where('openid',$openid)->first();
  889. if($crm_transfer_uid_bind) {
  890. $user = User::where('id',$crm_transfer_uid_bind->to_uid)->select('id','distribution_channel_id')->first();
  891. $uid = $crm_transfer_uid_bind->to_uid;
  892. $distribution_channel_id = 5204;
  893. }else{
  894. list($ouid,$distribution_channel_id) = $this->getUsersV3($openid);
  895. $user = $this->createUser($openid,$openid,5204,0,'');
  896. $uid = $user->id;
  897. $distribution_channel_id = 5204;
  898. UserService::transfer($ouid,$uid,5204);
  899. $insert_data = ['uid'=>$uid,'openid'=>$openid ,'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')];
  900. DB::table('friend_link_uid_bind')->insert($insert_data);
  901. }
  902. if(!$uid) return redirect()->to($this->getLink($distribution_channel_id).'?'.http_build_query($params));
  903. $this->statsDetail($uid,'treward',0);
  904. $get_free_currency = UserBindHkWelfareService::isHasGet($uid);
  905. if($get_free_currency){
  906. //已经领过
  907. $link = $this->getLink($distribution_channel_id).'recent?'.http_build_query($params);
  908. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>1,'uid'=>$uid,'source'=>$source]);
  909. }else{
  910. $link = $this->getLink($distribution_channel_id).'recent?'.http_build_query($params);
  911. $this->getReward($uid,$fee,$source,$type);
  912. return view('jump.bindHkFreeCurrency',['fee'=>$fee,'url'=>$link,'is_get'=>0,'uid'=>$uid,'source'=>$source]);
  913. }
  914. }
  915. private function createUser($openid,$unionid,$distribution_channel_id,$send_order_id,$ip){
  916. $user = UserService::getUserByOpenidAndChannelId($openid,$distribution_channel_id);
  917. if($user){
  918. return $user;
  919. }
  920. $user = null;
  921. try{
  922. $user = UserService::addUser(
  923. ['openid' => $openid,
  924. 'unionid' => $unionid,
  925. 'distribution_channel_id' =>$distribution_channel_id,
  926. 'send_order_id'=>$send_order_id,
  927. 'is_new'=>1,
  928. 'register_ip'=>$ip
  929. ]);
  930. }catch (\Exception $e){
  931. myLog('user-error')->info($e);
  932. }
  933. // 注册动作
  934. $action_type = 'Register';
  935. $param = [
  936. 'openid' => $openid,
  937. 'uid' => isset($user->id)?$user->id:'0',
  938. ];
  939. UserService::PushUserActionToQueue($action_type,$distribution_channel_id,$param);
  940. return $user;
  941. }
  942. }